我是 Github Actions 的新手,有些东西我无法理解。来自 Bamboo 和 GitLab 的所有环境变量都立即链接到 CI 的环境。尽管如此,在 GitHub Actions 中,每个环境您需要有 1 个作业。
我的工作流程如何开始:
name: Build & Deploy
on:
push:
branches:
- master
- release
- dev
jobs:
build:
[...]
deploy:
run: |
echo ${{ vars.CLUSTER_URL }}
现在 vars.CLUSTER_URL 无法解析。我可以通过将这一行添加到部署作业来使其工作:
environment: dev
但这意味着我必须为每个环境重复这项工作。
deploy-dev:
environment: dev
run: |
echo ${{ vars.CLUSTER_URL }}
deploy-release:
environment: release
run: |
echo ${{ vars.CLUSTER_URL }}
deploy-prod:
environment: prod
run: |
echo ${{ vars.CLUSTER_URL }}
任何更改都必须进行3次。工作流程也会延长 3 倍...如果有一天我决定添加一个新环境,我就必须再次复制所有内容。或者可能有 3 个工作流程文件,每个环境一个。
我找到了通过添加此步骤更有效地做到这一点的方法:
- name: Determine environment
run: |
if [[ $BRANCH_NAME == 'refs/heads/release'* ]]; then
echo "Environment: release"
echo "::set-env name=ENVIRONMENT::release"
elif [[ $BRANCH_NAME == 'refs/heads/master' ]]; then
echo "Environment: master"
echo "::set-env name=ENVIRONMENT::master"
else
echo "Environment: dev"
echo "::set-env name=ENVIRONMENT::dev"
fi
但我仍然觉得对于这样的标准用途来说它太脏了。
这是 GithubActions 应该如何工作的吗?
我还有一个相关的附加问题。我想在构建过程中使用环境名称(或分支名称,它们是相同的)来标记我的 docker 映像。
- name: Build Docker image
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: (...):${{ github.ref }}-(...)
但这会解析为 refs/heads/env 而不是 env。由于我无法进行任何字符串操作,因此我必须放弃此操作并自己编写一个 docker build --tag XXX,在那里我可以运行一些 bash 来过滤掉 refs/heads。
这里建议通过使用可重用矩阵来解决此问题:https://limeii.github.io/2022/11/deploy-on-multiple-environment-with-github-actions/ 这是最好的吗解决方案?
编辑:上面使用可重用矩阵的解决方案不起作用。它启动两个部署,但也不解决与环境相关的秘密。
使用可重用的工作流程并在主工作流程中调用它。为此,您需要为每个环境制定一个工作流程。在您的情况下,是主控、发布和开发工作流程。
示例:
可重复使用的工作流程文件:
name: Reusable CI Workflow
on:
workflow_call:
inputs:
environment:
required: true
type: string
job-name:
name: Some job
environment: ${{ inputs.environment}}
runs-on: self-hosted
needs: something-else
您将在每个环境的主工作流程中使用可重用工作流程。
主要工作流程(开发示例):
name: Dev CI/CD Workflow
jobs:
some-job:
name: run the job
uses: ./.github/workflows/reusableWorkflow.yml
with:
environment: "development"
在示例中,我对值进行硬编码,但在您的情况下,您可能会使用 GitHub 机密。
你觉得怎么样?