Masteries

技術的なことや仕事に関することを書いていきます.

GitHub Actionsの知見ご紹介

今更ですが, ここ最近ちまちまとGitHub Actionsをしています.

github.co.jp

個人的にはこういうのイジるの大好きなので, 新しいおもちゃをもらった子供のようにはしゃいでいます. 今回は, その中で知った知見などを雑多にご紹介します.

Pull Requestでコケた時にRe-run jobsするとactions/cacheアクションが正常に動作しない

GitHub Actionsには, 依存ファイル(例えばPerlならlocalとか, Node.jsならnode_modulesとか...)をキャッシュする, actions/cacheアクションが公式から提供されています.

github.com

このアクションを使っていて, かつon: pull_request のようにしてPull Requestをフックとしてワークフローを実行するとき, Re-run jobs(再実行)を実行すると, 次のような警告の文言が出て正常に動作しない問題が存在しています.

[warning]No scopes with read permission were found on the request.

これはあくまでwarning(警告)なので, キャッシュが取得できなかったものとしてワークフローの処理は継続します. そのため, 「actions/cacheでキャッシュがあれば, 必ず取得する」ことを前提とするワークフローを作っていると, 意図しない挙動になる可能性があります.

詳しくは次のIssueに記載されています.

github.com

2020年4月13日現在, この問題は開発陣に認識されてはいるものの, まだ修正は完了していないようです.

github.com

回避策としては... 空commitをpushすれば動くっちゃあ動くのですが, それはどうなのか... という感じですね. 一応 on: push としてpushをフックとすれば問題なくRe-run jobsできる... という話を聞きましたが, 自分はまだ試していません. 他の手としては, S3などにファイルを設置して, それを引いてくるなどの作戦もありそうです.

actions/cacheアクションは時折キャッシュの取得に失敗することがある

またもやactions/cacheアクションの話題です. タイトルにある通りで, actions/cacheアクションは時折次のような警告を表示してキャッシュが存在していたとしてもキャッシュの取得に失敗することがあります:

[warning]connect ETIMEDOUT xxx.xxx.xxx.xxx:443

github.com

これも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アクションが存在します.

github.com

Pull Requestでactions/checkoutを使ってGitリポジトリを取得すると, HEAD がmergeコミットになっています. このままワークフローの中で新しいbranchを作ってcommitしてpushしてPull Requestを作ると, 差分に次のようなmergeコミットが含まれてしまいます.

f:id:papix:20200413225616j:plain
赤線部がmergeコミット

ちなみにGitHub Actionsのワークフロー内でPull Requestを作ったりといったGitHubの操作をしたい時は, actions/github-scriptを使うのが便利そうです.

github.com

...で, この問題についてはきちんと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と良い意味で密結合していて便利なので, 引き続きいろいろやっていって知見を共有できればと思っています.