Intro
celpa.conao3.comは私が契約している100GBの「さくらのレンタルサーバー」を向いているのだけど、その公開ディレクトリにGitHub Actionsからrsyncでデプロイしたい。
もちろん、GitHubのワーカーに秘密鍵をアップロードすることになるので、その秘密鍵は上手い具合に制限を設ける必要があります。
ローカルで試していたとき上手くいかなかったので、そのメモ。
普通のrsync
rsyncは接続先のサーバーにrsyncを起動して、そのプロセスと通信します。
どんなコマンドが実行されているかは -vvv
オプションを付けることで表示されます。
$ rsync -vvv -an README.md conao3@conao3.sakura.ne.jp:/home/conao3/
opening connection using: ssh -l conao3 conao3.sakura.ne.jp rsync --server -vvvnlogDtpre.iLsfxC . /home/conao3/ (9 args)
sending incremental file list
[sender] make_file(README.md,*,0)
...
sent 60 bytes received 368 bytes 285.33 bytes/sec
total size is 15,379 speedup is 35.93 (DRY RUN)
[sender] _exit_cleanup(code=0, file=main.c, line=1189): about to call exit(0) (DRY RUN)
opening connection using
の行の rsync
以降が接続先で実行されているコマンドです。
そのため、そのコマンドだけ実行できる鍵を登録するには以下のように authorized_keys
に登録します。 (-vvv
はいらないので削る)
command="rsync --server -nlogDtpre.iLsfxC . /home/conao3/",no-port-forwarding,no-X11-forwarding,no-agent-forwarding ssh-rsa AAAA...
rsyncdを使ったrsync
鍵の作成
rsync用の鍵を新しく作る。 GitHub Actionsのsshが古く、Openssh形式の秘密鍵が読めなかったのでPEM形式で出力するようにオプションを付けた。
鍵の名前は sakura-rsync_rsa
と入力した。
cd .ssh
ssh-keygen -t rsa -b 4096 -m PEM -C ""
鍵の登録
ファイルをやりとりしたいサーバーにログインし、 authorized_keys
に公開鍵 sakura-rsync_rsa.pub
を登録する。
command="rsync --server --daemon --config=/home/conao3/.rsyncd.conf .",no-port-forwarding,no-X11-forwarding,no-agent-forwarding ssh-rsa AAAA...
rsyncd.confの作成
私が使っているのは共有サーバーなので、当然、ユーザーホーム以下しか触れない。
そのため rsyncd.conf
は ~/.rsyncd.conf
に作成することにしました。
use chroot = no
read only = yes
[www]
read only = no
write only = yes
path = /home/conao3/www
[cache]
path = /home/conao3/www/files/cache-40bbae27
使ってみる
なぜかファイル転送されない。。。
$ rsync -vvv -e "ssh -i sakura-rsync_rsa" /home/conao/dev/template/elisp conao3@conao3.sakura.ne.jp::foo/
opening connection using: ssh -i sakura-rsync_rsa -l conao3 conao3.sakura.ne.jp rsync --server --daemon . (10 args)
sending daemon args: --server -vvve.LsfxC . foo/ (4 args)
skipping directory elisp
send_file_list done
send_files starting
send_files phase=1
send_files phase=2
send files finished
total: matches=0 hash_hits=0 false_alarms=0 data=0
sent 16 bytes received 11 bytes 18.00 bytes/sec
total size is 0 speedup is 0.00
[sender] _exit_cleanup(code=0, file=main.c, line=1189): about to call exit(0)
-a
オプションを付けると転送された。
$ rsync -a -vvv -e "ssh -i sakura-rsync_rsa" /home/conao/dev/template/elisp conao3@conao3.sakura.ne.jp::foo
opening connection using: ssh -i sakura-rsync_rsa -l conao3 conao3.sakura.ne.jp rsync --server --daemon . (10 args)
sending daemon args: --server -vvvlogDtpre.iLsfxC . foo/ (4 args)
sending incremental file list
[sender] make_file(elisp,*,0)
send_file_list done
[sender] pushing local filters for /home/conao/dev/template/elisp/
[sender] make_file(elisp/README.org,*,2)
[sender] make_file(elisp/Makefile,*,2)
[sender] make_file(elisp/elisp-template.el,*,2)
[sender] make_file(elisp/.github,*,2)
[sender] make_file(elisp/elisp-template-tests.el,*,2)
[sender] make_file(elisp/git-hooks,*,2)
[sender] make_file(elisp/.gitignore,*,2)
[sender] make_file(elisp/LICENSE,*,2)
[sender] make_file(elisp/Cask,*,2)
send_files starting
GitHub Actionsから使う
こんなファイルを .github/workflows/test.yml
に保存すればできる。
「GitHub ActionsでSSHを使う - Qiita」で紹介されていた shimataro/ssh-key-action
を使わせてもらいました。
name: Main workflow
on:
push:
branches:
- master
pull_request:
branches:
- master
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
emacs_version:
- '26.3'
steps:
- uses: actions/checkout@v1
- uses: actions/setup-python@v1.1.1
- uses: purcell/setup-emacs@master
with:
version: ${{ matrix.emacs_version }}
- uses: conao3/setup-cask@master
- name: Install SSH key
uses: shimataro/ssh-key-action@v1
with:
private-key: ${{ secrets.SSH_KEY }}
public-key: ${{ secrets.SSH_KEY_PUBLIC }}
known-hosts: ${{ secrets.KNOWN_HOSTS }}
- name: Cache fetch
run: |
rsync -av --progress -e 'ssh' conao3@conao3.sakura.ne.jp::cache/celpa.tar.gz /tmp/
rm -rf working
tar xf /tmp/celpa.tar.gz
- name: Build
run: |
make
- name: Deploy
run: |
rsync -av -e 'ssh' --delete --exclude=working ./ conao3@conao3.sakura.ne.jp::www/celpa/
- name: Cache push
run: |
rm /tmp/celpa.tar.gz
tar czf /tmp/celpa.tar.gz working
rsync -av --progress -e 'ssh' /tmp/celpa.tar.gz conao3@conao3.sakura.ne.jp::cache/
まとめ
rsyncを使ってサイトをGitHub Actionsからデプロイできるようになりました。