今更ですが, ここ最近ちまちまとGitHub Actionsをしています.
個人的にはこういうのイジるの大好きなので, 新しいおもちゃをもらった子供のようにはしゃいでいます. 今回は, その中で知った知見などを雑多にご紹介します.
Pull Requestでコケた時にRe-run jobsするとactions/cacheアクションが正常に動作しない
GitHub Actionsには, 依存ファイル(例えばPerlならlocal
とか, Node.jsならnode_modules
とか...)をキャッシュする, actions/cache
アクションが公式から提供されています.
このアクションを使っていて, かつon: pull_request
のようにしてPull Requestをフックとしてワークフローを実行するとき, Re-run jobs(再実行)を実行すると, 次のような警告の文言が出て正常に動作しない問題が存在しています.
[warning]No scopes with read permission were found on the request.
これはあくまでwarning(警告)なので, キャッシュが取得できなかったものとしてワークフローの処理は継続します. そのため, 「actions/cache
でキャッシュがあれば, 必ず取得する」ことを前提とするワークフローを作っていると, 意図しない挙動になる可能性があります.
詳しくは次のIssueに記載されています.
2020年4月13日現在, この問題は開発陣に認識されてはいるものの, まだ修正は完了していないようです.
回避策としては... 空commitをpushすれば動くっちゃあ動くのですが, それはどうなのか... という感じですね.
一応 on: push
としてpushをフックとすれば問題なくRe-run jobsできる... という話を聞きましたが, 自分はまだ試していません.
他の手としては, S3などにファイルを設置して, それを引いてくるなどの作戦もありそうです.
actions/cacheアクションは時折キャッシュの取得に失敗することがある
またもやactions/cache
アクションの話題です. タイトルにある通りで, actions/cache
アクションは時折次のような警告を表示してキャッシュが存在していたとしてもキャッシュの取得に失敗することがあります:
[warning]connect ETIMEDOUT xxx.xxx.xxx.xxx:443
これもwarning(警告)なので, キャッシュが取得できなかったものとしてワークフローの処理は継続します.
この問題も開発陣には認識はされていて, 原因はGitHub Actionsのランナーとキャッシュを保存するクラウドストレージの間のネットワークの問題とのことです. 自分たちの環境では, 1つのワークフローから一度に複数のジョブを走らせて, その全てで同じキャッシュを(actions/cacheを使って)引く... ということをしているので, こういった事象が起こりやすいのかもしれません.
また, 上記のIssueには, 「キャッシュアクションはベストエフォートで, もし失敗した時はそれ以降のステップでキャッシュされていたはずのコンテンツを再生成可能であると想定している(Please note, however, that the cache action is "best effort" and assumes that if it fails, the subsequent steps can recreate the cached content.
)」と書かれているので, actions/cacheアクションを利用するときはその点考慮してワークフローを作る必要がありそうです.
Pull Requestでactions/checkoutを使うとmerge commitになる
こちらもまた公式が提供するアクションとして, Gitリポジトリをcheckoutするためのactions/checkout
アクションが存在します.
Pull Requestでactions/checkout
を使ってGitリポジトリを取得すると, HEAD
がmergeコミットになっています. このままワークフローの中で新しいbranchを作ってcommitしてpushしてPull Requestを作ると, 差分に次のようなmergeコミットが含まれてしまいます.
ちなみにGitHub Actionsのワークフロー内でPull Requestを作ったりといったGitHubの操作をしたい時は, actions/github-script
を使うのが便利そうです.
...で, この問題についてはきちんとREADME.mdを見ましょう, という話で, Checkout pull request HEAD commit instead of merge commit という項に解決策が書かれています:
- uses: actions/checkout@v2 with: ref: ${{ github.event.pull_request.head.sha }}
README.mdのUsageには, ref
以外に指定可能なオプションの解説があるので, 「actions/checkout
アクションでこういうこと出来ないかな...?」と思ったら改めてREADME.mdを一通り眺めると良さそうです.
まとめ
備忘録がてら, GitHub Actionsをしている時に気づいた事, ちょっと躓いたポイントなどをまとめてみました. ここ2週間くらいGitHub Actionsに熱中していますが, 公式が提供する各種アクションが便利(actions/cache
はちょっとハマりポイントが多かったですが...)ですし, GitHubと良い意味で密結合していて便利なので, 引き続きいろいろやっていって知見を共有できればと思っています.