CCloud Releases
Home
Following

Cloud Releases

Service catalogues and updates come from each provider's public product listing and announcements.

Explore

  • Home
  • Latest updates
  • Following

About

  • About
  • Contact
  • Privacy Policy
  • Terms of Use

Providers

  • Amazon Web Services
  • Microsoft Azure
  • Google Cloud
  • Cloudflare

Not affiliated with any cloud provider. Product names and logos belong to their owners.

  1. Providers
  2. ›Cloudflare
  3. ›Workflows
  4. ›Update

Feature•Aug 4, 2026

Build and deploy Artifacts repos on every push

WorkflowsCloudflare · Developer platform

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↗

More from Workflows

All Workflows updates →
  1. Create Workflow instance batches by count or list

    createBatch() now accepts an options object that creates up to 100 Workflow instances in one call. The result lists the created instances and explains why any others were not created.

    Workflows•Feature•Oct 8, 2026
  2. Call Workflows declared in `exports` through `ctx.exports`

    A Worker can now call the Workflows it declares in the exports field of its Wrangler configuration through ctx.exports. You no longer need a workflows binding to call a Workflow from the Worker that defines it.

    Workflows•Feature•Sep 27, 2026
  3. Declare Workflows in the `exports` configuration

    You can now declare the Workflows a Worker defines in the exports field of your Wrangler configuration file. Previously, a Worker could only define a Workflow through a workflows binding, even when the Worker never called the Workflow itself.

    Workflows•Feature•Sep 24, 2026
  4. Delete Workflow instances individually or in batches

    You can now delete one or up to 100 Workflow instances and their stored state via the Workflows API or Wrangler 4.125.0 and later. Deleting an instance frees its stored state and stops its current execution. Storage billing is based on the average daily peak.

    Workflows•Feature•Sep 17, 2026
  5. Stream Workflow instance events in your Worker or via the API with.subscribe()

    You can now stream Workflow instance events via WorkflowInstance.subscribe() and the GET /subscribe API endpoint. Workers and HTTP clients can react to workflow and step events, including attempts, sleeps, waits, and rollbacks, without polling for instance status.

    Workflows•Feature•Sep 15, 2026