运行 多个 Gitlab CI 作业并行,但手动
Run multiple Gitlab CI jobs in parallel, but manually
我想在 Gitlab CI 中并行 运行 两个作业,但我想手动启动它们。
基本上我有多个工作需要将我的代码部署到暂存(构建服务器,构建前端)。我想通过单击一个按钮(因此使作业手动)部署到暂存,但我希望它们同时并行(更快)运行。我不希望这两个作业都是手动的,因为它在 Gitlab UI 中显示两个按钮,而有人只能部署一个部分。
我尝试创建第三个空作业,它将是手动的,并在空作业完成后自动部署真正的作业 运行。然而,即使是只有“回声”的空工作也需要超过 30 秒,我觉得这很愚蠢。这是我目前无法说服我的解决方案:
start-release:
stage: build-and-deploy-to-staging
rules:
- when: manual
script:
- echo "Starting staging deployment"
release-api-staging:
stage: build-and-deploy-to-staging
script:
- "ENV_NAME=staging STEP=release_api release/deploy.sh"
when: on_success
needs:
["start-release-staging"]
release-frontend-staging:
stage: build-and-deploy-to-staging
script:
- "ENV_NAME=staging STEP=release_frontend release/deploy.sh"
when: on_success
needs:
["start-release-staging"]
你知道我该怎么做吗?
非常感谢!
根据评论跟进,如果您运行正在使用自己的 Runner,您可以检查 Runner 的拉取策略。有一些值可以告诉 Runner 在尝试为作业找到 Docker 图像时该怎么做。
第一个选项是always
,这意味着不查找任何本地图像,并在每次 Runner 处理作业时从可用存储库中拉取。
第二个是 if-not-present
,它指示 Runner 使用本地图像(如果存在),否则从可用存储库中拉取。
最后一个是 never
,这意味着永远不要从可用的存储库中拉取并且只在本地查看。在这种情况下,如果图像在本地不可用,则使用该图像的任何作业都将失败。
了解这一点,如果您可以在 Runner 主机上维护可用图像,将拉取策略更改为 if-not-present
甚至 never
,可以大大加快您的管道。
可以加快不需要任何特定软件的工作的另一个因素是尽可能使用仍然满足任何要求的最小图像。对于您的示例 .yml
文件,如果您要使用 alpine
之类的图像,则拉取图像会快得多,因为它比其他图像小得多(图像的描述声称它小于 5mb)。
至于管道本身,如果您在同一阶段定义两个作业,使用相同的 dependencies/needs,并将它们都标记为手动,管道上的阶段标签上方将有一个按钮同时查看 运行 那个阶段的所有手动作业(只要有足够的 运行 人)。
job1:
stage: x
when: manual
script:
- ../do_something.sh
job2:
stage: x
when: manual
...
如果一个阶段中的所有作业都是手动的,您可以使用阶段的 'play' 按钮一次启动它们。
否则,您可以像问题中那样定义它,但第一份工作需要处于不同的阶段。根据文档,needs
关键字仅在“需要”的工作处于另一个阶段时才有效。
stages:
- kickoff_build_and_deploy
- build_and_deploy
kickoff_job:
when: manual
image: alpine:latest
script:
- echo '' > /dev/null
build_deploy1:
needs: ['kickoff_job']
script:
- ./do_something.sh
build_deploy2:
needs: ['kickoff_job']
script:
- ./do_something.sh
在此示例中,build_deploy* 作业将在 kickoff_job
完成且 运行 有空时立即 运行。
我想在 Gitlab CI 中并行 运行 两个作业,但我想手动启动它们。 基本上我有多个工作需要将我的代码部署到暂存(构建服务器,构建前端)。我想通过单击一个按钮(因此使作业手动)部署到暂存,但我希望它们同时并行(更快)运行。我不希望这两个作业都是手动的,因为它在 Gitlab UI 中显示两个按钮,而有人只能部署一个部分。
我尝试创建第三个空作业,它将是手动的,并在空作业完成后自动部署真正的作业 运行。然而,即使是只有“回声”的空工作也需要超过 30 秒,我觉得这很愚蠢。这是我目前无法说服我的解决方案:
start-release:
stage: build-and-deploy-to-staging
rules:
- when: manual
script:
- echo "Starting staging deployment"
release-api-staging:
stage: build-and-deploy-to-staging
script:
- "ENV_NAME=staging STEP=release_api release/deploy.sh"
when: on_success
needs:
["start-release-staging"]
release-frontend-staging:
stage: build-and-deploy-to-staging
script:
- "ENV_NAME=staging STEP=release_frontend release/deploy.sh"
when: on_success
needs:
["start-release-staging"]
你知道我该怎么做吗?
非常感谢!
根据评论跟进,如果您运行正在使用自己的 Runner,您可以检查 Runner 的拉取策略。有一些值可以告诉 Runner 在尝试为作业找到 Docker 图像时该怎么做。
第一个选项是always
,这意味着不查找任何本地图像,并在每次 Runner 处理作业时从可用存储库中拉取。
第二个是 if-not-present
,它指示 Runner 使用本地图像(如果存在),否则从可用存储库中拉取。
最后一个是 never
,这意味着永远不要从可用的存储库中拉取并且只在本地查看。在这种情况下,如果图像在本地不可用,则使用该图像的任何作业都将失败。
了解这一点,如果您可以在 Runner 主机上维护可用图像,将拉取策略更改为 if-not-present
甚至 never
,可以大大加快您的管道。
可以加快不需要任何特定软件的工作的另一个因素是尽可能使用仍然满足任何要求的最小图像。对于您的示例 .yml
文件,如果您要使用 alpine
之类的图像,则拉取图像会快得多,因为它比其他图像小得多(图像的描述声称它小于 5mb)。
至于管道本身,如果您在同一阶段定义两个作业,使用相同的 dependencies/needs,并将它们都标记为手动,管道上的阶段标签上方将有一个按钮同时查看 运行 那个阶段的所有手动作业(只要有足够的 运行 人)。
job1:
stage: x
when: manual
script:
- ../do_something.sh
job2:
stage: x
when: manual
...
如果一个阶段中的所有作业都是手动的,您可以使用阶段的 'play' 按钮一次启动它们。
否则,您可以像问题中那样定义它,但第一份工作需要处于不同的阶段。根据文档,needs
关键字仅在“需要”的工作处于另一个阶段时才有效。
stages:
- kickoff_build_and_deploy
- build_and_deploy
kickoff_job:
when: manual
image: alpine:latest
script:
- echo '' > /dev/null
build_deploy1:
needs: ['kickoff_job']
script:
- ./do_something.sh
build_deploy2:
needs: ['kickoff_job']
script:
- ./do_something.sh
在此示例中,build_deploy* 作业将在 kickoff_job
完成且 运行 有空时立即 运行。