notebook

都内でWEB系エンジニアやってます。

GitHub Actionsで条件によってステップ中のコマンドオプションを切り替える

三項演算子のように特定の条件の場合は特定のオプションを付ける、それ以外の場合はつけないといった分岐をちょっとだけ入れたいみたいなケースがあった

そのときのメモ

実例

ブログへの記事投稿用のCLIツールをActions経由で使いたい

(記事内ではわかりやすいようにpublishコマンドとしている)

記事投稿用のCLIツールは--draftオプションをつけて実行すると下書きを投稿、つけないと公開状態で投稿するという仕様になっている

Actions上で実行する場合

  • pull_requestイベントの場合は--draftオプションを付け下書きで投稿
  • マージされたら(mainブランチへのpushの場合)--draftをつけず、公開状態で投稿

というような感じのフローを実現したい

下書きのオプションを付けるかどうかしか変わらないのできれば1行で済ませたいなという感じ

実際の設定

実例のため、個別の環境の話が入ってきてしまうがより細かく挙動を挙げると

  • pull_requestイベントで、**.mdファイルに変更があった場合、投稿コマンドを実行(下書き)
  • mainブランチへの変更で**.mdファイルに変更がある場合は投稿コマンドを実行(公開)

となる

一部抜粋すると次のようになる

  • .github/workflows/publish.yml
name: publish

on:
  pull_request:
    paths:
      - contents/**.md
  push:
    branches:
      - main
    paths:
      - contents/**.md

jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3.3.0
      - run: |
          publish ${{ github.event_name == 'pull_request' && '--draft' || '' }}

ExpressionsをStep実行中に使う

式 - GitHub Docs

runの中で演算子を組み合わせてサクッと書ける

run: |
  publish ${{ github.event_name == 'pull_request' && '--draft' || '' }}

注意点としては、何もしない場合は空文字を返すようにしているが、空文字は最後に持ってこないとうまく動かない

次のような例だとpushイベントだったとしても--draftがついてしまう

run: |
  publish ${{ github.event_name == 'push' && '' || '--draft' }}

これは、&&の後の空文字が真偽判定で偽と評価されてしまうことで後ろの--draftまで評価されるので--draftが返ってしまうという挙動のよう

うっかりやらかしそうなパターン

ともあれこれでやりたいことは実現できた

こういうケースはそれなりにあると思うので覚えておくと便利