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タブを選択
Python applicationoを選択
表示されていない場合は展開して探してください
そうするとエディタが立ち上がりますので、保存すると適切な位置に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の際に読み出すことができます
名前から入力する値は推測できるかと思うのですが、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やばいかも..?
読んでいただきありがとうございます!お役に立てたら幸いです!
改善版の記事書きました