これまでこのサイトの更新は、ファイルをscpで送ってdocker01で deploy.sh を実行していた。これをForgejoにpushするだけで終わるようにした。
全体の流れ
- Forgejo(git01)の
chiwa/wwwにpushする - CI用のVM(runner01)がジョブを受け取る
- runner01がdocker01にSSHでログインする
- docker01の
deploy.shがgit pull→ ビルド → 反映する
runner01を作る
ノード③用のcloud-initテンプレート(9004)がまだなかったので、まずそれを作った。
qm create 9004 --name tpl-ubuntu2404-infra --memory 2048 --cores 2 --cpu host \
--net0 virtio,bridge=vmbr0,tag=20 --scsihw virtio-scsi-single --agent enabled=1 \
--ostype l26 --serial0 socket --vga serial0
qm set 9004 --scsi0 local-zfs:0,import-from=/root/noble-server-cloudimg-amd64.img,discard=on,iothread=1,ssd=1
qm set 9004 --ide2 local-zfs:cloudinit --boot order=scsi0
qm set 9004 --ciuser chiwa --sshkeys /root/chiwa.pub --ipconfig0 ip=dhcp
qm template 9004
あとはクローンしてIPアドレスを決めるだけで、1分でVMが立つ。
初回起動の直後に apt を使おうとしたら、Could not get lock と出た。裏でcloud-initと自動アップデートが動いているだけなので、終わるまで待てばいい。ロックファイルを消すのはやめたほうがいい。
cloud-init status --wait
ハマったこと:Runner v13は register しない
Forgejo Runner(v13.2.0)を、昔の手順どおり forgejo-runner register で登録しようとしたら失敗した。
`register` has been deprecated; declare connections in the runner configuration instead
Error: runner registration token not found
今は、Forgejoの画面で「新しいランナーを作成」を押して出てくる UUIDとトークンを、設定ファイルに直接書く方式になっている。
runner:
capacity: 1
labels:
- "docker:docker://node:20-bookworm"
server:
connections:
git01:
url: http://<git01>:3000/
uuid: (画面に出たUUID)
token: (画面に出たトークン)
これで起動すると、declared successfully と出てつながった。
デプロイ用の鍵は「deploy.shしか動かせない」ようにする
runner01からdocker01にSSHするための鍵を作って、秘密鍵はForgejoのシークレット(DEPLOY_KEY)に入れた。
docker01の authorized_keys には、command= を付けて登録している。
command="/opt/apps/www/deploy.sh",no-pty,no-port-forwarding,no-agent-forwarding,no-X11-forwarding ssh-ed25519 AAAA... runner-deploy
この鍵でログインすると、何を打っても deploy.sh だけが実行されて切れる。万が一鍵が漏れても、サイトの反映しかできない。
ワークフロー
.forgejo/workflows/deploy.yml はこれだけ。
name: deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: docker
steps:
- name: docker01で反映
run: |
mkdir -p ~/.ssh
echo "${{ secrets.DEPLOY_KEY }}" > ~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_ed25519
ssh -o StrictHostKeyChecking=accept-new chiwa@<docker01>
ついでに:Googleに出るようにした
ビルドのときに sitemap.xml と robots.txt も作るようにして、Google Search Consoleに登録した。記事を足すとサイトマップも自動で更新される。
この記事も、Forgejoの画面でファイルを作ってコミットしただけで公開されている(はず)。