GitHub Actions を触ってみた

GitHub 上で CI/CD を実現できるコンテナ・パイプライン機能である GitHub Actions を使ってみた。

お試ししたリポジトリは以下。

目次

まずはテキトーに動かしてみる

使い方がよく分からないが、いきなり解説記事を読んでもやっぱりよく分からないので、試しに動かしてみる。

新規リポジトリを作り、「Actions」タブに移動する。

Actions タブ

「Simple workflow」というサンプルっぽいヤツを試してみる。「Set up this workflow」ボタンを押す。

すると次のようなエディタ画面に移動する。自分で調べながらコメントを付け足してみた。

適当に書く

GitHub 画面上でこのファイルをコミットしてみると、早速ワークフローが動いた。トリガーとなるイベントを on: [push] と実装していたので、GitHub 画面上でコミットした場合は git push と同じ扱いになり、動作したというワケ。

動作した

ジョブを選択し、右端の3点リーダアイコン から View raw logs を押下すると、詳細なログが見える。

ログを見る

見てみると、確かにワークフローで実装していた echo コマンドの動作が確認できた。

詳細確認

Secret : クレデンシャル情報を渡してみる

続いて、よくありそうな仕組みとして、アクセストークンやパスワードなどのクレデンシャル情報を別に定義しておいて、ジョブ内で使用するというモノだ。

GitHub 画面の「Settings」タブより「Secrets」メニューに進み、「Add a new secret」リンクを押してシークレットを追加する。

Settings で追加する

今回はサンプルとしてどうでもいい文字列を追加した。my-password-value が、パスワードとして使用する文字列の「テイ」だ。

こんな感じで

追加するとこのような画面になる。一度追加したシークレットは、中身を参照したり変更したりできないので注意。値を変更したい場合は一度「Remove」してから同名で作成することになる。

中身は分からなくなる

このシークレットを、ワークフロー内のシェルスクリプトで利用してみる。シェルスクリプト内の環境変数として利用できるようにするには、env プロパティにてシークレットを渡しておく必要がある。

シークレットを使う

- name: Run a multi-line script
  env:
    NEOS_EXAMPLE_PASSWORD: ${{ secrets.NEOS_EXAMPLE_PASSWORD }}
  run: |
    echo "This is Secret : [ ${NEOS_EXAMPLE_PASSWORD} ]"
    echo "${NEOS_EXAMPLE_PASSWORD}" > ./test.txt
    cat ./test.txt
    echo 'Finished'

ちょっとイジワルだが、シークレット情報を echo したり、ファイルに書き出して cat したりしてみる例だ。

コレをコミットして実行させてみたが、ログには一切パスワード文字列が出力されなかった。コレは安全である。

シークレットはログ出力されない。優秀

ちなみに、ワークフローの YAML ファイルに問題があったりすると、次のようにエラーとなる。

YAML 構文エラー

成功・失敗・実行中というステータスの他、「手動でジョブを中断 (Cancel)」ということもできる。

キャンセルも可能

もう少し複雑な例として、Node.js スクリプトから、あるサーバに FTP 接続する、というスクリプトを作ってみた。

name: Node CI
on: [push]
jobs:
  build:
    name: Node.js Job
    runs-on: ubuntu-latest
    steps:
    - name: Checkout
      uses: actions/checkout@v1
    - name: Use Node.js v10
      uses: actions/setup-node@v1
      with:
        node-version: '10.x'
    - name: Run npm Scripts
      env:
        MY_FTP_PASS: ${{ secrets.MY_FTP_PASS }}
      run: |
        npm install
        npm run ftp

package.jsonscripts にて、npm run ftp が動作するよう npm-run-scripts を定義しておく。

{
  "scripts": {
    "ftp": "node ftp.js"
  }
}

ftp.js 内の実装、promise-ftp という npm パッケージを使って FTP 接続するようにしている。シークレットで定義した MY_FTP_PASS を環境変数から読み取るため、次のように実装している。

const PromiseFtp = require('promise-ftp');
const promiseFtp = new PromiseFtp();

promiseFtp.connect({
  user    : 'example-user',
  password: process.env.MY_FTP_PASS,
  host    : 'example.com'
})
  .then((serverMessage) => {
    console.log('★ Connected ', serverMessage);
  });

Node.js は process.env.MY_FTP_PASS という風に書くことで環境変数を参照できるので、このように書いている。

コレを実行してみると、無事シークレット情報が渡されて正常動作したのだが、全角文字 (上のコードの 部分) が文字化けしていた。

日本語は文字化けした

日本語のログ出力には対応していなさそうなので、注意が必要だ。

結構使えるやんけ!

以上がザッと使ってみた例。結構使えそうだ。

構文の勉強

もう少し使い方を調べるため、以下の公式の記事を見てみた。

最初はなかなかとっつきにくかったが、ひとしきりサンプルの Workflow や Action を使ってみた後に読むとよく分かった。

その他、構文に関しては以下の記事が参考になった。

他に何ができるの?の参考に

その他にどんなことができそうかは、具体的なコードを見た方がイメージが湧くと思うので、Qiita で色々記事を集めてみた。参考までに。

以上

実行基盤に Ubuntu だけでなく、Windows と MacOS も使えるようなので、クロスブラウザテストや iOS アプリのテストなんかもできそうだ。

無料でガンガン使えるので、どんどん活用していこうと思う。