「え、普通にGitHub Actionsでテストできないの?」と思ったアナタ。最初は簡単だろうと思っていたんですが、意外と手こずったのでその顛末の記録です。
どちゃくそ紛らわしいですが、"GitHub Action"はGitHub Marketplaceにある個々のアクションのことを、"GitHub Actions"はCI/CDを自動化するGitHubの機能のことを指しています。
ここに"Use this GitHub Action with your project"と書いてあることと、GitHub Actionsの説明からして、多分公式でそういう扱いです。
ややこしいので、以下ではGitHub Actionを単にAction、GitHub ActionsをそのままGitHub Actionsと表記します。
git-flowとかGitHub Flowって何よ
開発時のブランチ運用モデルです。詳しい説明は超簡単に説明すると、
- masterブランチにはリリース用のコミットのみ存在し、リリースごとにタグを作成
- 開発時はmasterブランチからトピックブランチを生やし、レビューが終わったらmasterにマージ
名前を知らなくても、大なり小なり似たような方法で開発している人も多いと思います。
どこで手こずったの?
GitHub Actionsのワークフロー内でActionを使うには、使いたいバージョン(ブランチ名、タグ名、コミットハッシュ値等のgit checkout
で使える値)を指定する必要があります。たとえばこんなかんじ。
steps: - name: Checkout source codes uses: actions/checkout@v1 # @v1 のようにバージョン指定が必要git-flowやGitHub Flowで開発中のAction自身をGitHub Actionsで動作チェックする場合、開発中のトピックブランチは毎回変わるのでどう指定すればいいのかわからないのです。
その1: トピックブランチを作るたびにワークフローファイルのバージョンを書き換える(失敗)
多分一番原始的というか、誰でも考えつきそうな方法です。例えばInstall SSH Keyを開発しているときに自分自身にCIを適用する場合、ワークフローファイルをこのように書きます。
steps: - name: Install SSH key uses: shimataro/ssh-key-action@masterこれに対してfooというトピックブランチを生やして開発をするとき、トピックブランチ内でのみ以下のように使いたいバージョンを変更します。
steps: - name: Install SSH key uses: shimataro/ssh-key-action@foo一見これで動きそうですが、
- トピックブランチを作るたびに書き換えないとダメ
- 書き換え忘れると、トピックブランチの内容ではなくmasterブランチの内容でワークフローを実行することになるので、CIの意味がなくなる
- masterへマージする前にワークフローファイルを忘れずに元に戻す必要がある
- リバートコミットに対してもCIが走るため、互換性のない変更を加えた場合にリバートコミットに対するCIでエラーが起きてマージできない
- masterへマージした後にリバートコミットを作ると、masterブランチが汚れる
その2: 環境変数を使う(失敗)
ワークフローファイル内では環境変数を使えるようなので、該当コミットのハッシュ値を保持しているGITHUB_SHA
という変数を使ってみました。steps: - name: Install SSH key uses: shimataro/ssh-key-action@${GITHUB_SHA} # GITHUB_SHAでバージョン指定なかなかいいアイデアだと思ったのですが、いざ実行してみるとこんなエラーが出ました。
##[warning]Failed to download action 'https://api.github.com/repos/shimataro/ssh-key-action/zipball/${GITHUB_SHA}'. Error Response status code does not indicate success: 404 (Not Found).どうやら
uses
内では環境変数は展開してくれないようです。
その3: コンテキストを使う(失敗)
環境変数と似たようなものにコンテキストがあるので、今度はこれを使ってみました。steps: - name: Install SSH key uses: shimataro/ssh-key-action@${{ github.sha }}今度こそやったか?と思ったのですが、こんなエラーが。
- Your workflow file was invalid: The pipeline is not valid. .github/workflows/verify.yml (Line: 18, Col: 13): Unrecognized named-value: 'github'. Located at position 1 within expression: github.sha,.github/workflows/verify.yml (Line: 39, Col: 13): Unrecognized named-value: 'github'. Located at position 1 within expression: github.shaコンテキストは
with
のパラメータ指定では使えるけど、uses
では使えないようです。
その4: ローカルファイルへの参照を使う(失敗)
そもそも、ActionはGitHubリポジトリーにあるものだけじゃなくて、ローカルファイルにあるものも使えるんだよな…ということにということは、CI対象のコードをチェックアウトしてからローカルファイルを参照すればいいんじゃね?ということで
steps: - name: Checkout source codes # まず最新のソースコードをチェックアウト uses: actions/checkout@v1 - name: Install SSH key uses: . # カレントディレクトリのソースコードを使うこれなら文句ないだろうとニヤニヤしながら実行したところ、今度はこんなエラーが出てきました。
- Your workflow file was invalid: The pipeline is not valid. .github/workflows/verify-on-ubuntu.yml (Line: 11, Col: 13): Expected format {org}/{repo}[/path]@ref. Actual '.',Input string was not in a correct format.どうやらActionを使うには特定のフォーマットが必要のようです。
その5: ローカルファイルへの参照を使う 2(成功)
よろしい、ならば強引にフォーマットに合うような形で使ってやろうじゃないか。steps: - name: Checkout source codes uses: actions/checkout@v1 - name: Install SSH key uses: ./. # これならどうだ今度こそ成功しました。
なんか指定の仕方がキモいんですが、とりあえずこれで常にCI対象のコードにCIを適用できるようになりました。
なんかいい方法があったら教えてください。
0 件のコメント:
コメントを投稿