本文へ移動
ch1w4

www.ch1w4.com / blog / runner-auto-deploy

pushしたらサイトが勝手に更新されるようにした(Forgejo Actions)

#forgejo#ci#homelab

これまでこのサイトの更新は、ファイルをscpで送ってdocker01で deploy.sh を実行していた。これをForgejoにpushするだけで終わるようにした。

全体の流れ

  1. Forgejo(git01)の chiwa/www にpushする
  2. CI用のVM(runner01)がジョブを受け取る
  3. runner01がdocker01にSSHでログインする
  4. 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の画面でファイルを作ってコミットしただけで公開されている(はず)。