CI/CD
PR

GitHub Actionsの「set-output is deprecated」警告を修正する方法(save-state対応も)

saratogax
記事内に商品プロモーションを含む場合があります

Github Actions で作ったワークフローを実行していて、いつの間にか出力されるようになった警告。

Warning: The set-output command is deprecated and will be disabled soon. Please upgrade to using Environment Files. For more information see: https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/

処理は正常に完了していても、実行ログを確認したときに警告が出ていると気持ち悪いですよね。

そこで、今回は Github Actions で非推奨になった save-state と set-output を推奨されている形式に書き換えていきます。

非推奨になった内容

冒頭でも書いた通り、save-state と set-output のコマンドが非推奨になりました。

GitHub のサイトでは以下の専用ページが用意されています。

当初は「2023 年 5 月 31 日までは警告のみ、6 月 1 日以降はエラーになる」と予定がアナウンスされていました。

(2023年5月25日 追記)
GitHub Actions: Deprecating save-state and set-output commands」の中で、この話題について取り消されている感じなので、今後の情報を追っておきたいですね。やっぱ、サードパーティー製の actions のこともあるので、影響範囲が大きすぎますもんね。

(その後の決着 / 2023年7月24日)
GitHub は公式の続報で、これらのコマンドの削除を延期すると正式に発表しました。利用が依然として多いことが理由です。現在も save-state / set-output を使ったワークフローはこれまで通り動作しますが、アノテーションに非推奨の警告は表示され続けます。GitHub は引き続き環境ファイル($GITHUB_OUTPUT / $GITHUB_STATE)への移行を推奨しているので、新規作成や改修のタイミングで直しておくのが安心ですね。

多くのリポジトリやワークフローを抱えているプロジェクトでは、メンバーで分担しながら対応したいですよね。

修正方法

GitHub のページのサンプルにある通り、$GITHUB_STATE や $GITHUB_OUTPUT の環境ファイル(environment files)に標準出力させます。

save-state は $GITHUB_STATE に。

save-state

echo "::save-state name={name}::{value}"
 ↓
echo "{name}={value}" >> $GITHUB_STATE

set-output は $GITHUB_OUTPUT に。

set-output

echo "::set-output name={name}::{value}"
 ↓
echo "{name}={value}" >> $GITHUB_OUTPUT

注意:値が複数行になる場合

単純な置き換えで済むのは、値が 1 行に収まる場合だけです。

コマンドの実行結果や JSON など、改行を含む値をそのまま >> $GITHUB_OUTPUT に流すと、2 行目以降が別の項目として解釈されて壊れます。

複数行の値には、デリミタを使う書き方が用意されています。

{name}<<{delimiter}
{value}
{delimiter}

実際のステップに当てはめると、こんな形ですね。

- name: 複数行の値を出力する
  id: step_one
  run: |
    {
      echo 'JSON_RESPONSE<<EOF'
      curl https://example.com
      echo EOF
    } >> "$GITHUB_OUTPUT"

デリミタ(上の例では EOF)は、値の中に単独の行として現れない文字列を選んでください。

値の中にたまたま同じ行が含まれると、そこで値が打ち切られてしまいます。

外部から取得した内容を出力する場合は、ランダムな文字列をデリミタにするのが安全です。

確認方法

書き換えたらワークフローを実行して、警告が消えているか確認してみましょう。

単純に、以下の文字列を削除して、{name}::{value} となっていた箇所をイコール(=)で繋ぎ、環境ファイルにリダイレクトするだけですね。

::save-state name=
::set-output name=

手作業だと単調な作業でミスりそうなので、量が多い場合は正規表現などで一括置換が無難でしょう。

差分は Pull Request で要チェックということで。

同じく GitHub Actions のログに出る警告を消したい方は、actions/setup-goで「Restore cache failed」の警告が出る時の対処法 もあわせてどうぞ。

参考(出典)

ABOUT ME
saratoga
saratoga
フリーランスエンジニア
仕事にも趣味にも IT を駆使するフリーランスエンジニア。技術的な TIPS や日々の生活の中で深堀りしてみたくなったことを備忘録として残していきます。
記事URLをコピーしました