【问题标题】:GitHub action: Repeat step with different environment valuesGitHub 操作:使用不同的环境值重复步骤
【发布时间】:2021-07-20 23:20:24
【问题描述】:

我刚刚创建了我的第一个 GitHub 操作工作流程,用于处理 Docker 图像。基本上是这样的:

name: My Name
on: workflow_dispatch

jobs:
  whatever:
    runs-on: ubuntu-latest
    steps:
      - env:
          TARGET_DOCKER_IMAGE: node
          TARGET_TAG: 14-alpine
        run: |
            # ... ca 20 lines of code which reference ${TARGET_DOCKER_IMAGE} and ${TARGET_TAG}
        

现在,我意识到我希望我的操作不仅仅针对 node:14-alpine 图像,还针对其他几个图像。当然,我希望避免复制和粘贴代码。所以,我基本上需要重复相同的步骤,但使用不同的env 值。我该怎么做?

【问题讨论】:

    标签: github-actions


    【解决方案1】:

    您可以使用matrix strategy 执行此操作。请在下面的例子中罚款,

    jobs:
      whatever:
        runs-on: ubuntu-latest
        strategy:
          matrix:
            TAG: [14-alpine, slim, buster, latest]
        steps:
          - env:
              TARGET_DOCKER_IMAGE: node
              TARGET_TAG: ${{ matrix.TAG }}
            run: |
                # ... ca 20 lines of code which reference ${TARGET_DOCKER_IMAGE} and ${TARGET_TAG}
    

    下面还有一个例子,推送到多个 ECR 存储库

    jobs:
      build-app:
      runs-on: ubuntu-latest
      strategy:
          matrix:
            Repo: [Repo1, Repo2, Repo3]
        steps:
        # see: https://github.com/aws-actions/configure-aws-credentials
        - name: Configure AWS Credentials
          uses: aws-actions/configure-aws-credentials@v1
          with:
            aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
            aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
            aws-region: us-east-1
    
        # see: https://github.com/aws-actions/amazon-ecr-login
        - name: Log in to Amazon ECR
          id: login-ecr
          uses: aws-actions/amazon-ecr-login@v1
    
        - name: Build, tag, and push image to Amazon ECR
          env:
            ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
            ECR_REPOSITORY:  ${{ matrix.Repo }}
            IMAGE_TAG: ${{ github.sha }}
          run: |
            docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
            docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
    

    【讨论】:

    • 在您的第一个示例中,您只是使用了TARGET_TAG 的矩阵。如果TARGET_DOCKER_IMAGETARGET_TAG 都被矩阵值填充会是什么样子?如何将它们组合在一起?
    • 所以,如果我们同时使用TARGET_TAGTARGET_DOCKER_IMAGE,它将创建4 个工作,yml TARGET_DOCKER_IMAGE 1 & TARGET_TAG 1 TARGET_DOCKER_IMAGE 1 & TARGET_TAG 2 TARGET_DOCKER_IMAGE 2 & TARGET_TAG 2 TARGET_DOCKER_IMAGE 2 & TARGET_TAG 1 下面是TAGTARGET_DOCKER_IMAGE 上矩阵的yaml 文件@yml strategy: matrix: TAG: [14-alpine, slim, buster, latest] TARGET_DOCKER_IMAGE: [node, circleci/node] steps: - env: TARGET_DOCKER_IMAGE: ${{ matrix.TARGET_DOCKER_IMAGE }} TARGET_TAG: ${{ matrix.TAG }}
    猜你喜欢
    • 2022-01-19
    • 2020-03-29
    • 2021-12-28
    • 2021-06-15
    • 2020-12-15
    • 1970-01-01
    • 2023-04-03
    • 2022-12-25
    • 2021-03-01
    相关资源
    最近更新 更多