<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tech Face</title>
    <description>The latest articles on DEV Community by Tech Face (@tech_face).</description>
    <link>https://dev.to/tech_face</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2661806%2F3cde10d0-ebb6-4351-8746-cdc32e12a0fe.jpg</url>
      <title>DEV Community: Tech Face</title>
      <link>https://dev.to/tech_face</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tech_face"/>
    <language>en</language>
    <item>
      <title>Stop Using CI as Your Deployment Platform</title>
      <dc:creator>Tech Face</dc:creator>
      <pubDate>Tue, 24 Mar 2026 19:44:32 +0000</pubDate>
      <link>https://dev.to/tech_face/stop-using-ci-as-your-deployment-platform-4dk</link>
      <guid>https://dev.to/tech_face/stop-using-ci-as-your-deployment-platform-4dk</guid>
      <description>&lt;p&gt;&lt;strong&gt;Why build pipelines and release delivery should be separated — and how independent CD gives teams more control, resilience, and auditability&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For years, teams have treated CI platforms as the default place to do everything: build, test, package, deploy, promote, and sometimes even roll back.&lt;/p&gt;

&lt;p&gt;At first, it feels efficient.&lt;/p&gt;

&lt;p&gt;Your source code is already in GitHub or GitLab. Your pipeline definitions live next to your code. Your runners are already there. &lt;strong&gt;So why not push deployment and release orchestration into the same system too?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because convenience at the beginning often becomes coupling at scale.&lt;/p&gt;

&lt;p&gt;And once CI becomes your release platform, every operational weakness in that platform starts affecting not just your builds — but your ability to ship.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;GitHub Actions&lt;/em&gt; is included as part of GitHub’s platform and private repositories receive a limited monthly quota of GitHub-hosted minutes depending on plan; extra usage is billed. GitHub also documents that self-hosted runners still connect back to GitHub to receive jobs and updates, which means the control plane remains dependent on GitHub availability.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Folk7xm0dgpkc0wd8p47r.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Folk7xm0dgpkc0wd8p47r.webp" alt="Compare: GitHub Workflow Dispatch vs Orbnetes Release Page&amp;lt;br&amp;gt;
" width="800" height="374"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  CI is not the same thing as CD
&lt;/h2&gt;

&lt;p&gt;CI and CD are related, but they are not the same responsibility.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzj56i9hm80mxim2b1o7k.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzj56i9hm80mxim2b1o7k.webp" alt="Orbnetes Release Page&amp;lt;br&amp;gt;
" width="800" height="712"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Continuous Integration is about validating change:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;build the code&lt;/li&gt;
&lt;li&gt;run tests&lt;/li&gt;
&lt;li&gt;produce artifacts&lt;/li&gt;
&lt;li&gt;confirm that a commit is healthy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Continuous Delivery and deployment are about controlled change propagation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;selecting a release candidate&lt;/li&gt;
&lt;li&gt;deciding where it goes&lt;/li&gt;
&lt;li&gt;defining approval flow&lt;/li&gt;
&lt;li&gt;promoting through environments&lt;/li&gt;
&lt;li&gt;enforcing role-based control&lt;/li&gt;
&lt;li&gt;capturing audit history&lt;/li&gt;
&lt;li&gt;handling rollback safely&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That distinction matters. A build pipeline answers: &lt;strong&gt;“Can we produce a deployable artifact?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A release platform answers: &lt;strong&gt;“Who deployed which version, where, when, why, and what happened next?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Those are different questions. They deserve different systems.&lt;/p&gt;
&lt;h2&gt;
  
  
  The hidden cost of using CI for releases
&lt;/h2&gt;

&lt;p&gt;Using GitHub Actions or GitLab pipelines for deployments is not “wrong.” In fact, it is often the fastest way to get started.&lt;br&gt;
But the trade-off appears later. Once deployment logic lives inside CI, several problems start to pile up.&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Your release process becomes coupled to your source platform
&lt;/h2&gt;

&lt;p&gt;If your CI platform is degraded, your release process is degraded too.&lt;/p&gt;

&lt;p&gt;That is not theoretical.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft9ken1yqz9cryxjy27u9.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft9ken1yqz9cryxjy27u9.webp" alt="GitHub Incident Last 3 Month&amp;lt;br&amp;gt;
" width="800" height="580"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.githubstatus.com/history?page=3" rel="noopener noreferrer"&gt;GitHub’s official incident history&lt;/a&gt; shows multiple incidents where core development and delivery workflows were affected together.&lt;/p&gt;

&lt;p&gt;For example, on &lt;strong&gt;July 28–29, 2025&lt;/strong&gt;, GitHub reported degraded performance affecting &lt;strong&gt;Issues, API Requests, and Pull Requests&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;On &lt;strong&gt;August 21, 2025&lt;/strong&gt;, GitHub reported delays and failures starting &lt;strong&gt;GitHub Actions jobs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Its incident history also includes a broader incident on &lt;strong&gt;November 27, 2023&lt;/strong&gt; affecting Pull Requests, Issues, Webhooks, and Actions at the same time.&lt;/p&gt;

&lt;p&gt;When your builds, approvals, and production releases all depend on the same platform, one outage can freeze both development and delivery.&lt;/p&gt;

&lt;p&gt;If you need to ship a hotfix during an outage, or even during partial degradation, “everything in one place” suddenly stops looking like an advantage.&lt;/p&gt;

&lt;p&gt;It becomes a single operational dependency.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. CI pipelines are great at execution, but awkward at release governance
&lt;/h2&gt;

&lt;p&gt;Pipelines are good at running jobs. They are less natural as systems of record for release intent and release control.&lt;/p&gt;

&lt;p&gt;Yes, you can build approvals into workflows.&lt;br&gt;
Yes, you can model environment promotion with YAML.&lt;br&gt;
Yes, you can encode rollback logic in scripts.&lt;/p&gt;

&lt;p&gt;But that does not mean CI is the best place to own those concerns.&lt;/p&gt;

&lt;p&gt;Over time, teams start asking questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which exact version was approved for staging?&lt;/li&gt;
&lt;li&gt;Who approved production?&lt;/li&gt;
&lt;li&gt;Was QA sign-off captured before the promotion?&lt;/li&gt;
&lt;li&gt;What was the previous successful version?&lt;/li&gt;
&lt;li&gt;Can we roll back automatically if deployment health fails?&lt;/li&gt;
&lt;li&gt;Can we see one clean audit trail for release actions across environments?
At that point, deployment stops being “just another job.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It becomes an operational workflow.&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Release logic becomes too tightly bound to repository events
&lt;/h2&gt;

&lt;p&gt;A lot of CI-driven deployment patterns are still built around repository triggers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;push to branch&lt;/li&gt;
&lt;li&gt;merge to main&lt;/li&gt;
&lt;li&gt;create tag&lt;/li&gt;
&lt;li&gt;create release
That works for simple teams. But mature release processes are rarely that simple.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sometimes you want to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;build once, deploy many times&lt;/li&gt;
&lt;li&gt;promote the same immutable artifact from staging to production&lt;/li&gt;
&lt;li&gt;separate the person who prepared the release from the person who approved it&lt;/li&gt;
&lt;li&gt;require QA verification before production&lt;/li&gt;
&lt;li&gt;allow operations to deploy without re-running builds&lt;/li&gt;
&lt;li&gt;roll back to the last known good release without touching source code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fstf0q29derjgfuqnsap0.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fstf0q29derjgfuqnsap0.webp" alt="Orbnetes Releases&amp;lt;br&amp;gt;
" width="800" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That is where “pipeline as deployment engine” starts to fight the way real teams operate.&lt;/p&gt;
&lt;h2&gt;
  
  
  GitLab is excellent — and this is not an anti-GitLab argument
&lt;/h2&gt;

&lt;p&gt;GitLab deserves a lot of respect.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffv99y6gheb2r2340734b.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffv99y6gheb2r2340734b.webp" alt="GitLab Pipelines&amp;lt;br&amp;gt;
" width="800" height="319"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is a strong product, especially for teams that want one integrated DevSecOps platform. GitLab supports both SaaS and self-managed deployments, and its documentation explicitly positions GitLab CI/CD as a system for building, testing, deploying, and monitoring iterative code changes. GitLab Runner can also be self-managed in your own infrastructure.&lt;/p&gt;

&lt;p&gt;I like GitLab a lot. ❤️&lt;/p&gt;

&lt;p&gt;And if your team is happy with GitLab pipelines for deployment, that may be the right choice for you. But even with GitLab, the same architectural question still exists:&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Should the system that validates code changes also be the system that governs release movement across environments?&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
For some teams, the answer is yes.&lt;/p&gt;

&lt;p&gt;For others — especially teams that care about controlled promotion, auditable approvals, operational separation, and deployment resilience — the answer becomes no.&lt;/p&gt;
&lt;h2&gt;
  
  
  A better model: CI builds the artifact, CD owns the release
&lt;/h2&gt;

&lt;p&gt;This is the model we believe in with Orbnetes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F79y1lw64ifwacj3r9v51.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F79y1lw64ifwacj3r9v51.webp" alt=" " width="800" height="326"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Keep CI where it belongs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub Actions&lt;/li&gt;
&lt;li&gt;GitLab CI&lt;/li&gt;
&lt;li&gt;Jenkins&lt;/li&gt;
&lt;li&gt;&lt;p&gt;whatever your team already uses to build and test&lt;br&gt;
Let CI do one job well:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;compile&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;test&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;package&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;publish a versioned artifact&lt;br&gt;
Then hand off release orchestration to a separate, independent CD service.&lt;br&gt;
That separation changes everything.&lt;br&gt;
Now your deployment platform is no longer just “a few jobs in YAML.”&lt;br&gt;
It becomes an actual release control layer.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  What independence gives you
&lt;/h2&gt;

&lt;p&gt;With Orbnetes, the goal is simple:&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;CI produces versions. Orbnetes decides how those versions move through environments.&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
Instead of hiding release decisions inside pipeline files, the release flow becomes explicit.&lt;/p&gt;

&lt;p&gt;A team member selects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the repository or release source&lt;/li&gt;
&lt;li&gt;the version to deploy&lt;/li&gt;
&lt;li&gt;the target environment
That creates a release request.
Another team member, with the appropriate role, can approve it.
The release is then deployed to the next stage — for example, staging.
QA can verify the result and mark it as accepted.
Only then can the same release be promoted further, such as into production.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That gives you something many teams are missing today:&lt;br&gt;
*&lt;em&gt;a controlled release process instead of an automated shell script with side effects.&lt;br&gt;
*&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F03pgq3vfpkcp6aoomvnk.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F03pgq3vfpkcp6aoomvnk.webp" alt="Orbnetes: Pipeline Console" width="800" height="649"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3b5eepjim6gy5c3k9vik.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3b5eepjim6gy5c3k9vik.webp" alt="Orbnetes: Job Log&amp;lt;br&amp;gt;
" width="800" height="679"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Control does not mean slowdown
&lt;/h2&gt;

&lt;p&gt;This is where a lot of teams get nervous.&lt;/p&gt;

&lt;p&gt;They hear “approval,” “portal,” “roles,” and “audit trail,” and assume the result will be bureaucracy.&lt;/p&gt;

&lt;p&gt;But the goal is not to slow engineers down.&lt;/p&gt;

&lt;p&gt;The goal is to remove ambiguity.&lt;/p&gt;

&lt;p&gt;A good CD system should make releases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;visible&lt;/li&gt;
&lt;li&gt;reproducible&lt;/li&gt;
&lt;li&gt;role-aware&lt;/li&gt;
&lt;li&gt;auditable&lt;/li&gt;
&lt;li&gt;easy to promote&lt;/li&gt;
&lt;li&gt;easy to roll back
The best release process is not the one with the fewest clicks.
It is the one that still makes sense at 2 a.m. during a production incident.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Rollback should be a policy, not an improvisation
&lt;/h2&gt;

&lt;p&gt;One of the biggest weaknesses in CI-driven deployments is rollback maturity.&lt;/p&gt;

&lt;p&gt;In many organizations, rollback still means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;find the old tag&lt;/li&gt;
&lt;li&gt;re-run an old workflow&lt;/li&gt;
&lt;li&gt;hope the environment still matches&lt;/li&gt;
&lt;li&gt;manually reconstruct secrets or parameters&lt;/li&gt;
&lt;li&gt;pray the old pipeline still works
That is not rollback. That is archaeology. A release platform should understand rollback as a first-class concept.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://orbnetes.cloud/" rel="noopener noreferrer"&gt;In Orbnetes&lt;/a&gt;, rollback policy can be defined around the last successful version, so if a deployment fails, the system can recover in a controlled and predictable way.&lt;/p&gt;

&lt;p&gt;That is the difference between “we have scripts” and “we have operational design.”&lt;/p&gt;
&lt;h2&gt;
  
  
  Lightweight agents matter more than people think
&lt;/h2&gt;

&lt;p&gt;Another overlooked issue in deployment systems is agent complexity.&lt;/p&gt;

&lt;p&gt;The more heavyweight the runtime model is, the more fragile the overall deployment path becomes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsd75u08woizu0ecpbtxh.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsd75u08woizu0ecpbtxh.webp" alt="agent" width="800" height="343"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Orbnetes uses very &lt;a href="https://github.com/orbnetes/orbnetes-agent" rel="noopener noreferrer"&gt;lightweight agents&lt;/a&gt; — around 2 MB — which changes the operational profile significantly.&lt;/p&gt;

&lt;p&gt;That matters because lightweight agents are easier to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;distribute&lt;/li&gt;
&lt;li&gt;update&lt;/li&gt;
&lt;li&gt;run in constrained environments&lt;/li&gt;
&lt;li&gt;reason about&lt;/li&gt;
&lt;li&gt;troubleshoot
This is not only about download size. It is about reducing moving parts.
Teams often underestimate how much deployment instability is introduced by the deployment tooling itself.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  A simpler agent model usually means a more stable deployment surface.
&lt;/h2&gt;

&lt;p&gt;Simple YAML is still the right interface&lt;br&gt;
YAML is not going away. And that is fine.&lt;/p&gt;

&lt;p&gt;The problem is not YAML itself — it is where the YAML lives and what responsibilities it owns.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwukrgdwmvwhg9yranr44.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwukrgdwmvwhg9yranr44.webp" alt="Blueprints Editor&amp;lt;br&amp;gt;
" width="800" height="679"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://orbnetes.cloud/" rel="noopener noreferrer"&gt;Orbnetes&lt;/a&gt; keeps the deployment definition simple. Recipes and blueprints can live in Git or locally, depending on how a team wants to manage them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;simple-release-deploy&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Backup + deploy selected release file&lt;/span&gt;
&lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;target_env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;backup&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;linux&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;backup&lt;/span&gt;
        &lt;span class="na"&gt;shell&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bash&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;echo "Backup before deploy (env=${{ inputs.target_env }})"&lt;/span&gt;
  &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;needs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;backup&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;linux&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deploy-release-file&lt;/span&gt;
        &lt;span class="na"&gt;shell&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bash&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;echo "Deploying file: $ORBN_RELEASE_FILE"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That means teams still get the benefits engineers like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;versioned definitions&lt;/li&gt;
&lt;li&gt;repeatable configuration&lt;/li&gt;
&lt;li&gt;human-readable deployment rules&lt;/li&gt;
&lt;li&gt;infrastructure-friendly workflows
But without forcing the entire release lifecycle to be trapped inside the CI system that built the artifact.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Auditability is not a “compliance feature”
&lt;/h2&gt;

&lt;p&gt;A lot of engineering teams hear “audit trail” and think:&lt;/p&gt;

&lt;p&gt;“that is for enterprise buyers, not for us.” I think that is the wrong mindset. Auditability is not only about compliance. It is about operational memory. When something goes wrong, you want immediate answers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;who deployed this?&lt;/li&gt;
&lt;li&gt;what version was deployed?&lt;/li&gt;
&lt;li&gt;which approval path was used?&lt;/li&gt;
&lt;li&gt;what environment changed first?&lt;/li&gt;
&lt;li&gt;was this promoted or freshly deployed?&lt;/li&gt;
&lt;li&gt;what was the previous successful version?&lt;/li&gt;
&lt;li&gt;That is not bureaucracy.
That is how teams debug delivery itself.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Separation of duties is a feature, not a burden
&lt;/h2&gt;

&lt;p&gt;One of the strongest reasons to separate CI from CD is role clarity.&lt;br&gt;
The person who merges code is not always the person who should deploy to production.&lt;br&gt;
The person who validates staging is not always the person who approves prod.&lt;br&gt;
The team that owns release governance is not always the team that owns build pipelines.&lt;/p&gt;

&lt;p&gt;When all of that is compressed into one CI platform, permission models often become messy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;too much access for too many people&lt;/li&gt;
&lt;li&gt;deployment tied to repo write permissions&lt;/li&gt;
&lt;li&gt;operational control hidden in workflow files&lt;/li&gt;
&lt;li&gt;&lt;p&gt;release actions mixed with normal developer automation&lt;br&gt;
A dedicated CD layer gives you a cleaner model:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;who can request&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;who can approve&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;who can deploy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;who can observe&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;who can audit&lt;br&gt;
That is not just safer. It is easier to operate.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The architecture shift teams need to make
&lt;/h2&gt;

&lt;p&gt;The key mindset change is this:&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;CI should answer whether software is ready to be released.&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
*&lt;em&gt;CD should answer how release actually happens.&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
Those are not the same responsibility. Once teams accept that, the architecture becomes cleaner:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub / GitLab / Jenkins → build, test, package&lt;/li&gt;
&lt;li&gt;Artifact storage → immutable release versions&lt;/li&gt;
&lt;li&gt;Orbnetes → release selection, approval, promotion, rollback, audit, environment delivery
That separation gives teams a more resilient software delivery model.
Your source platform can do what it does best.
Your release platform can do what it does best.
And most importantly, your ability to deploy is no longer completely hostage to the same system that hosts your pull requests and build triggers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;CI platforms are excellent engineering tools.&lt;/p&gt;

&lt;p&gt;GitHub Actions is powerful. GitLab CI is powerful. Jenkins is still deeply useful in many environments.&lt;/p&gt;

&lt;p&gt;This is not about replacing CI.&lt;/p&gt;

&lt;p&gt;It is about stopping the habit of turning CI into the place where every deployment, approval, rollback, and production release decision must live.&lt;/p&gt;

&lt;p&gt;At small scale, that coupling feels efficient. At larger scale, it becomes operational debt.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Build in CI.&lt;br&gt;
Release through CD.&lt;br&gt;
Keep them connected — but not fused.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the idea behind &lt;a href="https://orbnetes.cloud/" rel="noopener noreferrer"&gt;Orbnetes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Furgvmmakia6zty34rtm9.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Furgvmmakia6zty34rtm9.webp" alt="Orbnetes Dashboard&amp;lt;br&amp;gt;
" width="800" height="679"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And I think more teams are going to move in this direction over the next few years.&lt;/p&gt;

&lt;p&gt;Thanks!&lt;/p&gt;

</description>
      <category>devops</category>
      <category>release</category>
      <category>laravel</category>
      <category>go</category>
    </item>
  </channel>
</rss>
