有没有办法动态选择作业是否在 Gitlab CI 管道中运行?

问题描述 投票:0回答:2

我正在尝试让一项作业检查配置文件中是否存在单词,并确定后续触发作业是否发生...

像这样...

stages:
   - check
   - trigger_pipeline

variables:
   - TRIGGER_JOB : "0"
   - CONFIG_FILE : "default.json"

check:
    stage: check
    script:
        - |
            if grep -q keyword "$CONFIG_FILE"; then
                TRIGGER_JOB="1"
            fi
        - echo "TRIGGER_JOB=${TRIGGER_JOB}" >> variables.env
    artifacts:
        reports:
            dotenv: "variables.env"

trigger_pipeline:
    stage: trigger_pipeline
    rules:
        - if: '$TRIGGER_JOB == "1"'
    trigger:
        project: downstream/project
        branch: staging
        strategy: depend
    needs: ["check"]

似乎我已经达到了 GitLab 的限制,因为

trigger_pipeline
作业甚至没有被创建,因为管道是用
TRIGGER_JOB: "0"
初始化的,所以我做这个检查并不重要如果找到关键字,稍后触发管道。

有没有办法动态决定是否创建这个

trigger_pipeline
作业?

我会将其全部放在一项作业中,并通过 API 触发下游管道,但是当然,我不能依赖于下游状态,这也是我想要的(并且在触发时不可能做到)通过我在文档中找到的所有内容中的 API)。

如有任何建议,我们将不胜感激。谢谢!

gitlab gitlab-ci gitlab-ci-runner gitlab-api
2个回答
2
投票

与您所描述的最接近的是动态子管道。这将允许您在一项作业中动态创建管道配置,然后运行它。

generate-config:
  stage: build
  script: generate-ci-config > generated-config.yml
  artifacts:
    paths:
      - generated-config.yml


child-pipeline:
  stage: test
  trigger:
    include:
      - artifact: generated-config.yml
        job: generate-config

0
投票

有一种方法可以动态选择是否执行gitlab作业

根据您的情况应用以下配置

stages:
   - trigger_pipeline
   - check

variables:
   - CONFIG_FILE : "default.json"

check:
    stage: check
    script:
        - |
            if grep -q keyword "$CONFIG_FILE"; then
              curl -s --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/pipelines/$CI_PIPELINE_ID/jobs" | jq '.[]'
              JOB_ID=$(curl -s --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/pipelines/$CI_PIPELINE_ID/jobs" | jq '.[] | select(.name=="child-pipeline") | .id')
              curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/jobs/$JOB_ID/play"
            fi

trigger_pipeline:
    stage: trigger_pipeline
    trigger:
        project: downstream/project
        branch: staging
        strategy: depend
    when: manual

背后的逻辑是您配置目标作业,在您的情况下

trigger_pipeline
manual

更改阶段顺序,以便首先设置您的目标作业

那么如果您的逻辑在您的情况下评估为

true

grep -q keyword "$CONFIG_FILE"

然后检查作业基本上执行目标作业。首先识别目标

job id
,最后通过调用Gitlab API的
play
端点来执行

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.