<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged continuous-deployment</title>
<link>https://coderlegion.com/tag/continuous-deployment</link>
<description>Powered by Question2Answer</description>
<item>
<title>Prioritizing Continuous Delivery</title>
<link>https://coderlegion.com/21254/prioritizing-continuous-delivery</link>
<description>&lt;p&gt;Tony Kelly hosts our first episode of Continuous Delivery Office Hours, with Bob Walker and Steve Fenton.&lt;/p&gt;
&lt;p&gt;In this episode of Continuous Delivery Office Hours, we ponder why prioritizing Continuous Delivery (CD) is essential for managing risk. We challenge the common instinct to reduce deployment frequency after failures, using a dentist analogy to explain how delaying deployments increases pain and risk by allowing unchecked changes to accumulate.&lt;/p&gt;
&lt;p&gt;We advocate decoupling “deployments” (moving code) from “releases” (exposing features) using trunk-based development and feature toggles, which lets you test safely in production and avoid the deadlocks of complex dependency management.&lt;/p&gt;
&lt;p&gt;Listen now to discover:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The dentist paradox&lt;/li&gt;
&lt;li&gt;Guts on the table&lt;/li&gt;
&lt;li&gt;The dog and biscuit&lt;/li&gt;
&lt;li&gt;Steering with your knees&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We also mentioned Bob's book, Achieving Continuous Delivery with TPF.&lt;/p&gt;
</description>
<category>Videos</category>
<guid isPermaLink="true">https://coderlegion.com/21254/prioritizing-continuous-delivery</guid>
<pubDate>Wed, 24 Jun 2026 07:16:18 +0000</pubDate>
</item>
<item>
<title>Autopilot - the Final: From Localhost to the Cloud with GitHub Actions and CI/CD</title>
<link>https://coderlegion.com/11747/autopilot-the-final-from-localhost-to-the-cloud-with-github-actions-and-ci-cd</link>
<description>&lt;p&gt;We have come a long way. We started by designing a &lt;strong&gt;Brain&lt;/strong&gt; capable of reading (&lt;a rel=&quot;nofollow&quot; href=&quot;https://datalaria.com/en/posts/ai_agents_part2/&quot;&gt;Post 2&lt;/a&gt;), we gave it personality with &lt;strong&gt;Creative Agents&lt;/strong&gt; (&lt;a rel=&quot;nofollow&quot; href=&quot;https://datalaria.com/en/posts/ai_agents_part3/&quot;&gt;Post 3&lt;/a&gt;), and we fought against bureaucracy to get some &lt;strong&gt;Hands&lt;/strong&gt; (APIs) that could publish legally (&lt;a rel=&quot;nofollow&quot; href=&quot;https://datalaria.com/en/posts/ai_agents_part4/&quot;&gt;Post 4&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;But there was one last big step left so as not to be a &lt;strong&gt;slave to my terminal&lt;/strong&gt;. Right now, to publish, I had to be at my computer, open the console, and run &lt;code&gt;python main.py&lt;/code&gt;. That's not &quot;Autopilot.&quot; That's &quot;Assisted Driving.&quot;&lt;/p&gt;
&lt;p&gt;Today, in the final chapter, we cut the cords. We move to the cloud and automate the entire process with my AI agents.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://datalaria.com/en/posts/ai_agents_part5/autopilot_final.png&quot; alt=&quot;Project concept image - Final&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;the-pipeline-architecture&quot;&gt;The Pipeline Architecture&lt;/h3&gt;
&lt;p&gt;The goal is &lt;strong&gt;GitOps&lt;/strong&gt;: that my only interaction with the system is pushing changes to Git. Everything else must happen by magic (or rather, by &lt;strong&gt;GitHub Actions&lt;/strong&gt;).&lt;/p&gt;
&lt;p&gt;I have designed a two-phase workflow:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Detection and Preview Phase (Automatic):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GitHub detects a new &lt;code&gt;.md&lt;/code&gt; file (or changes to an existing one).&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Orchestrator&lt;/strong&gt; activates.&lt;/li&gt;
&lt;li&gt;The system detects the post language (Spanish/English) and calculates the correct URL.&lt;/li&gt;
&lt;li&gt;The AI (or template system) proposes a tweet and a LinkedIn post.&lt;/li&gt;
&lt;li&gt;The system shows me a &quot;Preview&quot; in the execution logs, but &lt;strong&gt;does not publish anything&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Publishing Phase (Manual):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The process &lt;strong&gt;pauses&lt;/strong&gt; automatically thanks to GitHub &lt;em&gt;Environments&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;I receive an alert to review the deployment.&lt;/li&gt;
&lt;li&gt;If I click the green button (&lt;strong&gt;Approve&lt;/strong&gt;), the system executes the real call to the APIs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;%%{init: {'theme': 'base', 'themeVariables': { 'primaryColor': '#f0f4f8', 'edgeLabelBackground':'#ffffff', 'tertiaryColor': '#e6e6e6'}}}%%
graph TD
    %% Initial Node
    START([GitHub detects change in .md]) --&amp;gt; ORC

    %% --- PHASE 1: AUTOMATIC ---
    subgraph Phase1 [&quot; Phase 1: Detection and Preview (Automatic)&quot;]
        direction TB
        ORC[Orchestrator Activates]
        
        %% Parallel Tasks
        ORC --&amp;gt; TASK1[Detect Language and Calculate URL]
        ORC --&amp;gt; TASK2[AI proposes Tweet and LinkedIn]
        
        %% Convergence
        TASK1 --&amp;gt; LOGS
        TASK2 --&amp;gt; LOGS
        
        LOGS[Show 'Preview' in Execution Logs]
        LOGS --&amp;gt; NOPUB[ NOTHING PUBLISHED YET]
    end

    NOPUB --&amp;gt; PAUSE

    %% --- PHASE 2: MANUAL ---
    subgraph Phase2 [&quot; Phase 2: Publishing (Manual)&quot;]
        direction TB
        PAUSE((⏸️ AUTOMATIC PAUSE&amp;lt;br/&amp;gt;GitHub Environments))
        
        PAUSE --&amp;gt; ALERT[ Alert arrives to review deployment]
        ALERT --&amp;gt; DECISION{Approve Deployment?}
        
        %% Approval Path
        DECISION -- &quot;Green Button (Approve) ✅&quot; --&amp;gt; EXEC[ Execute real API call]
        
        %% Rejection Path (Implicit)
        DECISION -- &quot;Reject / Cancel ❌&quot; --&amp;gt; STOP([End of flow without publishing])
    end

    %% Styles to highlight final steps
    style EXEC fill:#d4edda,stroke:#28a745,stroke-width:2px,color:#155724
    style STOP fill:#f8d7da,stroke:#dc3545,stroke-width:2px,color:#721c24
    style PAUSE fill:#fff3cd,stroke:#ffc107,stroke-width:3px
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;the-orchestrator-orchestrator-py-&quot;&gt;The Orchestrator (&lt;code&gt;orchestrator.py&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;I needed a script to join all the pieces together. To do this, I started developing a Python orchestrator that acts as a bridge between the Markdown file and my social media modules.&lt;/p&gt;
&lt;p&gt;This script is in charge of the &quot;fine&quot; logic that we sometimes forget:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Is it a post in English (&lt;code&gt;/en/&lt;/code&gt;) or Spanish (&lt;code&gt;/es/&lt;/code&gt;)?&lt;/li&gt;
&lt;li&gt;Does it have a featured image to generate the Twitter/X or LinkedIn card?&lt;/li&gt;
&lt;li&gt;Do I want the AI to write it, or do I want to write it myself?&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;the-star-feature-director-s-cut-&quot;&gt;The Star Feature: &quot;Director's Cut&quot;&lt;/h4&gt;
&lt;p&gt;Sometimes, the AI doesn't get the tone exactly right, or I simply want to write the copy myself for a special announcement. To not lose automation but maintain control, I implemented a &quot;Manual Overwrite&quot; logic using Hugo's &lt;em&gt;Frontmatter&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;If my script detects this in the article header:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;---
title: &quot;My Great Post&quot;
social_text: &quot;Today I don't want the AI to write for me. This post is so special that I hand-wrote this. &quot;
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The system &lt;strong&gt;ignores the automatic generation&lt;/strong&gt; and uses my exact words. It is the perfect balance: automation by default, manual control when necessary.&lt;/p&gt;
&lt;h3 id=&quot;security-and-ci-cd-sleeping-soundly&quot;&gt;Security and CI/CD: Sleeping Soundly&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;.github/workflows/autopilot.yml&lt;/code&gt; file is where the magic happens. Here we define the &quot;Secrets&quot; (my Twitter and LinkedIn API keys) and the rules of the game.&lt;/p&gt;
&lt;p&gt;The most interesting part is the environment protection:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;jobs:
  publish:
    environment: production  # &amp;lt;--- The key to security
    needs: check_changes
    steps:
      - run: python orchestrator.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;By defining the environment as &lt;code&gt;production&lt;/code&gt;, GitHub forces me to review and approve the deployment. This prevents a code error or an AI &quot;hallucination&quot; from publishing unwanted content.&lt;/p&gt;
&lt;p&gt;Additionally, we have configured the system so that &lt;strong&gt;Twitter/X&lt;/strong&gt; generates the &lt;em&gt;Cards&lt;/em&gt; with images automatically and &lt;strong&gt;LinkedIn&lt;/strong&gt; treats the content as an &quot;Article,&quot; ensuring that on both networks the blog's featured image looks large and attractive.&lt;/p&gt;
&lt;h3 id=&quot;the-final-result&quot;&gt;The Final Result&lt;/h3&gt;
&lt;p&gt;Now, my publishing process is this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I write my article in Markdown peacefully.&lt;/li&gt;
&lt;li&gt;I run &lt;code&gt;git push&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;I have a coffee. ☕&lt;/li&gt;
&lt;li&gt;I check GitHub from my phone, see the &quot;Preview&quot; of the generated tweet (in the correct language).&lt;/li&gt;
&lt;li&gt;I smile and hit &lt;strong&gt;Approve&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In seconds, the content appears on Twitter and LinkedIn. Without opening the terminal. Without touching Python. From anywhere.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Twitter/X Publication&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://datalaria.com/en/posts/ai_agents_part5/datalaria_twitter_first_automation.png&quot; alt=&quot;Post automatically published on twitter&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LinkedIn Publication&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://datalaria.com/en/posts/ai_agents_part5/datalaria_linkedin_first_automation.png&quot; alt=&quot;Post automatically published on linkedin&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;autopilot-project-conclusion&quot;&gt;Autopilot Project Conclusion&lt;/h3&gt;
&lt;p&gt;What started as an experiment to test how AI agents work and how they can help in my day-to-day life has turned into a professional publishing system. We have touched upon:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Prompt Engineering&lt;/strong&gt; to define personalities.&lt;/li&gt;
&lt;li&gt;Complex &lt;strong&gt;OAuth 2.0 APIs&lt;/strong&gt; and token management.&lt;/li&gt;
&lt;li&gt;Robust &lt;strong&gt;Python&lt;/strong&gt; backend.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DevOps&lt;/strong&gt; and CI/CD with GitHub Actions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This blog is no longer just a collection of texts; it is a living application that works for me. And now that I have free time... what shall we automate next?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Thanks for joining me in this series.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt; &lt;strong&gt;Final Source Code:&lt;/strong&gt; The entire project is available (and documented) on &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/Dalaez/datalaria-website&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
</description>
<category>Tutorials</category>
<guid isPermaLink="true">https://coderlegion.com/11747/autopilot-the-final-from-localhost-to-the-cloud-with-github-actions-and-ci-cd</guid>
<pubDate>Mon, 16 Feb 2026 06:54:01 +0000</pubDate>
</item>
</channel>
</rss>