* 当サイトはアフィリエイト広告を利用しています。

DevOps

GitHub Actions導入メモ

今回はCIツールの一つであるGitHub Actionsを導入したときのメモを書いていきます。

パプリックリポジトリは無料、Privateリポジトリも制限はありますが、無料で使用可能です。

 

GitHub Actionsはじめました

GitHub Actionsとは

GitHub ActionsはGitHubが公式に提供しているCI/CDツールです。

プロジェクトに応じて数多くのテンプレートが使用可能で、比較的簡単にセットアップ出来ます。何よりGitHubが提供しているツールということで、GitHubを使っていれば簡単に導入できますし、今後も期待できるツールになっています。(逆に言えばまだまだ発展途上とも言えますが...)

 

私はCIツールとしてはJenkinsも使っていたのですが、Jenkinsはプラグインの導入やセッティングが面倒でしたし、プラグインが多い分検索しても分かりづらいというデメリットも感じていました。

GitHub Actionsの場合はそこまで複雑な作業は必要なく導入が可能でした。

 

具体的な使い方

GitHub Actionsではworkflowというものをymlファイルで指定することで自動化プロセスを指定することが出来ます。

まずGitHubのプロジェクトのメニュー「Actions」タブを選択します。

Actionsタブを開くとデプロイ用のworkflowや、様々な言語のCI用workflowのテンプレートが選択できます。目的のものがあればそれを選びますし、「Simple workflow」から書いていくことも可能です。

 

 

今回やりたいことは以下の通り。

  1. 全てのpull requestに対してテスト実行

     

  2. テストはプロジェクト内のDockerfileで指定した通りに実行

     

  3. pull requestがmasterブランチにマージされたタイミングでデプロイ

 

テストのworkflow

まずはテストのworkflowを作成します。.github/workflows/test.ymlを作成します。

name: Test

on:
  # Run tests for any PRs.
  pull_request:

jobs:
  # Run tests.
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Run tests
        run: |
          docker build . --file Dockerfile --target test -t memorybank-backend:test
          docker container run memorybank-backend:test

大まかに説明すると以下の通りです。

  • on:で実行するタイミングを指定できます。上の例ではpull_requestを指定。
  • jobs:以下にジョブを書いていきます。上の例ではtest:ジョブを作成。
  • ジョブはランナー上で実行されます。上の例ではruns-on: ubuntu-latestを指定。
  • ジョブは複数のステップから構成されます。
  • ステップ内では任意のコマンドやアクションを指定出来ます。
  • 上の例ではuses: actions/checkout@v2としてソースコードをチェックアウトするアクションを指定しています。
  • アクションはcheckoutなどの公式が提供しているものもありますし、ユーザが公開しているものを利用することも出来ます。

 

用語は以下を参考に。

 

これでPull Requestの度にテストが実行されるようになります。

 

デプロイのwokflow(準備)

次にデプロイのworkflowも書いていきますが、その前に準備をする必要があります。

デプロイサーバーの認証情報の登録

デプロイworkflowではサーバーにssh接続をするため、必要な情報(ユーザ名・SSHの鍵情報・パスフレーズなど)を事前に定義しておきましょう。

補足

GitHubのプロジェクトからSettingsタブ→Secretsに進み変数を登録出来ます。

例えば事前にSERVER_USERNAMEと登録したとするとworkflow内で${{ secrets.SERVER_USERNAME }}で呼び出すことが出来ます。

 

Deploy Keyの設定

次にサーバーでリポジトリをpullしてくるときにユーザ名やパスワードを入力する手間を省くために、GitHubのDeploy Keyを設定しておきます。

サーバー側でssh-keygenを実行しpublic keyをDeploy Keyとして登録しておきます。キーを生成するときはパスフレーズは空にしておきます。

ssh-keygen -t rsa -b 4096 -C "メールアドレス"

 

deploy keyはGitHubのsettings→Deploy Keysから登録できます。

 

pullできることを確認

Deploy Keyの登録後、デプロイサーバーでユーザ名・パスワードなしでpullができることを確認しておきます。

git clone git@github.com:ユーザ名/リポジトリ名.git

でクローン、さらにgit pullを実行し、問題なくpull出来ることを確認しておきます。

 

最後にサーバーで動かしたいスクリプトや処理を事前に確認しておきましょう。

 

デプロイのworkflow

ではに実際にデプロイのworkflowを書いていきます。

以下がデプロイのworkflowの一例です。

name: Deploy

on:
  pull_request:
    types: [closed]
    branches:
      - master

jobs:
  # deploy only pull-request merged into master branch
  deploy:
    if: github.event.pull_request.merged
    runs-on: ubuntu-latest
    steps:
      - name: deploy (run container), with ssh
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.SERVER_IP }}
          port: ${{ secrets.SSH_PORT }}
          username: ${{ secrets.SERVER_USERNAME }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          passphrase: ${{ secrets.SSH_PASSPHRASE }}
          script: |
            cd ${{ secrets.SERVER_PROJECT_DIR }}
            git pull origin master
            echo ${{ secrets.SERVER_PASSWORD }} | sudo -S docker-compose down
            echo ${{ secrets.SERVER_PASSWORD }} | sudo -S docker-compose up --build -d

 

on:の部分ではpull requestがcloseされた場合に実行されるように指定し、実際の処理部分でif文によってmergeされたときのみ実行されるようにしてあります。(branchはmasterのみに指定)

 

今回はSSH接続でコマンドを実行するため、Marketplaceで公開されているアクションappleboy/ssh-action@masterを使用しています。

with:以下にssh接続情報を書き、script:以下に動かしたいスクリプトを書きます。

 

準備が完了したらPull Requestを作成し、テストが動作することを確認。その後masterブランチにmergeし、デプロイworkflowが実行されることを確認して下さい。

 

 

以上です。

-DevOps
-