在GitLab项目之间触发跨项目触发器

60次阅读
没有评论

问题描述

用户在使用GitLab时遇到了一个问题,他希望在一个项目(称为项目A)中的一个作业能够触发另一个项目(称为项目B)中的一个作业。具体地说,他希望在项目A的一个作业中触发项目B的deploy:staging作业,但目前遇到了问题。

以下是项目A的.gitlab-ci.yml配置:

deploy:staging:
  image: alpine
  variables:
    GIT_STRATEGY: none
  script:
    - apk add --no-cache curl
    - curl -X POST -F "token=$CI_JOB_TOKEN" -F "ref=$CI_COMMIT_REF_NAME" https://gitlab.com/api/v4/projects/1234/trigger/pipeline

以下是项目B的.gitlab-ci.yml配置的一部分:

image: google/cloud-sdk
deploy:staging:
  only:
    - triggers
  script:
    - echo "$CI_ENVIRONMENT_SLUG"

然而,在运行项目A的作业时,使用curl命令得到了以下错误信息:

{"message":{"base":["Reference not found"]}}

用户尝试过将ref参数硬编码为master,但得到了另一条错误消息:

{"message":{"base":["No stages / jobs for this pipeline."]}}

用户希望了解如何配置项目A,以便能够在master分支上触发项目B中的deploy:staging作业。此外,用户计划在未来添加更多的部署目标,因此只希望触发deploy:staging作业。

解决方案

为了实现在项目A的作业中触发项目B的deploy:staging作业,需要对.gitlab-ci.yml配置进行一些调整。以下是两种解决方案:

注意:下面的操作涉及到GitLab的API调用和项目令牌,确保你具有足够的权限来执行这些操作。

解决方案1:使用正确的令牌和分支名

在项目A的.gitlab-ci.yml中,需要确保使用了正确的令牌和分支名来触发项目B的作业。这里我们假设你已经在项目B中创建了一个用于触发的令牌。

deploy:staging:
  image: alpine
  variables:
    GIT_STRATEGY: none
  script:
    - apk add --no-cache curl
    - curl -X POST -F "token=$PROJECT_B_TOKEN" -F "ref=master" https://gitlab.com/api/v4/projects/1234/trigger/pipeline

在上述配置中,将$CI_JOB_TOKEN替换为项目B中的令牌$PROJECT_B_TOKEN,并将ref参数设置为master,以触发项目B的deploy:staging作业。

解决方案2:使用带有变量的触发器

另一种方法是使用带有变量的触发器,在项目A的作业中定义触发器的参数,然后在项目B的作业中接收并使用这些参数。这样可以更灵活地控制触发器的行为。

首先,在项目B中创建一个带有变量的触发器。在项目B的CI/CD设置中,找到”Pipeline triggers”部分,创建一个触发器,并定义所需的变量,比如TARGET_BRANCH

然后,可以在项目A的作业中使用curl命令触发项目B的触发器,并传递变量。

deploy:staging:
  image: alpine
  variables:
    GIT_STRATEGY: none
  script:
    - apk add --no-cache curl
    - curl -X POST -F "token=$CI_JOB_TOKEN" -F "variables[TARGET_BRANCH]=master" https://gitlab.com/api/v4/projects/1234/trigger/pipeline

在项目B的作业中,可以使用接收到的变量来执行特定的操作。

deploy:staging:
  image: google/cloud-sdk
  only:
    - triggers
  script:
    - echo "Deploying to $TARGET_BRANCH"

通过这种方式,你可以更加灵活地控制触发器的行为,并在不同的情况下执行不同的操作。

总结

通过正确配置项目A的.gitlab-ci.yml文件,你可以实现在项目A的作业中触发项目B的deploy:staging作业。你可以选择直接传递令牌和分支名,或者使用带有变量的触发器来实现更灵活的控制。请确保在进行API调用和令牌传递时具备足够的权限。

正文完