Open13

Github Actionsのメモ

shimoshimo

Merge pull request #3 from ... をワークフロー内でgrepしたい

動作OK
grep -oE "Merge pull request \#[0-9]+"

なぜかよくわからない

# はエスケープする
\dでなくて[0-9]を使う
クォートはシングル、ダブルどちらでも

NG
"#\d+"

shimoshimo

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

shimoshimo

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変数を参照できるようになります。

shimoshimo

PAT(personal asscess token)を作る

自分のプロフィールのSetting
→左のメニューの一番下にあるDeveloper Settings
→Personal access tokens (classic)

GithubActionsで使えるようにする

===ChatGPT

GitHubのワークフローにPersonal Access Token(PAT)を設定する方法は以下の通りです:

  1. PATの生成:

    • GitHubのサイトで右上の自分のプロフィールアイコンをクリックして、Settingsに移動します。
    • 左側のメニューからDeveloper settingsを選択。
    • Personal access tokensをクリック。
    • Generate new tokenボタンをクリック。
    • 必要なスコープを選択してトークンを生成します。
    • 生成されたトークンをコピーしておきます(このトークンはこのタイミングでしか表示されないので、忘れずに保存してください)。
  2. リポジトリのSecretsにPATを追加:

    • GitHubのリポジトリページに移動。
    • Settingsタブをクリック。
    • 左側のメニューからSecretsを選択。
    • New repository secretボタンをクリック。
    • Nameには参照名(例:MY_PERSONAL_ACCESS_TOKEN)を入力し、Valueには先ほどコピーしたトークンをペースト。
    • Add secretボタンをクリックして保存。
  3. ワークフロー内でPATを使用:

    • GitHub Actionsのワークフローファイル内で、このように参照します:${{ secrets.MY_PERSONAL_ACCESS_TOKEN }}

例えば、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を通じて参照するようにします。

shimoshimo

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

shimoshimo

環境変数に#は入れられない??ということはなかった
複数の値でエラーになっていた

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変数を参照できるようになります。

shimoshimo

はい、正確には、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

この方法で、スペースで区切られた各数字を一つずつ取り出して処理することができます。

shimoshimo

GitHubのworkflowの実行環境内で環境変数として利用する$GITHUB_ENVは、標準の環境変数とはいくつかの点で異なります。以下に主な違いと注意点を示します:

  1. 書き込み方法:

    • 通常の環境変数: 通常のシェルスクリプトでは export VARNAME=value のように設定します。
    • $GITHUB_ENV: GitHub Actionsでの特定の書式、例えば echo "VARNAME=value" >> $GITHUB_ENV として書き込みます。
  2. マルチラインの値:

    • $GITHUB_ENV にマルチラインの値を格納する場合、特別な書式が必要です。各行を VARNAME<<EOFEOF の間に置く必要があります。
  3. 特殊文字の扱い:

    • 通常の環境変数として保存する際に、特定の特殊文字(例: ダブルクォートや改行など)はエスケープが必要な場合があります。これはシェルの解釈に依存します。
    • $GITHUB_ENV に値を書き込むとき、特にマルチラインの値を扱う場合、このエスケープの問題が発生する可能性があります。
  4. セキュリティの考慮:

    • センシティブな情報(トークンやパスワードなど)は、セキュリティ上の理由から$GITHUB_ENVに直接書き込むべきではありません。GitHub Actionsのsecretsを使用して、これらの情報を安全に扱う方法を選択するべきです。

一般的な環境変数と$GITHUB_ENVの違いに関する公式のドキュメントは、GitHubの公式ドキュメントサイトで詳細を確認することができます。