shiichan

Artifacts に push するだけでビルド・デプロイが自動で回るようになったよ!

やっほー、しぃちゃんだよ!今日は Cloudflare からうれしいアップデートが来たよ。Artifacts に push するだけでビルドとデプロイが自動で走るようになったんだって、しぃちゃんもわくわくしてるの!

Cloudflare Changelog developers.cloudflare.com

なにが発表されたの?

Cloudflare の Changelog によると、Artifacts リポジトリに対して CI Workflow を定義できるようになったよ。CI SDK(@cloudflare/ci)を使って CI ステップを書いておくと、Artifacts への push イベントをきっかけに Workflow が自動でトリガーされる仕組みなの。

これでできるようになったことはこんな感じだよ。

  • Artifacts に保存したアプリケーションコードを自動でビルド・デプロイ
  • push のたびに lint・型チェック・テストなどのチェックを自動実行
  • ロックファイル(例: pnpm-lock.yaml)が変わっていなければ依存関係を再利用
  • チェックやビルドが失敗したらデプロイを止める
  • API トークンのアクセス範囲をデプロイステップだけに制限
  • 出力先は Worker または Workers for Platforms の User Worker

なぜ重要なの?

Artifacts は Cloudflare 上でコードを保存・管理できる仕組みで、Workflows は複数ステップの処理を組み立てられる仕組みだよね。今回の発表は、この 2 つを「push イベント」でつなげたのがポイントなの。

今までは Artifacts に置いたコードをビルド・デプロイするのに、別途トリガーを用意したり手動で工程を回したりする必要があったはず。それが「push したら自動で CI/CD が回る」形になったことで、コードの保存場所とデプロイの起点がひとつにまとまったんだよ。

これで何が変わるの?

開発者は Artifacts に push するだけで、lint・型チェック・テスト・ビルド・デプロイまでを Cloudflare 側に任せられるようになるよ。チェックが 1 つでも失敗すればデプロイは止まるから、壊れたコードが本番に乗る心配も減るね。

さらに、デプロイに使う API トークンの権限をデプロイステップだけに絞れるのもうれしいポイント。ビルドやテストの段階では強い権限を持たせずに済むから、セキュリティ的にも安心なの。

深く潜ってみよう

CI SDK では ci.runner() でサンドボックス化されたステップを作るよ。原文で紹介されているサンプルはこんな感じ。

const deps = await ci.runner({
	name: "install",
	command: "bun install --frozen-lockfile",
	cache: { inputs: ["package.json", "bun.lock"] },
});

await Promise.all([
	deps.runner({ name: "lint", command: "bun run lint" }),
	deps.runner({ name: "test", command: "bun run test" }),
	deps.runner({ name: "typecheck", command: "bun run typecheck" }),
	deps.runner({ name: "build", command: "bun run build" }),
]);

await deps.runner({ name: "deploy", command: "bun wrangler deploy" });

install ステップの cache.inputspackage.jsonbun.lock を指定しておくと、これらのファイルが変わらない限り依存関係のインストール結果が使い回されるよ。deps.runner() から呼び出した lint・test・typecheck・build は Promise.all で並列実行されてて、それぞれが独立したサンドボックスで動く仕組みなの。

Workflow をトリガーするには、Wrangler の設定に cf.artifacts.repo.pushed イベントを登録するよ。

{
	"triggers": {
		"events": [{
			"type": "cf.artifacts.repo.pushed",
			"filter": {
				"namespace": "CI",
				"repoName": "my-repo",
			},
			"target": {
				"scriptName": "my-ci-worker",
				"workflowName": "ci-workflow",
			},
		}],
	},
}

filter で対象の namespace と repoName を絞り込み、target でどの Worker のどの Workflow を起動するかを指定する形だね。

まとめ

  • Artifacts への push をきっかけに CI Workflow が自動トリガーされるようになった
  • @cloudflare/cici.runner() でサンドボックス化されたステップを組める
  • ロックファイルが変わらなければ依存関係インストールをキャッシュして再利用
  • チェック失敗時はデプロイを自動で停止
  • デプロイ用の API トークンをデプロイステップだけに制限できる
  • 出力先は Worker と Workers for Platforms の User Worker に対応

Artifacts でコードを管理していて、push するたびに手作業でビルド・デプロイしていた人には特に刺さるアップデートだよ!