Artifacts, Workflows - Build and deploy Artifacts repos on every push
- Announced
- Tags
- Artifacts, Workflows
- Severity
- info, set by
reef/rss-rule-v1 - Source
- https://developers.cloudflare.com/changelog/post/2026-08-04-build-and-deploy-on-push/
<p>You can now run your CI/CD pipeline on your <a href="https://developers.cloudflare.com/artifacts/">Artifacts</a> repo by defining a CI <a href="https://developers.cloudflare.com/workflows/">Workflow</a> with the <a href="https://github.com/cloudflare/ci" target="_blank" rel="noopener">CI SDK<span class="external-link"> ↗︎</span></a>, automatically triggered on Artifacts push events.</p> <p>This allows you to:</p> <ul> <li>Automatically build and deploy application code stored in Artifacts.</li> <li>Run linting, type checking, tests, and other checks on every push.</li> <li>Reuse dependencies when the lockfile (i.e. <code>pnpm-lock.yaml</code>) has not changed.</li> <li>Stop deployment when a check or build fails.</li> <li>Restrict API token access to the deployment step.</li> <li>Deploy the output to a <a href="https://developers.cloudflare.com/workers/">Worker</a> or a <a href="https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/">Workers for Platforms</a> User Worker.</li> </ul> <p>Define your CI steps with <code>@cloudflare/ci</code>. Each <code>ci.runner()</code> spins up an isolated sandbox, and the <code>cache</code> option reuses installed dependencies across each sandboxed step in your CI job.</p> <p>Point <code>cache.inputs</code> at your lockfile (i.e. <code>pnpm-lock.yaml</code>, <code>bun.lock</code>), and the install step only runs again when that lockfile changes:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="js"><figcaption class="nb-code-title"><span class="nb-code-title-name">src/index.js</span><span class="nb-code-title-lang">js</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> deps</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> ci.</span><span class="nb-shiki-1t8gfj">runner</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> name: </span><span class="nb-shiki-mdbnqw">"install"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> command: </span><span class="nb-shiki-mdbnqw">"bun install --frozen-lockfile"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> cache: { inputs: [</span><span class="nb-shiki-mdbnqw">"package.json"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"bun.lock"</span><span class="nb-shiki-140thh">] },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-dzsirb"> Promise</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">all</span><span class="nb-shiki-140thh">([</span></span> <span class="line"><span class="nb-shiki-140thh"> deps.</span><span class="nb-shiki-1t8gfj">runner</span><span class="nb-shiki-140thh">({ name: </span><span class="nb-shiki-mdbnqw">"lint"</span><span class="nb-shiki-140thh">, command: </span><span class="nb-shiki-mdbnqw">"bun run lint"</span><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> deps.</span><span class="nb-shiki-1t8gfj">runner</span><span class="nb-shiki-140thh">({ name: </span><span class="nb-shiki-mdbnqw">"test"</span><span class="nb-shiki-140thh">, command: </span><span class="nb-shiki-mdbnqw">"bun run test"</span><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> deps.</span><span class="nb-shiki-1t8gfj">runner</span><span class="nb-shiki-140thh">({ name: </span><span class="nb-shiki-mdbnqw">"typecheck"</span><span class="nb-shiki-140thh">, command: </span><span class="nb-shiki-mdbnqw">"bun run typecheck"</span><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> deps.</span><span class="nb-shiki-1t8gfj">runner</span><span class="nb-shiki-140thh">({ name: </span><span class="nb-shiki-mdbnqw">"build"</span><span class="nb-shiki-140thh">, command: </span><span class="nb-shiki-mdbnqw">"bun run build"</span><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh">]);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> deps.</span><span class="nb-shiki-1t8gfj">runner</span><span class="nb-shiki-140thh">({ name: </span><span class="nb-shiki-mdbnqw">"deploy"</span><span class="nb-shiki-140thh">, command: </span><span class="nb-shiki-mdbnqw">"bun wrangler deploy"</span><span class="nb-shiki-140thh"> });</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">src/index.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">const</span><span class="nb-shiki-dzsirb"> deps</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> ci.</span><span class="nb-shiki-1t8gfj">runner</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> name: </span><span class="nb-shiki-mdbnqw">"install"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> command: </span><span class="nb-shiki-mdbnqw">"bun install --frozen-lockfile"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> cache: { inputs: [</span><span class="nb-shiki-mdbnqw">"package.json"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"bun.lock"</span><span class="nb-shiki-140thh">] },</span></span> <span class="line"><span class="nb-shiki-140thh">});</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-dzsirb"> Promise</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">all</span><span class="nb-shiki-140thh">([</span></span> <span class="line"><span class="nb-shiki-140thh"> deps.</span><span class="nb-shiki-1t8gfj">runner</span><span class="nb-shiki-140thh">({ name: </span><span class="nb-shiki-mdbnqw">"lint"</span><span class="nb-shiki-140thh">, command: </span><span class="nb-shiki-mdbnqw">"bun run lint"</span><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> deps.</span><span class="nb-shiki-1t8gfj">runner</span><span class="nb-shiki-140thh">({ name: </span><span class="nb-shiki-mdbnqw">"test"</span><span class="nb-shiki-140thh">, command: </span><span class="nb-shiki-mdbnqw">"bun run test"</span><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> deps.</span><span class="nb-shiki-1t8gfj">runner</span><span class="nb-shiki-140thh">({ name: </span><span class="nb-shiki-mdbnqw">"typecheck"</span><span class="nb-shiki-140thh">, command: </span><span class="nb-shiki-mdbnqw">"bun run typecheck"</span><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh"> deps.</span><span class="nb-shiki-1t8gfj">runner</span><span class="nb-shiki-140thh">({ name: </span><span class="nb-shiki-mdbnqw">"build"</span><span class="nb-shiki-140thh">, command: </span><span class="nb-shiki-mdbnqw">"bun run build"</span><span class="nb-shiki-140thh"> }),</span></span> <span class="line"><span class="nb-shiki-140thh">]);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> deps.</span><span class="nb-shiki-1t8gfj">runner</span><span class="nb-shiki-140thh">({ name: </span><span class="nb-shiki-mdbnqw">"deploy"</span><span class="nb-shiki-140thh">, command: </span><span class="nb-shiki-mdbnqw">"bun wrangler deploy"</span><span class="nb-shiki-140thh"> });</span></span></code></pre></figure></div></div></div></div> <p>To start the Workflow automatically after each push, add a <code>cf.artifacts.repo.pushed</code> trigger to your Wrangler configuration:</p> <div data-nb-tabs data-nb-sync-key="wranglerConfig" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.jsonc" class><figure class="nb-code-figure" data-nb-lang="jsonc"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="jsonc" data-nb-lang="jsonc"><code><span class="line"><span class="nb-shiki-140thh">{</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "triggers"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "events"</span><span class="nb-shiki-140thh">: [</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"cf.artifacts.repo.pushed"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "filter"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "namespace"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"CI"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "repoName"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"my-repo"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "target"</span><span class="nb-shiki-140thh">: {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "scriptName"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"my-ci-worker"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-dzsirb"> "workflowName"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"ci-workflow"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> ],</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="wrangler.toml" class><figure class="nb-code-figure" data-nb-lang="toml"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="toml" data-nb-lang="toml"><code><span class="line"><span class="nb-shiki-140thh">[[</span><span class="nb-shiki-1t8gfj">triggers</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">events</span><span class="nb-shiki-140thh">]]</span></span> <span class="line"><span class="nb-shiki-140thh">type = </span><span class="nb-shiki-mdbnqw">"cf.artifacts.repo.pushed"</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh"> [</span><span class="nb-shiki-1t8gfj">triggers</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">events</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">filter</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh"> namespace = </span><span class="nb-shiki-mdbnqw">"CI"</span></span> <span class="line"><span class="nb-shiki-140thh"> repoName = </span><span class="nb-shiki-mdbnqw">"my-repo"</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh"> [</span><span class="nb-shiki-1t8gfj">triggers</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">events</span><span class="nb-shiki-140thh">.</span><span class="nb-shiki-1t8gfj">target</span><span class="nb-shiki-140thh">]</span></span> <span class="line"><span class="nb-shiki-140thh"> scriptName = </span><span class="nb-shiki-mdbnqw">"my-ci-worker"</span></span> <span class="line"><span class="nb-shiki-140thh"> workflowName = </span><span class="nb-shiki-mdbnqw">"ci-workflow"</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script> <p>To learn more, refer to <a href="https://developers.cloudflare.com/artifacts/guides/build-and-deploy-on-push/">Build and deploy Artifacts repos</a>.</p>
The text above is the source's. reef added the severity, the dates it could read from the text, and the endpoints and scopes named in code.