GitHub Actionsをもう少し色々触ってみたので そのメモ。
GitHub Actions
去年から使えるようになっていたGitHub Actionsですが、 それまでTravis CIやWerckerというサービスを使っていて、 それらをわざわざ移す必要もないかな、と思ってたのですが 便利そうな部分も多いのでいくつか移行してみました。
その中で気づいたことなどについてメモしておきます。
GitHub Actionsを学ぶ
公式ドキュメントが充実しているのでまずはそれ参照。
日本語版だと一部英語だったりして逆に読みにくいところもあるので 英語読める人は英語版の方が読みやすいかと。
にはci のディレクトリに色々な用途別の例があります。
には公式以外も含めて色々と有用なものがまとめられています。
以下は最初に使える様になった時に試したときのもの。
とりあえずやるための設定
GitHubのレポジトリに.github/workflowsというディレクトリを作って、その中に YAML形式の設定ファイルを置くことでGitHub Actionsが動きます。
まだ置いてないときは、レポジトリの上にあるActionsというタブを開くと Get started with GitHub Actionsというページに行って 例の中から選んでスタートファイルとして使うことも出来ます。
とりあえず、まずやりたいこと、といえばレポジトリにpush
した際に
そのレポジトリの中身を色々チェックしたりすることだと思います。
それをするための簡単な設定は
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
ファイル名は何でもよくて、YAML形式のファイルをyml
もしくはyaml
という拡張子で
.github/workflows/の中に保存すると
見てくれる様になります。
name
は適当に。
masterブランチにpush
されたとき、をトリガーにするなら上の様なon
の設定に。
jobs
の設定ではmyjob
というジョブを定義してますが、この名前は何でもOK。
このジョブの中でまず環境を設定します。ここではUbuntuの最新版。
使えるものは以下を参照。
Ubuntu, macOS, Windowsがあります。
Ubuntuの最新版の環境とかはUbuntu1804-Readme.md を参照。 Homebrewとかも入ってます。
その後でsteps
として処理を書いていきます。
予め用意されたアクションを使う場合にはuses
、コマンドを書く場合にはrun
で指定します。
これらのアクションはすべてGITHUB_WORKSPACE
で定義されるディレクトリ
(Ubuntuだと
/home/runner/work/<repository name>/<repository name>
)
で行われます。
事前のアクションでディレクトリを変更していても次のアクションはすべてここからスタートします。
run
の方にはわかりやすいようにname
を指定してますが無くても良いですしuses
の方でname
を指定してもOK。
run
で複数処理をしたい場合には分けても良いですし、上の様にYAML的な複数行の書き方で書いてもOK。
(echo checking... && ls ./
みたいなことも出来ます。)
このコマンドを打つ前にuses: actions/checkout@v2
を呼んでますが、
GitHub Actionsでは用意される環境にはレポジトリがチェックアウトされてない状態なので
まずそれを取ってくる作業です。
これでGITHUB_WORKSPACE
がレポジトリのトップになります。
自分でTOKENなどを使って取ることも出来ますが、actions/checkout@v2
を使うのがデファクトスタンダードです。
気づいたこと、気になったことなど
細かい設定などは公式を参照すれば十分とは思うので省きますが 特に気づいたことや気になったことなど。
メールでの通知を細かくは設定できない?
[通知の配信方法を選択する - GitHub ヘルプ]
上記では他のGitHubの通知と共にGitHub Actionsに関しても記述がありますが、 設定はアカウント全体での設定で、
- Web
- Send notifications for failed workflows only
という3つにチェックを入れるかどうか、だけです。
今はこれのEmailとSend notifications for failed workflows only にチェックを入れて失敗したときだけメールを送る、という設定にしています。
Travis CIとかだと各CIの設定ファイルの中で通知設定が出来て、 失敗後、成功した場合にも通知(成功が続いた場合は通知しない)、など細かい設定も出来ます。
この辺はまたそのうちアップデートがあるんじゃないかな、と期待してます。
Pythonなどを使う場合にはsetupを呼ぶべし
Pythonのツールでpip
を使ってインストールするものに関して、
そのままpip install ...
とやったところ、通常PATHの中に実行ファイルがインストールされるべきところ
されず使えない状態になってました。(どこにインストールされたか、もしくはモジュールがインストールされただけでPATHの中にはしてないのかはちゃんと確認してません。)
ubuntu-latest
のデフォルトのPATHは
/usr/share/rust/.cargo/bin:/home/runner/.config/composer/vendor/bin:/home/runner/.dotnet/tools:/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
です。
PATHをちゃんと設定すれば、と思って試しましたがよくわからず。
そんな中、Pythonのセットアップアクションがあったのでそれを使ってみました。
- name: Setup python
uses: actions/setup-python@v1
with:
python-version: 2.x
architecture: x64
- name: python tool ...
run: |
pip install ...
こんな感じで actions/setup-python を呼ぶと、/usr/bin/pythonではなく、 /opt/hostedtoolcache/Python/2.7.17/x64/bin/python (pip) が使われるようになり、pipでインストールされるものも /opt/hostedtoolcache/Python/2.7.17/x64/binにインストールされる様になります。
また、このアクションを呼んだ時点で このディレクトリがPATHに追加されます。
他にも
Node.js, Java, goやRuby
などのsetupもあるのでそういったものをrun
で使いたい場合には
これらを使ってセットアップした方が捗るかもしれません。
バッジ
Travis CIとかで使えるビルドの結果などの状態の表示をするバッジ。
GitHub Actionsでも使えます。
各レポジトリのActionsタブの各ワークフローのページからもバッジのスニペットを取得することも出来ます。
ただ、これらのものは状態表示の絵のURLがあるだけで、その状態を示すページへのリンクとかになってません。
![](https://github.com/actions/hello-world/workflows/Hello%20World/badge.svg)
クリックして結果ページに飛ぶようにするためには自分でURLを加える必要があります。
[![](https://github.com/actions/hello-world/workflows/Hello%20World/badge.svg)](https://github.com/actions/hello-world/actions?query=workflow%3A%22Hello+World%22)
トリガーの自由度は高い
GitHub謹製のツールなので、ということがあり、実行に使えるトリガーは豊富です。
push
だけでなく、IssueなどGitと直接関係ないものも含め、ありとあらゆるレポジトリの
変化に対してワークフローが実行出来ます。
また、定期的な実行もschedule.cron
で通常のcronジョブの様な書き方で
指定できるのも良いところかと。
skip ci
レポジトリに対して何かアップデートをしてpush
し直す、ということは良くあることですが、
何も考えずにやるとそのpush
に対して再びCIが走ってしまい、
延々と繰り返されることになってしまいます。
これを避けるためにTravis CIとかだとコミットログに[skip ci]
などが含まれていると
CIを実行しない様になっています。
GitHub Actions does not respect [skip ci] - GitHub Community Forum
今の所GitHub Actionsではそのような機能はないのですが、 同じようなことを
myjob:
runs-on: ubuntu-latest
if: "!contains(github.event.head_commit.message, '[skip ci]')"
...
と、jobs.<job_id>.if
で[skip ci]
をコミットログに含まない場合、という
指定をすることで再現することが出来ます。
多分この辺もそのうち改善されるのではないかな、と思うところ。
自作アクション
別に書こうと思います。