0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

実行したGitHub Actionsのワークフローログを取得したい

Posted at

はじめに

GitHub Actionsのワークフローが実行されると自動でGitHub内にログが保存されます。ただ、保持できる期間が決まっているためログを別のストレージに保存するための設定をします。

なお今回はストレージにS3を採用しています。

検証

全体像はこちらです。
githubactions-log.png

まずはログを取得する対象のワークフローを作成します。何でもよいので以下のようにしました。

name: Target Log Workflow

on:
  workflow_dispatch:

jobs:
  first:
    runs-on: ubuntu-latest
    permissions:
      actions: write
    steps:
      - run: echo "test workflow successfully finished!"

次に本題のログを取得するためのワークフローを作成します。
以下に注意して実装します。

  • ワークフローが完了するとworkflow_runが発行される
  • ワークフローのログは決まったURLから取得できる
  • <ワークフローID>はGitHub Actionsの変数から取得できる
    • ${{ github.event.workflow_run.id }}

最終的に実装したワークフローは以下のようになっています。

name: Upload Logs

on:
  workflow_dispatch:
  workflow_run:
    workflows: 
      - "Target Log Workflow"
    types: 
      - "completed"

jobs:
  second:
    runs-on: ubuntu-latest
    permissions:
      actions: read
    steps:

      # S3にアップロードするために対象のロールを設定(事前にassume roleの設定が必要)
      # Access keyの設定でも可能
      - name: Setup AWS Credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: ${{ vars.AWS_ROLE_ARN }}
          aws-region: ${{ vars.TARGET_REGION }}

      # ワークフローのログを$log_file_nameで保存
      - name: Download the Workflow Log
        run: |
          workflow_id=${{ github.event.workflow_run.id }}
          log_prefix=$(date +"%Y%m%d%H%M%S")
          log_file_name=${log_prefix}_logs.zip

          # Download logs using GitHub API
          curl -H "Authorization: token $GITHUB_TOKEN" \
               -L \
               "https://api.github.com/repos/${{ github.repository }}/actions/runs/$workflow_id/logs" \
               --output $log_file_name
          
          # pass the log file name to the next step
          echo "LOG_FILE_NAME=$log_file_name" >> $GITHUB_ENV

      # 取得したログをS3にアップロード
      - name: Upload the Log to S3
        run: |
          echo "Uploading $LOG_FILE_NAME to S3 bucket: ${{ vars.LOG_TARGET_S3 }}"
          aws s3 cp $LOG_FILE_NAME "s3://${{ vars.LOG_TARGET_S3 }}/github_actions/$LOG_FILE_NAME"

それぞれを実装することで対象のワークフローのログを取得できるようになっているはずです!

おわりに

今回の記事では1つのワークフローに対するログ取得を実装しました。その場合、対象を複数にする場合には workflows で指定するワークフローを変数化してあげるとよさそうです。ちなみにログの取得できる単位はWorkflowごとになっており、同じワークフロー内からログを取得しようとするとファイルの中身がおかしくなります。

最後までお読みいただきありがとうございました。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?