ひさふぃの日記

DjangoとPythonとLaravelが好き。大阪でフリーランスエンジニアやってます。

GitHubActions入門|VPSに自動デプロイ(CI/CD)設定したのでまとめた

役に立ちそうな人

Github Actions触ってみたい人
自宅鯖 or VPSにて運用しているサーバーに自動デプロイしたい人

役に立った

初めて触る物についてざっくり概要把握するのは動画が最強だと思う
今までは簡単な書籍やブログを見てたけども動画の方が断然イメージがつきやすい
https://www.youtube.com/watch?v=mazvbhFZtT8
https://www.youtube.com/watch?v=F3wZTDmHCFA

SSH接続に関しては下記の記事を参考にさせてもらった。まじ感謝
https://m0rter.anyfrog.net/2020/205/

設定

ymlファイルの作成とシークレット情報の登録のみで使えます

ymlファイル

.github/workflows/
上記のパスでファイルを作成するだけ
githubのページからtemplateを作成できます
今回はpythonを使った例です
ちなみに最終的なymlファイルは下記

# This workflow will install Python dependencies, run tests and lint with a single version of Python
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions

name: Python application

on:
  push:
    branches: [ master ]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Set up Python 3.8
      uses: actions/setup-python@v2
      with:
        python-version: 3.8
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install flake8 pytest
        if [ -f src/requirements.txt ]; then pip install -r src/requirements.txt; fi
    - name: Lint with flake8
      run: |
        # stop the build if there are Python syntax errors or undefined names
        flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
        # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
        flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
    - name: Test with pytest
      run: |
        pytest
    - name: Deploy
      env:
        SECRET_KEY: ${{ secrets.SECRET_KEY }}
        SSH_USER: ${{ secrets.SSH_USER }}
        SSH_ADDR: ${{ secrets.SSH_ADDR }}
        SSH_PORT: ${{ secrets.SSH_PORT }}
        SSH_COMMAND: ${{ secrets.SSH_COMMAND }}
      run: |
        echo "$SECRET_KEY" > secret_key
        chmod 600 secret_key
        ssh -oStrictHostKeyChecking=no ${SSH_USER}@${SSH_ADDR} -i secret_key -p ${SSH_PORT} "$SSH_COMMAND"
  • まずテンプレートを用意します
    githubで作成済みレポジトリからActionsタブを選択
    f:id:hisafi:20200628113203p:plain

Python applicationoを選択
表示されていない場合は展開して探してください
f:id:hisafi:20200628113208p:plain

そうするとエディタが立ち上がりますので、保存すると適切な位置にymlファイルを作成できます

  • Install dependenciesステップの調整
    ちなみに私はpipのパッケージの出力を./src/requirements.txtにおいていますので調整しています
if [ -f src/requirements.txt ]; then pip install -r src/requirements.txt; 
  • デプロイ用のstep作成
    上記の例ですと- name: Deployの部分ですね
    こちらの記事を読んでもらう方がわかりやすいと思うのですが一応解説
    envにてGithub Actionsにシークレットとして登録した値を読み出して、runにてシークレットキーの作成+ssh接続後のコマンド実行
    といった感じになります
    未知のホスト鍵の確認を無視するために-oStrictHostKeyChecking=noは忘れないようにしましょう

シークレットの登録

コードに残したくない情報。例えば秘密鍵やホスト名などはGithubの方に登録してCI/CDの際に読み出すことができます f:id:hisafi:20200628113212p:plain 名前から入力する値は推測できるかと思うのですが、SSH_COMMANDだけ軽く補足しておきます
こちらは接続先のサーバーのコマンドを書きます 私はdocker-composeで運用しているサーバーでしたので下記のようになります
通常は対象のソースがあるディレクトリまでのcdとgit pullまでで良さそうです

cd /var/www/html && git pll && docker-compose -f docker-compose.yml -f prod-compose.yml up -d

CI/CDを試す

今回のフックは下記のようになっています
ので、masterブランチがpush(プルリクマージとか)されたときにジョブが走ります
Actionsタブにて成功したか失敗したかわかりますので確認してみてください

on:
  push:
    branches: [ master ]

まとめ

まとめてみて改めて実感しますけど、すごい楽ですねこれ
特に連携等を意識する必要もありませんし、templateも豊富、機能もどんどん追加されていきそうですしね
CircleCIやばいかも..?
読んでいただきありがとうございます!お役に立てたら幸いです!

改善版の記事書きました

hisafi.hatenablog.com

GitHub Actions 実践入門 (技術の泉シリーズ(NextPublishing))