ConoHa WINGにGitHub Actionsでデプロイする

ConoHa WINGにGithub Actionsから自動デプロイを試したときのメモ

サーバ側で秘密鍵を用意

ConoHa WINGのコントロールパネルでSSH Keyを登録してプライベートキーをダウンロード。

接続情報等を後ほど使用するので登録情報のページを開いておくか、メモする。

GitHubのsecretsに秘密鍵その他を登録

Settings の Secrets を開き、右上のNew repository secretを押下。

[Name]に使用する際の定数名を記入、[Value]に先程ダウンロードしたプライベートキーの中身を貼り付け。

全文を丸々貼り付ける

-----BEGIN RSA PRIVATE KEY-----
XXXXXXX...
〜
XXXX...
-----END RSA PRIVATE KEY-----

Nameに入力した定数名は後ほど[secrets.定数名]の形で使用する。

接続情報もここで登録すれば、後ほど定義するワークフロー内で定数として使用することができる。

今回は以下を登録した。

SSH_HOSTコントロールパネルで確認したSSHの[ホスト名]
SSH_KEYプライベートキーの中身をコピペ
SSH_PORTコントロールパネルで確認したSSHの[ポート番号]
SSH_USERコントロールパネルで確認したSSHの[ユーザー名]

GitHubのActionsにワークフローを登録する。

GitHub > Actions を開くと、一つも登録が無い状態だと雛形がサジェストされた画面が開くが今回は全部すっ飛ばして、「set up a workflow yourself」 をクリックする。

開いたエディタに以下を貼り付けて、「Start commit」を押下して保存する。

name: CI

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

  workflow_dispatch:

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
       - uses: actions/checkout@v2 
       - name: ssh key generate
         run: echo "$SSH_PRIVATE_KEY" > key && chmod 600 key
         env:
           SSH_PRIVATE_KEY: ${{ secrets.SSH_KEY }}
       - name: rsync deployments
         uses: burnett01/rsync-deployments@5.1
         with:
           switches: -avz --delete
           path: ./
           remote_path: ~/public_html/waldgrun.conohawing.com/taniku/wp-content/plugins/my-snow-monkey
           remote_host: ${{ secrets.SSH_HOST }}
           remote_user: ${{ secrets.SSH_USER }}
           remote_port: ${{ secrets.SSH_PORT }}
           remote_key: ${{ secrets.SSH_KEY }}

これは指定したファイル名(デフォルトだと「/workflows/main.yml」)をブランチ(デフォルトだとmaster or main)へコミットする処理となり、それをトリガーに上記の処理が走る。

以後、指定したブランチ(ここではmaster)にプッシュされたらこのワークフローが走ってサーバにデプロイされる。

最初に参考にした記事の記述はエラーで動かず、他のいくつかの記事を参考にして上記にたどり着いた。

エラー

試行過程で発生したエラーと対処をメモ

ConoHaでrsync動かない問題

当初rsyncがタイムアウトしてしまい、調べると少し前までConoHaはrsyncに対応していなかったようでそれが原因かと思い色々と試したが、実際には現在は対応しているらしく、rsyncではなく記述の問題だったようだ。

Load key “/home/runner/.ssh/id_rsa”: invalid format

GitHubに秘密鍵を登録する際、全文を余さずコピーする必要があったがコピペの仕方が悪く上下の1行が欠けていた(—–BEGIN RSA PRIVATE KEY—–など)それらを含めて秘密鍵の登録を更新することで解消。

ユーザー名@ホスト名:Permission denied (publickey).

コントロールパネルから生成された公開鍵の所有者がrootであることから発生していたと思われる。

ターミナルからsshログイン(後述)して所有者を変更することで解消。

chmod 600 ~/.ssh/authorized_keys
chown <ユーザー名> ~/.ssh/authorized_keys
chgrp <ユーザー名> ~/.ssh/authorized_keys

ただし様々な要素を複合して検証していたため、これが直接の原因かどうかは実際には曖昧。

sshログインについて

上記の所有者変更についてはサーバ側でコマンドで実行する必要があったためターミナルからsshログインして実行した。ターミナルからのログインにあたってはローカル(mac)側で秘密鍵を~/.ssh/フォルダに置き、ログインの際にそれをパラメータ指定する必要があった。

ssh SSHユーザー名@SSHホスト名 -p 8022 -i ~/.ssh/秘密鍵ファイル名.pem

なおその際に用いる秘密鍵ファイルのパーミッションがゆるいと怒られるので、然るべきパーミッションに設定する必要がある。

chmod 600 ~/.ssh/秘密鍵ファイル名.pem

rsyncの書き方問題

動かなかった例を列記する。

参考にした記事からのコピペであり、実際の記述とは異なる。

パラメータ等よく理解していない部分で要不要あったと思われるが、最終的に冒頭に書いた記述で正常に動いた。

       - name: rsync deploy
         run: rsync -vrlp -e "ssh -p [ポート番号] -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" ./ [ユーザーID]@[known_hostsと同じ]:/home/[ディレクトリ]/public_html/[ディレクトリ]
      - name: push with rsync
        run: rsync -rlptgoD -O --delete --exclude ".git/" -e "ssh -i .ssh/id_rsa -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p ${SSH_PORT}" dist/ $SSH_USER@$SSH_HOST:$DIR
        env:
          DIR: ~/public_html/hoge
          SSH_HOST: ${{ secrets.SSH_HOST }}
          SSH_USER: ${{ secrets.SSH_USER }}
          SSH_PORT: ${{ secrets.SSH_PORT }}