GitHub Actionsを触ってみる

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.com

独自でアクションを定義してつなげることでワークフローを作成できます。

ドキュメント

GitHub Actions | GitHub Developer Guide

developer.github.com

結構丁寧に書いてあるので読めばわかると思います。

実際にやってみて感覚掴むのも大事だと思うのでやってみます。

作って実行してみる

GUIで作る方法とファイルを直接編集してpushする方法があります

今回は最初だけGUIで作ってあとは直接編集します

招待メールが来ていればプライベートリポジトリにこんなタブができています

f:id:AdwaysEngineerBlog:20181217131304p:plain

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

適当なworkflow名を入れてクリックして

f:id:AdwaysEngineerBlog:20181217131337p:plain

Start Commitボタンをクリックします

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

f:id:AdwaysEngineerBlog:20181217131353p:plain

今後このファイルを修正してワークフローを作っていきます

シェルスクリプト実行用の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してみると

f:id:AdwaysEngineerBlog:20181217131418p:plain

実行中のようです

しばらく待つと

f:id:AdwaysEngineerBlog:20181217131429p:plain

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

f:id:AdwaysEngineerBlog:20181217131439p:plain

指定したargsが出力されていますね

prettierを自動実行させてみる

次にサンプルとしてprettierを実行して自動でpushさせるようにしてみます

先に作ったものをビジュアル化するとこうなります

f:id:AdwaysEngineerBlog:20181217131452p:plain

featureブランチのみタスクを実行させる

「特定ブランチにpushされた時のみ動作させる」のは公式が出しているactins/binを使うと簡単にできます

actions/bin: A collection of utilities for developing and running GitHub Actions

github.com

  • .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?"]
}

usesactions/bin/filter@masterと指定します

argsbranch 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";

ブランチを切って実行してみると

f:id:AdwaysEngineerBlog:20181217131512p:plain

実行されていることが確認できました

自動で行った変更をリポジトリにpushする

今度はprettierでかけた変更を自動でリポジトリにpushしてみたいと思います

シェルスクリプト中にgitコマンドを追記してpushしてみます

pushに関してはTOKENが必要なのでsecretsGITHUB_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してみると

f:id:AdwaysEngineerBlog:20181217131529p:plain

成功しているようですね

無事コミットログにも残っています

f:id:AdwaysEngineerBlog:20181217131538p:plain

変更もされていますね

f:id:AdwaysEngineerBlog:20181217131549p:plain

サンプルだったのでべた書きで同じユーザー名にしてしまいましたが自動コミット用のユーザーを作って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