GitHub Action を使ってみる

はじめに

リリースされてからまだGitHub Actionを使っていなかったので、勉強がてら触ってみた。その際に学んだことをまとめておく。

GitHub Action とは

GitHub Actionは、簡単に言ってしまえばGitHubで使える標準のCI/CDのようなツールだ。独自のワークフローを定義することで、GitHub上の様々なイベントでそれを発火させることができる。設定方法は簡単で、repository/.github/workflows/[ファイル名].yml にTravisのようなYMLファイルを作成するだけ。

使ってみる

今回試してみたのは、このブログの内容をGitHubにpushしたら、自動的に自分のVPSへデプロイするようなCDとしての機能の実現のために利用してみた。対象リポジトリは以下である。

このやりたいことだけ聞くと、Git Hookでもいいと思えるだろうが、今回はGitHub Actionを使ってみるのが目的なので問題無い。この目的のために作成したのが以下のdeploy.ymlだ。

name: Deploy my website to the server
on:
  push:
    branches:
      - master
jobs:
  build:
    name: Build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@master
      - name: copy file via ssh password
        uses: appleboy/scp-action@master
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USERNAME }}
          password: ${{ secrets.PASSWORD }}
          port: ${{ secrets.PORT }}
          source: "docs"
          target: "html"
          rm: true
          strip_components: 1

フォーマットの様相は、あまり他のCIツールと変わらない。onの要素で、masterブランチのpush時に後続の処理を行うような設定にしてある。on: [push, pull_request] のような形でpushとpull-request時に実行することも可能だ。また、scheduleで、cron形式で設定することも可能っぽい。runs-onでは、動作させる環境を指定する。複数の環境で実行したいときはよくある以下のようなMatrix形式の設定をする。

strategy:
  matrix:
    platform: [ubuntu-latest, macos-latest, windows-latest]

次にstepsの子要素で複数の工程を定義することができる。今回は使っていないが、最も基本的なのはrunっぽい。以下のようにして、bashでスクリプトを実行することもできる。

steps:
  - name: Display the path
    run: echo $PATH
    shell: bash

usesでは、他の人が作成したActionを利用できるっぽい。今回は、当該リポジトリのdocsフォルダをサーバにscpしたいので、actions/checkout@masterというActionをまずは実行して、リポジトリをfetchしてcheckoutする。次に、appleboy/scp-action@master というscpを実行するActionを利用した。リポジトリのSecrets機能を使ってクレデンシャルを保存してそれを利用する形で設定する。ここで指定してるパラメータはAction依存なもので割愛するが、シンプルで分かりやすかった。

実際のワークフローの動作している様子は、ここ から確認できる。うまく動作せずに何回も繰り返している様子がわかる。

おわりに

簡単にだがGitHub Actionを使ってみた。この手のツールは色々あるが、個人的にはGitHub上で簡単に利用できるという点でこれから使っていくのは、GitHub Actionにしようと思った。