Adways Advent Calendar 2018 11日目の記事です。
http://blog.engineer.adways.net/entry/advent_calendar_2018
こんにちは、swfzです。
GitHub Actionsがlimited public betaになったので、さっそく使ってみました。
実用的な物というよりはとりあえずさわってみて感触を確かめてみるという感じの内容でやってみます。
GitHub Actionsとは
今年GitHub Universe で発表された、GitHub の新しい機能です。
独自でアクションを定義してつなげることでワークフローを作成できます。
ドキュメント
GitHub Actions | GitHub Developer Guide
結構丁寧に書いてあるので読めばわかると思います。
実際にやってみて感覚掴むのも大事だと思うのでやってみます。
作って実行してみる
GUIで作る方法とファイルを直接編集してpushする方法があります
今回は最初だけGUIで作ってあとは直接編集します
招待メールが来ていればプライベートリポジトリにこんなタブができています

まずはチュートリアルをなぞりつつって感じなので適当な名前でworkflowを作ります
適当なworkflow名を入れてクリックして

Start Commitボタンをクリックします
コメントを入力してCommit new fileをクリックすると設定ファイルが作成されます

今後このファイルを修正してワークフローを作っていきます
シェルスクリプト実行用のDockerfileを作成する
次にaction-shellというディレクトリを作ってその中にDockerfileなどを作っていきます
- action-shell/Dockerfile
FROM centos:centos7 LABEL "com.github.actions.name"="Hello World" LABEL "com.github.actions.description"="Write arguments to the standard output" LABEL "com.github.actions.icon"="mic" LABEL "com.github.actions.color"="purple" ADD entrypoint.sh /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"]
- action-shell/entrypoint.sh
#!/bin/sh -l sh -c "echo $*"
設定ファイルをいじってみます
- .github/main.workflow
workflow "sample-workflow" {
on = "push"
resolves = ["exec shell"]
}
action "exec shell" {
uses = "./action-shell"
args = "hello! args"
}
workflowのブロックでは呼び出すアクションをresolvesで指定します
今回だとexec shellが呼び出されます
sample-workflowの中のonという項目でどのイベントをトリガーとするか記述します
アクションの方ではDockerイメージを作るためのDockerfileがあるディレクトリをusesで相対パス指定するとイメージ作成から実行までしてくれます
argsには実行する時の引数を渡してあげます。
このあたりはDockerを使って何かやったことがあれば一緒なのでイメージしやすいかと思います
pushしてみると

実行中のようです
しばらく待つと

成功したようなのでLogから何を行ったか見てみます

指定したargsが出力されていますね
prettierを自動実行させてみる
次にサンプルとしてprettierを実行して自動でpushさせるようにしてみます
先に作ったものをビジュアル化するとこうなります

featureブランチのみタスクを実行させる
「特定ブランチにpushされた時のみ動作させる」のは公式が出しているactins/binを使うと簡単にできます
actions/bin: A collection of utilities for developing and running GitHub Actions
- .github/main.workflow
workflow "sample-workflow" {
on = "push"
resolves = ["exec prettier"]
}
action "is-feature-branch?" {
uses = "actions/bin/filter@master"
args = "branch feature/*"
}
action "exec prettier" {
uses = "./action-prettier"
needs = ["is-feature-branch?"]
}
usesでactions/bin/filter@masterと指定します
argsでbranch feature/*と指定することでブランチ名の先頭にfeature/が入ったブランチに対してのみ実行させることができるようになります
このあたりのスクリプトは中身読めばわかりますがただのシェルスクリプトなので参考にして何か作っても良さそうです
ここではworkflowブロックで指定したexec prettierのアクションブロックでneedsというものが指定されています
このneedsは依存関係を表していてexec prettierを実行する前にneedsで指定したアクションが実行されている(失敗していない)必要があります
なので順番的には
- is-feature-branch?
- exec prettier
の順にアクションが呼び出されます
prettierを実行するイメージを作成する
それではprettierを実行するイメージを作ってみます
- action-prettier/Dockerfile
FROM node RUN npm install --global prettier RUN npm cache --force clean ADD entrypoint.sh /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"]
- action-prettier/entrypoint.sh
#!/bin/sh prettier --single-quote --parser typescript --write "./**/*.ts" git status
サンプルのファイルを作ります
- tsfiles/sample.ts
const word = "Hello!! Github Actions";
ブランチを切って実行してみると

実行されていることが確認できました
自動で行った変更をリポジトリにpushする
今度はprettierでかけた変更を自動でリポジトリにpushしてみたいと思います
シェルスクリプト中にgitコマンドを追記してpushしてみます
pushに関してはTOKENが必要なのでsecretsにGITHUB_TOKENを指定します
- .github/main.workflow
workflow "sample-workflow" {
on = "push"
resolves = ["exec prettier"]
}
action "is-feature-branch?" {
uses = "actions/bin/filter@master"
args = "branch feature/*"
}
action "exec prettier" {
uses = "./action-prettier"
needs = ["is-feature-branch?"]
secrets = ["GITHUB_TOKEN"]
}
- action-prettier/entrypoint.sh
#!/bin/sh
prettier --single-quote --parser typescript --write "./**/*.ts"
git config user.name swfz
git config user.email swfz@users.noreply.github.com
git add .
git commit -m 'prettier'
git push "https://${GITHUB_TOKEN}@github.com/swfz/gh-action-sample.git"
pushしてみると

成功しているようですね
無事コミットログにも残っています

変更もされていますね

サンプルだったのでべた書きで同じユーザー名にしてしまいましたが自動コミット用のユーザーを作ってpushさせたりevent.jsonをパースしてpushしたユーザーを特定して指定するのが良いかと思います
まとめ
駆け足ではありますがGitHub Actionsが使えるようになったので試してみました
基本的にはDockefileを用意すればOKなのでだいたいのことはできそうですね
最初GUIからやってみようかと思ったものあまり理解が進まなかったのでファイルを直接編集してpushして試してみました
ある程度感覚がつかめてきたので次はGUIでいじってみたいと思います
使い道としては
- ライブラリのパブリッシュ
- 静的サイトのデプロイ
- 自動レビュアーアサイン
- vulnerability_alertというイベントがもあるのでアラートが来たら対象のモジュールのバージョンを上げてPR出す
- etc...
など色々できそうです。
また、ある程度触ってみると簡単にいろいろなことができるようになると思うので地味に面倒な作業を自動化するといいかなと思います
今後が楽しみです
次はFさんの記事です。
http://blog.engineer.adways.net/entry/advent_calendar_2018/12