Github Actionsのメモ

Merge pull request #3 from ...
をワークフロー内でgrepしたい
動作OK
grep -oE "Merge pull request \#[0-9]+"
なぜかよくわからない
#
はエスケープする
\d
でなくて[0-9]
を使う
クォートはシングル、ダブルどちらでも
NG
"#\d+"

pull requestを出すAPI
権限tokenはPATのclassicでrepoをfullに
Fine grained PATでそれっぽく設定してみたが、権限が足りないエラーが出た。

GithubActionsで試行錯誤しているとコミットが汚くなる。完成したら途中を消して整理すべきか。

$GITHUB_REPOSITORY : owner/repo

GitHub Actionsの各run
ステップは独自のシェルインスタンスで実行されます。これにより、あるrun
ステップで設定された環境変数は、次のrun
ステップで自動的には引き継がれません。したがって、Get PR numbers from diff
ステップで設定したPR_NUMBERS
変数は、Create PR
ステップで直接参照することはできません。
この問題を解決するためには、環境変数をジョブの他のステップで利用できるように、変数をジョブの環境変数としてエクスポートする必要があります。
以下はその方法を示す例です:
- name: Get PR numbers from diff
id: get-pr-numbers
run: |
PR_NUMBERS=$(git log --oneline origin/${{ env.BRANCH_SOURCE }}..origin/${{ env.BRANCH_TARGET }} | grep -oE 'Merge pull request #[0-9]+' | grep -oE '#[0-9]+' | sort -u)
echo "PR_NUMBERS=$PR_NUMBERS" >> $GITHUB_ENV
- name: Create PR
run: |
PR_TITLE="$(date +'%Y/%m/%d')更新"
PR_BODY="## 含まれるPR\n"
for pr in $PR_NUMBERS; do
PR_BODY="$PR_BODY- $pr\n"
done
# その後の処理...
上記の例では、Get PR numbers from diff
ステップでPR_NUMBERS
変数を設定した後、echo "PR_NUMBERS=$PR_NUMBERS" >> $GITHUB_ENV
を使用して変数をジョブの環境変数としてエクスポートしています。これにより、後続のステップでPR_NUMBERS
変数を参照できるようになります。

PAT(personal asscess token)を作る
自分のプロフィールのSetting
→左のメニューの一番下にあるDeveloper Settings
→Personal access tokens (classic)
GithubActionsで使えるようにする
===ChatGPT
GitHubのワークフローにPersonal Access Token(PAT)を設定する方法は以下の通りです:
-
PATの生成:
- GitHubのサイトで右上の自分のプロフィールアイコンをクリックして、
Settings
に移動します。 - 左側のメニューから
Developer settings
を選択。 -
Personal access tokens
をクリック。 -
Generate new token
ボタンをクリック。 - 必要なスコープを選択してトークンを生成します。
- 生成されたトークンをコピーしておきます(このトークンはこのタイミングでしか表示されないので、忘れずに保存してください)。
- GitHubのサイトで右上の自分のプロフィールアイコンをクリックして、
-
リポジトリのSecretsにPATを追加:
- GitHubのリポジトリページに移動。
-
Settings
タブをクリック。 - 左側のメニューから
Secrets
を選択。 -
New repository secret
ボタンをクリック。 - Nameには参照名(例:
MY_PERSONAL_ACCESS_TOKEN
)を入力し、Valueには先ほどコピーしたトークンをペースト。 -
Add secret
ボタンをクリックして保存。
-
ワークフロー内でPATを使用:
- GitHub Actionsのワークフローファイル内で、このように参照します:
${{ secrets.MY_PERSONAL_ACCESS_TOKEN }}
。
- GitHub Actionsのワークフローファイル内で、このように参照します:
例えば、APIリクエストを行う場合:
- name: Use PAT in a step
run: |
curl -H "Authorization: token ${{ secrets.MY_PERSONAL_ACCESS_TOKEN }}" https://api.github.com/some-endpoint
注意: PATは機密情報です。ワークフローファイルやその他の場所に直接トークンを書き込むことは絶対に避けてください。常にGitHubのSecretsを通じて参照するようにします。

TODO
想定通り動かなかったとき、エラーが出たらメール通知したい

環境変数に#は入れられない??ということはなかった
複数の値でエラーになっていた
4 12
Error: Unable to process file command 'env' successfully.
Error: Invalid format '12'
4,12をいれようとしたときのエラー
ーー
GitHub Actionsの各run
ステップは独自のシェルインスタンスで実行されます。これにより、あるrun
ステップで設定された環境変数は、次のrun
ステップで自動的には引き継がれません。したがって、Get PR numbers from diff
ステップで設定したPR_NUMBERS
変数は、Create PR
ステップで直接参照することはできません。
この問題を解決するためには、環境変数をジョブの他のステップで利用できるように、変数をジョブの環境変数としてエクスポートする必要があります。
以下はその方法を示す例です:
- name: Get PR numbers from diff
id: get-pr-numbers
run: |
PR_NUMBERS=$(git log --oneline origin/${{ env.BRANCH_SOURCE }}..origin/${{ env.BRANCH_TARGET }} | grep -oE 'Merge pull request #[0-9]+' | grep -oE '#[0-9]+' | sort -u)
echo "PR_NUMBERS=$PR_NUMBERS" >> $GITHUB_ENV
- name: Create PR
run: |
PR_TITLE="$(date +'%Y/%m/%d')更新"
PR_BODY="## 含まれるPR\n"
for pr in $PR_NUMBERS; do
PR_BODY="$PR_BODY- $pr\n"
done
# その後の処理...
上記の例では、Get PR numbers from diff
ステップでPR_NUMBERS
変数を設定した後、echo "PR_NUMBERS=$PR_NUMBERS" >> $GITHUB_ENV
を使用して変数をジョブの環境変数としてエクスポートしています。これにより、後続のステップでPR_NUMBERS
変数を参照できるようになります。

はい、正確には、GitHub Actionsの$GITHUB_ENV
や::set-env::
コマンドを使って環境変数に設定するとき、複数の行やスペースを含む文字列をそのまま入れると問題が起こることがあります。
スペースや複数の行を含む文字列を環境変数として保存する場合、以下のように一時的なファイルを使って間接的に保存することが推奨されています。
- name: Set multi-line environment variable
run: |
echo "VAR_NAME<<EOF" >> $GITHUB_ENV
echo "first line of content" >> $GITHUB_ENV
echo "second line of content" >> $GITHUB_ENV
echo "EOF" >> $GITHUB_ENV
もしそれが問題であれば、代わりに環境変数の値をシングルラインにするか、配列やリストとして保存する方法を検討する必要があります。たとえば、4 12
のようなスペース区切りの文字列を配列として扱いたい場合、スクリプト内で以下のようにして配列を操作できます:
PR_NUMBERS="4 12"
array=($PR_NUMBERS)
for number in "${array[@]}"; do
echo "$number"
done
この方法で、スペースで区切られた各数字を一つずつ取り出して処理することができます。

GitHubのworkflowの実行環境内で環境変数として利用する$GITHUB_ENV
は、標準の環境変数とはいくつかの点で異なります。以下に主な違いと注意点を示します:
-
書き込み方法:
- 通常の環境変数: 通常のシェルスクリプトでは
export VARNAME=value
のように設定します。 -
$GITHUB_ENV
: GitHub Actionsでの特定の書式、例えばecho "VARNAME=value" >> $GITHUB_ENV
として書き込みます。
- 通常の環境変数: 通常のシェルスクリプトでは
-
マルチラインの値:
-
$GITHUB_ENV
にマルチラインの値を格納する場合、特別な書式が必要です。各行をVARNAME<<EOF
とEOF
の間に置く必要があります。
-
-
特殊文字の扱い:
- 通常の環境変数として保存する際に、特定の特殊文字(例: ダブルクォートや改行など)はエスケープが必要な場合があります。これはシェルの解釈に依存します。
-
$GITHUB_ENV
に値を書き込むとき、特にマルチラインの値を扱う場合、このエスケープの問題が発生する可能性があります。
-
セキュリティの考慮:
- センシティブな情報(トークンやパスワードなど)は、セキュリティ上の理由から
$GITHUB_ENV
に直接書き込むべきではありません。GitHub Actionsのsecrets
を使用して、これらの情報を安全に扱う方法を選択するべきです。
- センシティブな情報(トークンやパスワードなど)は、セキュリティ上の理由から
一般的な環境変数と$GITHUB_ENV
の違いに関する公式のドキュメントは、GitHubの公式ドキュメントサイトで詳細を確認することができます。

参考になりそうな資料
公式
Tipsも多くて良い
MS learn 情報少なめ
AWS credential
古い
公式良さそう

2023/10/11
RunnerのUbuntu latest (2204) に入っているAWS CLIのバージョンはv2
AWS CLI 2.13.22
AWS CLI Session Manager Plugin 1.2.497.0
AWS SAM CLI 1.97.0
imageのrepository
これで直接調べてもよい
- name: Check AWS CLI version
run: aws --version