はじめに
GitHub Actionsのワークフローが実行されると自動でGitHub内にログが保存されます。ただ、保持できる期間が決まっているためログを別のストレージに保存するための設定をします。
なお今回はストレージにS3を採用しています。
検証
まずはログを取得する対象のワークフローを作成します。何でもよいので以下のようにしました。
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から取得できる
- https://api.github.com/repos/<リポジトリ名>/actions/runs/<ワークフローID>/logs
- <ワークフロー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ごとになっており、同じワークフロー内からログを取得しようとするとファイルの中身がおかしくなります。
最後までお読みいただきありがとうございました。
参考
- 順番にWorkflowを実行する方法
- GitHub ActionsのログをCLIで取得する方法
- ログの保持期間