Feature
Build and deploy Artifacts repos on every push
You can now run your CI/CD pipeline on your Artifacts repo by defining a CI Workflow with the CI SDK, automatically triggered on Artifacts push events.
This allows you to:
- Automatically build and deploy application code stored in Artifacts.
- Run linting, type checking, tests, and other checks on every push.
- Reuse dependencies when the lockfile (i.e. pnpm-lock.yaml) has not changed.
- Stop deployment when a check or build fails.
- Restrict API token access to the deployment step.
- Deploy the output to a Worker or a Workers for Platforms User Worker.
Define your CI steps with @cloudflare/ci. Each ci.runner() spins up an isolated sandbox, and the cache option reuses installed dependencies across each sandboxed step in your CI job.
Point cache.inputs at your lockfile (i.e. pnpm-lock.yaml, bun.lock), and the install step only runs again when that lockfile changes:
src/index.js
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" });
src/index.ts
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" });
To start the Workflow automatically after each push, add a cf.artifacts.repo.pushed trigger to your Wrangler configuration:
{ "triggers": { "events": [ { "type": "cf.artifacts.repo.pushed", "filter": { "namespace": "CI", "repoName": "my-repo", }, "target": { "scriptName": "my-ci-worker", "workflowName": "ci-workflow", }, }, ], }, }
[[triggers.events]] type = "cf.artifacts.repo.pushed" [triggers.events.filter] namespace = "CI" repoName = "my-repo" [triggers.events.target] scriptName = "my-ci-worker" workflowName = "ci-workflow"
To learn more, refer to Build and deploy Artifacts repos.
Read the original announcement