CI Workflows for Artifacts - Build and deploy on every push
You can now run CI/CD pipelines on Artifacts repos with automatic triggering on push events using the CI SDK. This enables automated building, testing, linting, and deployment to Workers with dependency caching based on lockfile changes.
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:
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.tstsconst 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.
Source: original entry ↗