Actions】Go言語の自動テストからリリースまでを作ってみたGoGitHubCIGitHubActionsはじめに今回作成したのはGo言語リポジトリ用ワークフロー。GitHubに指定されたタグがPushされた時点でテストを実行し問題が無ければ、クロスコンパイルを実施しリリースまで行う。以下にアップロードしているので利用したい方はこちらからどうぞ。GitHubワークフローの流れは以下となっている。各種処理は、ジョブとステップの二通りで定義することができる。今回は、テストや各種リリースの処理はそれぞれジョブとして分離し定義する形で設計している。Actionsの機能(matrix)を有効活用して実施したいと考えたためである。以降、各処理の概要を説明していく。以下は、このワークフローが実行される条件を指定している。この場合は、「v」から始まるタグがpushされた場合にトリガーされ実行されることが定義されている。v*実行条件は、ほかにも特定のブランチにpushされたや、特定のファイルやディレクトリ下に変更があった場合などを指定することができる。pushのみではなく、forkされた場合やissueが立った際なども可能。詳しくは以下のリンクに載っている。以下は、自動テストを実行するジョブが定義されている。.各stepにそれぞれ処理が定義されており、上から順に以下の流れとなっている。testを用いて、テストを実行この中で最も重要なのがactions/checkout@v1。actions/checkoutこれを実行することにより、リポジトリの中に入ることができる。しても必要なモジュールをインストールしてくれない。途中のステップで実行に失敗した場合、デフォルトだとそこで処理は止まり、ジョブは失敗扱いとなる。testが実行されることはない。以下は、リリースの作成を定義している。実際の作成は、actions/create-release@v1.0.0に行ってもらっている。artifact/url.txtジョブは基本的にすべて並列に実行される。バグなどの致命的欠陥を持ったままリリースはしたくないため、リリース処理などはテストの実施後に行いたいものである。testでtestジョブが実行完了しないと実行されないように制限を入れている。これにより、ジョブの逐次実行が可能となる。ジョブに依存関係を持たせたい場合はneedsを用いるべき。依存関係は一つのみでなく複数のジョブを指定することができる。詳しくは、以下のリンク参照。ヘルプこのジョブの後半のステップは、作成されたリリースにパッケージをアップロードする際に必要となるURLを次のジョブに渡すために必要となる。}}で直前のリリース作成時に出力されたアップロード先URLを取得し、それをファイルに書き込み、actions/upload-artifact@v1でワークフローのアーティファクトにアップロードしている。これだけではジョブ間の情報共有はできないのだが、共有先のジョブでactions/download-artifact@v1を実行することでアーティファクト経由で情報を共有することができる。ジョブ間の情報共有については以下のリンクを参照。ヘルプパッケージのアップロード以下は、先ほど作成されたリリースにパッケージをアップロードする処理が定義されている。application/zipこのジョブは実行の定義自体は一種類しかないが、matrixを用いることによりパラメータを変化させて同時に3つのジョブを並列に実行するように定義されている。matrixには対象OSごとの実行ファイルを作るために必要なパラメータを設定している。これによりジョブは、ビルド時に必要な情報を取得し、指定したOS用の実行ファイルを並列に生成かつリリースにアップロードすることができる。この仕組みを用いて、クロスコンパイルを実施している。リリースへのアップロードにはactions/upload-release-asset@v1.0.1を用いている。これはアップロード先のURLが必要となるので、新規にリリースをアップロードしたい場合は先ほど利用したactions/create-release@v1.0.0と併用する必要がある。詳しくは以下のリンクを参照。Actionsが正式リリースされたとのことでいろいろ触ってみたが、結構いろいろ自動化できそうで楽しい。今回は、触っていた際にたまった知見を活かして、Go言語のリリース用ワークフローを作成してみたが、まだやりたいことをシンプルに実現するにはあと一歩って感じがした。実現できなくはないが、ちょっとめんどくさいところがまだある(特にジョブ間とワークフロー間の情報共有)ので、今後さらにアップデートを重ねてよりよくなっていくことに期待。upLoginユーザーは見つかりませんでした。