在 Github Actions 中使用相同的作业来定位不同的环境

问题描述 投票:0回答:1

我是 Github Actions 的新手,有些东西我无法理解。来自 Bamboo 和 GitLab 的所有环境变量都立即链接到 CI 的环境。尽管如此,在 GitHub Actions 中,每个环境您需要有 1 个作业。

这是一个简单的例子。 defined env variables in github actions for each env

我的工作流程如何开始:

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/ 这是最好的吗解决方案?

编辑:上面使用可重用矩阵的解决方案不起作用。它启动两个部署,但也不解决与环境相关的秘密。

github-actions
1个回答
1
投票

使用可重用的工作流程并在主工作流程中调用它。为此,您需要为每个环境制定一个工作流程。在您的情况下,是主控、发布和开发工作流程。

示例:

可重复使用的工作流程文件:

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 机密。

你觉得怎么样?

© www.soinside.com 2019 - 2024. All rights reserved.