先日GitHubがCI/CDをサポートをする、というアナウンスメントがあって ベータ版をスタートしたとありましたが、 使えるようになったので使ってみました。
GitHub Action新旧
GitHub Actionsという物自体は昨年アナウンスされベータ版として使える様になってました。 それが今月CI/CDを使えるようになった、というので話題になってたので使ってみようとしたところ、 なんか違うものしか見れなくて(最初のベータ版に申し込んで出たものと同じもの) なんだろう、と思ってたんですが、 新しいものに変更されるのも徐々に行われていたようです。
メールが来てやっと新しいものが使える様になったので使ってみました。
Actionsが使える様になっていても下に書くように古いままの場合には 新しいベータが使える様になったというメールを心待ちにしてください。
以前のGitHub Actions
まだベータ版ですが、以下のページから登録して使える様にリクエストを出すことが出来ます。
GitHub Actionsという物自体は昨年発表されベータ版で使える様になっていました。
ベータ版が使える様になると、レポジトリの上側のタブのPull requestsとProjectsの間に Actionsというタブが出来ます。
ここをクリックすると以前は以下のページに有るようなGUIな感じで ワークフローを作っていく様なページに行きました。
GitHub Actions: みなさんが開発し、GitHubで実行 - The GitHub Blog - Japan
以下のページにあるような専用フォーマット?(main.workflow)で直接ワークフローを編集することも出来ました。
一般的なCI/CDサービスだとYAML形式でワークフローを書いていくことが多いので 書くのはちょっと面倒な感じ。 どちらかというとGUIでやっていくことに頑張ってしまった感じでした。
こちらもlimited public beta (2019/10/16) だったので登録後しばらくしてから使える様になっていましたが、 ちょっと使いづらい感じがしてちゃんと使っていませんでした。
新しいGitHub Actions
先日このGitHub Actionsの新しいバージョンが発表されました。
Updates to GitHub Actions (limited public beta) - The GitHub Blog
これも limited public beta (2019/08/08) です。
ただ、ベータ版の申込みとしては以前のGitHub Actionsと同じページからになるので これが発表されてから申し込んでみたところすでに申し込んであります、と出てました。
それでActionsというタブは出来てるのでてっきり新しいものが使える様になっていたと思ってましたが 前のベータ版が使えていてもすぐに新しいものが使えるわけではなかったようです。
今日You’re in! Get started with GitHub Actions betaという題名のメールが来ていて 見てみたらActionsの中身が新しくなっていました。
以前のベータ版は2018年10月に発表されてすぐ登録して2019年1月に Your GitHub Actions invite is Readyというメールが来て使える様になっていたようです。
ということで適当なレポジトリで見てみるとこんな感じで 以前とは違いテンプレートを選べる様になっていて 選ぶと.github/workflows/XXX.ymlというYAML形式のファイルを編集するページに飛ぶようになっています。
この.github/workflowsというディレクトリにYAMLファイルを置くとそれを元にActionを起こしてくれる仕組みです。 (名前は.yml拡張子なら何でも良い。)
これは他のCI/CDサービスでもよく見るような形で 他のところで行っているCI/CDを移植するのも簡単そうです。
とりあえずやってみる
適当なレポジトリで Actionsに行くと一番上にレポジトリに基づいたワークフローのテンプレートが選べる様になっています。 もしくは右上のSet up a workflow yourselfを選ぶとシンプルなテンプレートから作れます。
とりあえずこのテストレポジトリにはなにもないのでシンプルなテンプレートが表示されてたのでそれを使ってみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
on
でどの様なタイミングで実行するかトリガーを指定します。
ここではpush
されたとき。
その後にjobs.build
とありますが、このbuild
のところは<job_id>
と呼ばれ、
複数の<job_id>
をjobs
の中に指定することが出来ます。
build
というのはただのid名なのでjob1
とかでもOK。
jobs.<job_id>.runs-on
では実行環境を選びます。ここではUbuntuが選ばれてます。
その後のjobs.<job_id>.steps
で実際に実行したいことを書いていきます。
最初に使っているuses
では外部レポジトリで定義されたアクションを実行することができます。
actionsレポジトリのcheckoutのv1のaction.yml
の内容が実行されることになります。
アクションを実行するディレクトリは最初何もない状態なので、
大概の場合はまず最初に該当のレポジトリを持ってこないと始まりません。
actions/checkout
を呼ぶとカレントディレクトリに
該当のレポジトリを持ってきます。
カレントディレクトリの中にレポジトリを置く、のではなく、
カレントディレクトリ自体がレポジトリのトップになるようなことをしてくれます。
各ステップごとにcd
などしても次のステップでは必ず
GITHUB_WORKSPACE
(Ubuntuだと
/home/runner/work/<repository name>/<repository name>
)
からスタートするので、
その場でactions/checkout
をすることですべてのステップでレポジトリのトップから作業を行う様になります。
そのあと各実行項目としてname
、run
で
実行コマンドごとの名前と内容を指定しています。
このままWeb上からcommit出来るのでしてみます。
しばらくするとActionsのタブの中が変わって実行結果が見れるようになります。
実行されたものを選択してみてみるとこんな実行内容が見れます。
実行中もここで経過を見ることも出来ます。
ここではWebインターフェースから作りましたが、
直接**.github/workflows/
また、以下のレポジトリにいろいろな言語様などのテンプレートがあります。
Features • GitHub Actions のページの下の方に行くと他の人が作った例を色々と見ることが出来ます。 今はこの紹介ページでたくさんのレポジトリが流れる様な表示になっていますが、 このうちactionsというユーザー名の名のもとにまとめられているものもあります。
また、Marketplaceにも例が色々とあります。
ただここはまだ古いバージョン用のもの(YAML形式でないもの)も混じっているのでちょっと注意が必要です。
多分そのうちこれ以外にもまとめられたページが出来るかもしれません。 (先にサードパーティーで作られるかも。)
設定項目
トリガー
GitHubの直サービスなので他の連携サービスに比べかなり細かく色々とトリガーが選べます。
cronジョブの様に定期的に実行することも出来ます。
ビルド環境
GitHub ActionsではLinux(Ubuntu)、macOS、Windowsの環境で実行することが出来ます。 これらはMicrosoft Azure上の仮想環境ということで、 Microsoftによる買収が用方向に行ってる一つの例だと思います。
今現在使えるバージョンは以下から確認出来ます。
指定はjobs.<job_id>.runs-on
というパラメーターに設定しますが、
複数まとめて行いたい場合にはmatrix
を使って
jobs:
build:
runs-on: ${{matrix.os}}
strategy:
matrix:
os: [ubuntu-latest, macOS-latest, windows-latest]
の様に書くことが出来ます。このmatrix
で複数を指定する方法はは他の項目にも使えます
1
。
暗号化
CI/CDを回したい時にどうしてもパスワードなどの秘密情報をどこかに書いておかないと やりたいことが出来ないことがあります。
GitHub Actionsでもその様な状況に対応していて、 文字列を暗号化して入れておくことが出来るようになっています。
Settingsの中にActions用のSecretsという項目が出来ていてここで暗号化したい文字列を設定することができます。
また、CIでレポジトリにpushしたり何らか変更したりしたい場合がありますが、 その場合GITHUB_TOKENを発行してそれを使う必要がありました。 他のサービスを使う場合にはこれをGitHubで発行して、各サービスでこれを暗号化して登録して使います。
GitHub Actionsでは実行するレポジトリのGITHUB_TOKENは自分で発行しなくても$
で専用のトークンを使える様になっています。
こういった事をよくしてる場合にはかなり工程が減るので便利だし、
トークンが漏れる可能性も減るので良いと思います。
job_idごとの依存関係
jobs.<job_id>.needs
を使うと他のjob_id
の内容が成功したときだけ実行する様にできます。
その他設定項目
以下からActions用のYAMLでの設定項目が確認できます。
実行制限
現在の実行制限は以下の様なものです2。
- 同時に実行できるワークフローはレポジトリ毎に20個まで。
- 実行できるAPIリクエストはレポジトリ毎に1時間で1000。
- 各ジョブの実行時間は最大6時間。
- 同時に走らせられるのはレポジトリ毎に20ジョブ。
と、かなり緩いものになっています。 色々テストしてみましたが待たされる、といったことは今の所ありませんでした。
料金
パブリックレポジトリに関してはすべて無料です。
プライベートレポジトリに関しては無料では2000時間/月まで。 GitHubでProに入ってる人は3000時間/月まで。
あとは超えた分だけの従量課金せいで、各OSによって違います 3。
- Linux (2cores, 7GB): $0.008/min
- Windows (2cores, 7GB): $0.016/min
- macOS (2cores, 7GB): $0.08/min
OS代?なのかわかりませんが、Linuxが一番安くなっています。 そしてMicrosoftなので?macOSよりWindowsの方が圧倒的に安い。
2000分(33時間)追加で
- Linux: $16
- Windows: $32
- macOS: $160
となります。
さらに今後Self-hostedで走らせることも出来るようになる様で、 これを使うのであればPrivateでも制限なく無料で使えるようになるようです。
他CIサービスの状況
ちなみに、GitHubは昨年Microsoftに買収されましたが、 CIサービスとして、 wercker は一昨年にOracleに、Travis CIは今年はじめにIDeraに買収されています。 ともにデータベース系の会社が買収している、と。
あとはDevOps環境に関するサービスを展開しているJFrogも今年はじめに Shippableを買収しています。
未だ独立なサービスでこれらに匹敵するものとしては CircleCIや Androidなどの環境などのためによく使われる Bitrise とかがあります。
あとはWindowsのGUIなどで使われる AppVeyor。 以前はWindows用、という感じでしたが今はLinuxもサポートしているみたいです。
この辺のサービスはBitBucketなど他のGitホスティングサービスなどもサポートしてたりしますが、 主なものはやはりGitHubのレポジトリになっていると思います。
ちょっとこれらのサービスをGoogle Trendsで見てみると
こんな感じで2016年位まではTravis CIが圧倒的だったのに対して、 最近ではCircleCIが逆転しています。 また、Bitriseが最近ではTravis CIに迫る勢いです。 AppVeyorは入ってませんが今現在はBitriseの半分くらいの検索ボリュームで Werckerとかよりは検索されています。
これだけ見ると中国とかでTravis CIが人気なようですが、 ここ30日で見るとそうでもないので単にTravis CIが優勢だった頃に 中国とかでよく検索されていた、ということみたいです。 一方なぜか今も南半球ではTravis CIが人気a?
日本だけで見ると日本語のインターフェースが無いためかTravis CIがずっと苦戦しています。
てっきり未だにTravis CIが圧倒的かと思ってたんですが、 そうでもないみたいです。 もちろんGoogle検索と使われてるかどうかは直接は関係ありませんが。
GitHub Actionsも見てみると
昨年最初のベータ版が出た所で一時Bitriseも超える検索を受け、 また最近の新しいリリースで検索数が一気に上がっています。
まとめ
ちょっと見てみただけですが、YAML形式でかけるワークフローで他のサービスでCI/CDを使ってた人が入りやすいサービスになっていると思います。
Microsoft Azureをバックグラウンドに、ジョブの実行の利用制限も非常にゆるいです。 あまり回数流しているわけではないのであれですが、 実際のところ今の時点では他のサービスに比べて圧倒的にストレスが少ない状態ですぐにジョブが流れる様になっています。
実行環境もLinux/macOS/windowsでそれぞれ最新のものとちょっと古いバージョンが使え、 2coresで7GBなのでこの辺も大概の他のサービスよりも良い環境です。
プライベートレポジトリでも無料で2000時間まで使えるというのも 最近プライベートレポジトリ自体が無料になったGitHubでは嬉しいところ。
また、GitHubの直サービスなのでトリガーに細かい指定が出来ることや GITHUB_TOKENなどを直接扱えるなど他のサービスにはない特徴もあります。
まだ細かいところまでは実際に使ってみないとわからない部分もあるかと思いますが、 後発サービスなので他のサービスの良いものやプラスアルファの機能も多いのでは、と。
今の時点でも多くのテンプレートや例が充実していて、 今後正式公開されればさらに増えていくと思います。
見ている限りでは他のサービスにできてGitHub Actions出でいないこと、というのはほとんどなさそう。 AndroidやiOS系のテスト環境やAppVeyor的なWindowsのアプリのテストなど?(GitHub Actionsでも出来る?)
無料の範囲で、ということで考えると、werckerは無料でプライベートレポジトリを使えるので 今後も需要はありそうです。
あと、Travis CIを辞めてGitHub Actionsにしてしまうと成功/失敗を示すバッチが貼れない。。。
ちょっとこれはなんとかして欲しいかも。 自分でやろうと思えば出来ないこともないものではありますが。 (Actions実行時にREADMEを編集する、か、外部からActionsの結果を参照して表示を変える様なサービスを作ってREADMEから参照するか?)
とはいえ、実行的な部分に関しては最早他のサービスを使う意味がほとんどない状態なので 今後作るものはGitHub Actionsで作っていくと思います。 今まであるものも気が向いたら変更していこうかと思います。