在GitLab CI中手动指定子流程的变量怎么做

72次阅读
没有评论

问题描述

在GitLab CI中希望手动指定子流程(downstream pipeline)的变量。目前他的gitlab-ci.yml文件如下:

stages:
  - Build
  - Deploy

Deploy:
  stage: Deploy
  when: manual
  trigger: services/service1
  variables:
    BUILD_NAME: "${BUILD_NAME}"

然而,他发现无法打开“Specifying variables”屏幕。他想知道如何在手动触发的Deploy任务中指定变量,类似于这种格式:GitLab文档链接

解决方案

请注意以下操作注意版本差异及修改前做好备份。

使用rules来指定变量

从你的描述中,我们可以看到你希望在手动触发的Deploy任务中传递变量。根据GitLab文档,目前(截止到我的知识更新截止日为止)variables关键字无法直接在when: manual的情况下使用。但你可以使用rules来实现类似的效果。

以下是修改后的gitlab-ci.yml文件示例:

stages:
  - Build
  - Deploy

Deploy:
  stage: Deploy
  when: manual
  trigger: services/service1
  rules:
    - exists:
        - "${CI_JOB_MANUAL}"
  variables:
    BUILD_NAME: "${BUILD_NAME}"

在这个示例中,我们使用了rules来检查环境变量${CI_JOB_MANUAL}是否存在,从而判断是否需要传递变量。如果任务是手动触发的,${CI_JOB_MANUAL}将存在,因此变量将被传递到子流程中。

使用Pipeline API传递变量

另一种方法是使用GitLab的Pipeline API来手动触发子流程并传递变量。你可以使用curl等工具来执行API请求。

以下是一个示例的API请求,用于手动触发子流程并传递变量:

#!/bin/bash

# 设置你的GitLab访问令牌
GITLAB_TOKEN="your_access_token"

# 设置GitLab项目ID和子流程名称
PROJECT_ID="your_project_id"
PIPELINE_NAME="deploy"

# 设置需要传递的变量
BUILD_NAME="your_build_name"

# 执行API请求
curl --request POST "https://gitlab.com/api/v4/projects/${PROJECT_ID}/pipeline" \
--header "Authorization: Bearer ${GITLAB_TOKEN}" \
--form "ref=main" \
--form "variables[CI_JOB_MANUAL]=true" \
--form "variables[BUILD_NAME]=${BUILD_NAME}" \
--form "trigger=child-pipeline:${PIPELINE_NAME}"

在这个示例中,我们通过API请求手动触发了一个子流程,并通过variables参数传递了需要的变量。

请根据你的具体需求选择适合你情况的方法来指定子流程的变量。

请注意,GitLab的功能可能随着时间而变化,以上解决方案适用于我知道的截止日期。建议在实施之前查阅最新的GitLab文档或官方资源,以确保你使用的方法是最适合的。

总结

在GitLab CI中,通过使用rules或Pipeline API,你可以在手动触发的子流程中传递变量。这些方法能够帮助你实现你的需求,确保变量在子流程中正确传递和使用。根据你的项目需求和GitLab版本,你可以选择适合你的方法来解决这个问题。

正文完