将 GitHub Actions 作业的变量共享到多个后续作业,同时保留特定顺序

jon*_*ckt 1 github github-actions

我们的GitHub Actions 工作流程由 3 个作业组成:

  1. provision-eks-with-pulumi:配置AWS EKS集群(此处使用Pulumi)
  2. install-and-run-argocd-on-ekskubeconfig:使用作业1安装和配置 ArgoCD 。
  3. install-and-run-tekton-on-ekskubeconfig:使用作业1安装和运行 Tekton ,但取决于作业 2。

我们已经知道这个答案文档,并使用它jobs.<jobs_id>.outputs来定义作业 1 中的变量,并jobs.<job_id>.needs.在后续作业中使用该变量。但它只适用于我们的工作 2. - 但对工作 3 失败.. 这是我们的工作流程.yml:

name: provision

on: [push]

env:
  AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
  AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
  AWS_DEFAULT_REGION: 'eu-central-1'

jobs:
  provision-eks-with-pulumi:
    runs-on: ubuntu-latest
    env:
      PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }}
    outputs:
      kubeconfig: ${{ steps.pulumi-up.outputs.kubeconfig }}
    steps:
      ...

      - name: Provision AWS EKS cluster with Pulumi
        id: pulumi-up
        run: |
          pulumi stack select dev
          pulumi up --yes

          echo "Create ~/.kube dir only, if not already existent (see /sf/answers/55570721/)"
          mkdir -p ~/.kube

          echo "Create kubeconfig and supply it for depending Action jobs"
          pulumi stack output kubeconfig > ~/.kube/config
          echo "::set-output name=kubeconfig::$(pulumi stack output kubeconfig)"

      - name: Try to connect to our EKS cluster using kubectl
        run: kubectl get nodes

  install-and-run-argocd-on-eks:
    runs-on: ubuntu-latest
    needs: provision-eks-with-pulumi
    environment:
      name: argocd-dashboard
      url: ${{ steps.dashboard-expose.outputs.dashboard_host }}
    steps:
      - name: Checkout
        uses: actions/checkout@master

      - name: Configure kubeconfig to use with kubectl from provisioning job
        run: |
          mkdir ~/.kube
          echo '${{ needs.provision-eks-with-pulumi.outputs.kubeconfig }}' > ~/.kube/config
          echo "--- Checking connectivity to cluster"
          kubectl get nodes

      - name: Install ArgoCD
        run: ...


  install-and-run-tekton-on-eks:
    runs-on: ubuntu-latest
    needs: install-and-run-argocd-on-eks
    environment:
      name: tekton-dashboard
      url: ${{ steps.dashboard-expose.outputs.dashboard_host }}
    steps:
      - name: Checkout
        uses: actions/checkout@master

      - name: Configure kubeconfig to use with kubectl from provisioning job
        run: |
          mkdir ~/.kube
          echo '${{ needs.provision-eks-with-pulumi.outputs.kubeconfig }}' > ~/.kube/config
          echo "--- Checking connectivity to cluster"
          kubectl get nodes

      - name: Install Tekton Pipelines, Dashboard, Triggers
        run: ...
Run Code Online (Sandbox Code Playgroud)

第一个作业得到了kubeconfig正确的使用needs.provision-eks-with-pulumi.outputs.kubeconfig- 但第二个作业却没有(请参阅此 GitHub Actions 日志)。我们也不希望我们的 3. 作业仅依赖于作业 1.,因为这样作业 2. 和 3. 将并行运行。

我们的作业 3. 如何在作业 2. 之后运行 - 但使用kubeconfig作业 1. 中的变量?

jon*_*ckt 5

这很简单,因为GitHub Actions 作业可以依赖于使用needs关键字的多个作业。在作业 3. 中,您所要做的就是使用数组表示法,例如needs: [job1, job2].

因此,对于您的工作流程,它将如下所示:

name: provision

on: [push]

env:
  AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
  AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
  AWS_DEFAULT_REGION: 'eu-central-1'

jobs:
  provision-eks-with-pulumi:
    runs-on: ubuntu-latest
    env:
      PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }}
    outputs:
      kubeconfig: ${{ steps.pulumi-up.outputs.kubeconfig }}
    steps:
      ...

      - name: Provision AWS EKS cluster with Pulumi
        id: pulumi-up
        run: |
          pulumi stack select dev
          pulumi up --yes

          echo "Create ~/.kube dir only, if not already existent (see /sf/answers/55570721/)"
          mkdir -p ~/.kube

          echo "Create kubeconfig and supply it for depending Action jobs"
          pulumi stack output kubeconfig > ~/.kube/config
          echo "::set-output name=kubeconfig::$(pulumi stack output kubeconfig)"

      - name: Try to connect to our EKS cluster using kubectl
        run: kubectl get nodes

  install-and-run-argocd-on-eks:
    runs-on: ubuntu-latest
    needs: provision-eks-with-pulumi
    env:
      name: argocd-dashboard
      url: ${{ steps.dashboard-expose.outputs.dashboard_host }}
    steps:
      - name: Checkout
        uses: actions/checkout@master

      - name: Configure kubeconfig to use with kubectl from provisioning job
        run: |
          mkdir ~/.kube
          echo '${{ needs.provision-eks-with-pulumi.outputs.kubeconfig }}' > ~/.kube/config
          echo "--- Checking connectivity to cluster"
          kubectl get nodes

      - name: Install ArgoCD
        run: ...


  install-and-run-tekton-on-eks:
    runs-on: ubuntu-latest
    needs: [provision-eks-with-pulumi, install-and-run-argocd-on-eks]
    env:
      name: tekton-dashboard
      url: ${{ steps.dashboard-expose.outputs.dashboard_host }}
    steps:
      - name: Checkout
        uses: actions/checkout@master

      - name: Configure kubeconfig to use with kubectl from provisioning job
        run: |
          mkdir ~/.kube
          echo '${{ needs.provision-eks-with-pulumi.outputs.kubeconfig }}' > ~/.kube/config
          echo "--- Checking connectivity to cluster"
          kubectl get nodes

      - name: Install Tekton Pipelines, Dashboard, Triggers
        run: ...
Run Code Online (Sandbox Code Playgroud)