😄

[Github]: Github Actionsで後続のJobにOutputの値を渡す

に公開

[Github]: Github Actionsで後続のJobにOutputの値を渡す

Github Actionsのワークフロー内に二つの独立したJob1, Job2間でGITHUB_OUTPUTの参照する方法に苦戦したのでメモ

前提

  • 二つの独立したJob1, Job2のワークフローがあり、Job1で処理で取得した文字列を設定する
  • Job2ではそのJob1がGITHUB_OUTPUTに保存した文字列を取得し、処理に使用する

発生したこと

  • Job2で参照したJob1の文字列に何もない状態になる。

具体的なコード

コードは書きのようにTerraformでリソースを構築し、その構築したリソース(EC2)のパブリックIPアドレスとパブリックDNS名を変数として保存し、後続のansibleワークフローで使用するというもの
得た変数はansibleワークフローでinventoryファイルを作成するのに使用される

deploy:
  ############ 省略 ############
  steps:
    - name: Checkout
      uses: actions/checkout@v4

      ############ 省略 ############

    - name: Terraform apply
      id: apply
      run: terraform apply -auto-approve

    - name: Get Terraform Outputs
      id: output
      run: |
        echo "public_dns=$(terraform output -raw ec2_public_dns)" >> $GITHUB_OUTPUT
        echo "public_ip=$(terraform output -raw ec2_public_ip)" >> $GITHUB_OUTPUT

  ansible:
    ############ 省略 ############
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        
      ############ 省略 ############

      - name: インベントリファイルの作成
        run:  |
          echo "[amazon]" > inventory
          echo "amazon ansible_host=${{ public_ip }} ansible_python_interpreter=/usr/bin/python3.9" >> inventory
          echo "[amazon:vars]" >> inventory
          echo "ansible_ssh_common_args='-o StrictHostKeyChecking=no'" >> inventory

      ############ 省略 ############

原因

調べたらドキュメントに書いてあったが、ジョブ1でoutputs構文を使用すると後続のジョブに渡すことができる。
outputsセクションをstepsと同じ階層に定義し、steps.ステップ名.outputs.変数名とすることで他ジョブに渡すことができる。

また使用するジョブで使用する場合、needs.ジョブ名.outputs.変数名と指定することで変数が取得できる。

deploy:  
  ############ 省略 ############

  outputs:
    ec2_dns: ${{ steps.output.outputs.public_dns }}
    ec2_ip: ${{ steps.output.outputs.public_ip }}

ansible:
  ############ 省略 ############
  steps:
    ############ 省略 ############
      
    - name: インベントリファイルの作成
      run:  |
        echo "[amazon]" > inventory
        echo "amazon ansible_host=${{ needs.deploy.outputs.ec2_ip }} ansible_python_interpreter=/usr/bin/python3.9" >> inventory
        echo "[amazon:vars]" >> inventory
        echo "ansible_ssh_common_args='-o StrictHostKeyChecking=no'" >> inventory

最後に

間違っていることがあれば、コメントに書いていただけると幸いです。
よろしくお願いいたします。

GitHubで編集を提案

Discussion