gpt4 book ai didi

continuous-integration - 触发分支属性的可变扩展阻止下游管道的创建

转载 作者:行者123 更新时间:2023-12-04 11:26:50 26 4
gpt4 key购买 nike

触发器属性的分支属性使用变量的分支作业将始终失败,原因是:无法创建下游管道。

重现步骤

  • 使用 trigger 设置下游管道像往常一样的属性(property)。
  • 添加 branch属性到触发器属性。在下游存储库中写入现有分支的名称,例如 master/main或功能分支的名称。
  • 运行管道,观察下游管道创建成功。
  • 现在更改 branch使用变量代替的属性,例如 branch: $CI_TARGET_BRANCH .
  • 手动运行 CI 管道,通过 GitLab GUI 设置变量。
  • 作业将立即失败,原因是:无法创建下游管道。

  • 代码示例

    目标是创建一个 GitLab CI 配置来运行指定下游分支的管道。尝试使用变量执行此操作时会出现该错误。

    这有效,像正常一样创建下游管道。但是分支名称是硬编码的:

    stages:
    - deploy

    deploy:
    variables:
    environment: dev
    stage: deploy
    trigger:
    project: group/project
    branch: foo
    strategy: depend

    这不起作用;虽然 TARGET_BRANCH设置成功,作业失败,因为下游管道无法创建:

    stages:
    - removeme
    - deploy

    before_script:

    - if [ -z "$TARGET_BRANCH" ]; then TARGET_BRANCH="main"; fi
    - echo $TARGET_BRANCH

    test_variable:
    stage: removeme
    script:
    - echo $TARGET_BRANCH

    deploy:
    variables:
    environment: dev
    stage: deploy
    trigger:
    project: group/project
    branch: $TARGET_BRANCH
    strategy: depend

    如果你知道我做错了什么,或者你有一些可以与分支属性的变量扩展一起工作的东西,请分享它(连同你的 GitLab 版本)。也欢迎其他解决方案,但这个解决方案似乎应该有效。

    发生错误的 GitLab 版本

    自托管 GitLab 社区版 12.10.7

    当前的错误行为是什么?

    作业总是失败的原因:无法创建下游管道。

    什么是预期的正确行为?
    branch属性应设置为变量的值,下游管道应正常创建,就像您只是硬编码/键入分支的名称一样。

    更多细节
  • v12.4 中添加了在触发器分支属性中使用变量扩展的功能,和 it's explicitly mentioned in the docs .
  • 我搜索了其他 .gitlab-ci.yml/GitLab 配置文件。每一个试图在分支属性中使用变量扩展的人都将其注释掉,说它因未知原因而被窃听( example
  • 我一直无法找到一个存储库,其中有人声称有 branch 的工作变量扩展触发器属性的属性。
  • 不幸的是,替代解决方案要么(a)将每个下游分支名称硬编码到上游项目的 GitLab CI 配置中,要么(b)在没有首先将它们提交给 master 之前无法测试对下游 GitLab CI 配置的更改。/main ,或必须use only / except .


  • TL;博士 : 如何将变量的值用于桥接作业的分支属性?我当前的解决方案使作业失败并且未创建下游管道。

    最佳答案

    这是一个“按设计工作”,gitlab 将在即将发布的版本中改进。
    触发工作将非常弱 b/c 它不是在运行者上运行的完整工作。因此,大多数触发器配置需要硬编码。
    我使用直接 API 调用来触发下游作业,传递 CI_JOB_TOKEN 将上游作业链接到下游,就像触发器一样
    API 调用让您完全控制

    curl -X POST \
    -s \
    -F token=${CI_JOB_TOKEN} \
    -F "ref=${REF_NAME}" \
    -F "variables[STAGE]=${STAGE}" \
    "${CI_SERVER_URL}/api/v4/projects/${CI_PROJECT_ID}/trigger/pipeline"
    现在这不会等待并监视作业何时完成,因此如果您需要等待下游作业完成,则需要为此编码,
    此外,CI_JOB_TOKEN 不能用于获取下游作业的状态,因此您需要另一个 token 。
    - |

    DOWNSTREAM_RESULTS=$( curl --silent -X POST \
    -F token=${CI_JOB_TOKEN} \
    -F "ref=${DOWNSTREAM_PROJECT_REF}" \
    -F "variables[STAGE]=${STAGE}" \
    -F "variables[SLS_PACKAGE_PATH]=.serverless-${STAGE}" \
    -F "variables[INVOKE_SLS_TESTS]=false" \
    -F "variables[UPSTREAM_PROJECT_REF]=${CI_COMMIT_REF_NAME}" \
    -F "variables[INSTALL_SLS_PLUGINS]=${INSTALL_SLS_PLUGINS}" \
    -F "variables[PROJECT_ID]=${CI_PROJECT_ID}" \
    -F "variables[PROJECT_JOB_NAME]=${PROJECT_JOB_NAME}" \
    -F "variables[PROJECT_JOB_ID]=${PROJECT_JOB_ID}" \
    "${CI_SERVER_URL}/api/v4/projects/${DOWNSTREAM_PROJECT_ID}/trigger/pipeline" )
    echo ${DOWNSTREAM_RESULTS} | jq .
    DOWNSTREAM_PIPELINE_ID=$( echo ${DOWNSTREAM_RESULTS} | jq -r .id )
    echo "Monitoring Downstream pipeline ${DOWNSTREAM_PIPELINE_ID} status..."
    DOWNSTREAM_STATUS='running'
    COUNT=0
    PIPELINE_API_URL="${CI_SERVER_URL}/api/v4/projects/${DOWNSTREAM_PROJECT_ID}/pipelines/${DOWNSTREAM_PIPELINE_ID}"
    echo "Pipeline api endpoint => ${PIPELINE_API_URL}"
    while [ ${DOWNSTREAM_STATUS} == "running" ]
    do
    if [ $COUNT -eq 0 ]
    then
    echo "Starting loop"
    fi
    if [ ${COUNT} -ge 350 ]
    then
    echo 'TIMEOUT!'
    DOWNSTREAM_STATUS="TIMEOUT"
    break
    elif [ $(( ${COUNT} % 60 )) -eq 0 ]
    then
    echo "Downstream pipeline status => ${DOWNSTREAM_STATUS}"
    echo "Count => ${COUNT}"
    sleep 10
    else
    sleep 10
    fi
    DOWNSTREAM_CALL=$( curl --silent --header "PRIVATE-TOKEN: ${GITLAB_TOKEN}" ${PIPELINE_API_URL} )
    if [ $COUNT -eq 0 ]
    then
    echo ${DOWNSTREAM_CALL} | jq .
    fi
    DOWNSTREAM_STATUS=$( echo ${DOWNSTREAM_CALL} | jq -r .status )
    COUNT=$(( ${COUNT} + 1 ))

    done
    #pipeline status is running, failed, success, manual
    echo "PIPELINE STATUS => ${DOWNSTREAM_STATUS}"
    if [ ${DOWNSTREAM_STATUS} != "success" ]
    then
    exit 2
    fi

    关于continuous-integration - 触发分支属性的可变扩展阻止下游管道的创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62434020/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com