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