<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>#Continuous Integration — Seconds to Midnight</title><description>Content tagged with #Continuous Integration.</description><link>https://dbuho.me</link><language>en</language><copyright>© 2026 Damián Búho</copyright><managingEditor>damian.buho@proton.me (Damián Búho)</managingEditor><webMaster>damian.buho@proton.me (Damián Búho)</webMaster><lastBuildDate>Thu, 12 Nov 2026 16:25:24 GMT</lastBuildDate><category>Resilience</category><ttl>60</ttl><image><url>https://dbuho.me/favicon-48x48.png</url><title>#Continuous Integration — Seconds to Midnight</title><link>https://dbuho.me</link></image><atom:link rel="self" type="application/rss+xml" href="https://dbuho.me/tags/continuous-integration.rss"/><item><title>Post: Released Ignorelint</title><link>https://dbuho.me/post/released-ignorelint/?utm_source=tag-continuous-integration&amp;utm_medium=rss</link><guid isPermaLink="false">01M71VHB6XHAW0E5NENYBH802M</guid><description>I promised myself to not joke about how ignorefiles were ignored by linters. Details at the project page</description><pubDate>Thu, 17 Sep 2026 02:59:00 GMT</pubDate><content:encoded>&lt;p&gt;I promised myself to not joke about how ignorefiles were ignored by linters.&lt;/p&gt;
&lt;p&gt;Details at the &lt;a href=&quot;https://dbuho.me/project/ignorelint/&quot;&gt;project page&lt;/a&gt;&lt;/p&gt;</content:encoded><category>Continuous Integration</category><author>damian.buho@proton.me (Damián Búho)</author></item><item><title>Project: Ignorelint is a linter for 20+ kinds of ignore files</title><link>https://dbuho.me/project/ignorelint/?utm_source=tag-continuous-integration&amp;utm_medium=rss</link><guid isPermaLink="false">01M293G8ZHB9H4VA8RS58NSE46</guid><description>I believe that every file should be covered by some kind of static validator, and when I checked for any existing linter for ignore files, I didn&amp;#39;t find any. And I was in need of real Crystal project to test my base Crystal image. So I made one.</description><pubDate>Wed, 02 Sep 2026 00:15:20 GMT</pubDate><content:encoded>&lt;p&gt;I believe that every file should be covered by some kind of static validator, and when I checked for any existing linter for ignore files, I didn&amp;#39;t find any.&lt;/p&gt;
&lt;p&gt;And I was in need of real Crystal project to test my base Crystal image.&lt;/p&gt;
&lt;p&gt;So I made one.&lt;/p&gt;</content:encoded><category>Continuous Integration</category><author>damian.buho@proton.me (Damián Búho)</author></item><item><title>Post: Released fork of repolinter</title><link>https://dbuho.me/post/released-fork-of-repolinter/?utm_source=tag-continuous-integration&amp;utm_medium=rss</link><guid isPermaLink="false">01M6VBEZV1ANZ88ZNKPNN756DN</guid><description>Released a fork of todogroup/repolinter . Migrated it to TypeScript, updated the tests and dependencies, and cleaned up the workflows. Majority of the issues of the original were fixed. My first experience with such necromancy. I&amp;#39;m sure there are good reasons they dropped it, but it costs little to maintain, and I think the &amp;quot;facts/rules&amp;quot; scheme is actually very neat. Details on the project page .</description><pubDate>Thu, 09 Jul 2026 02:59:00 GMT</pubDate><content:encoded>&lt;p&gt;Released a fork of &lt;a href=&quot;https://github.com/todogroup/repolinter&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;todogroup/repolinter&lt;/a&gt;.
Migrated it to TypeScript, updated the tests and dependencies, and cleaned up the workflows.
Majority of the issues of the original were fixed.&lt;/p&gt;
&lt;p&gt;My first experience with such necromancy. I&amp;#39;m sure there are good reasons they dropped it, but it costs little to maintain, and I think the &amp;quot;facts/rules&amp;quot; scheme is actually very neat.&lt;/p&gt;
&lt;p&gt;Details on &lt;a href=&quot;https://dbuho.me/project/repolinter/&quot;&gt;the project page&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>Continuous Integration</category><author>damian.buho@proton.me (Damián Búho)</author></item><item><title>Project: M6E Makefile Framework</title><link>https://dbuho.me/project/m6e/?utm_source=tag-continuous-integration&amp;utm_medium=rss</link><guid isPermaLink="false">01M3DBRPB5M41XR42ZJ2XPBB1S</guid><description>This project started as a personal collection of familiar tools, gained declarative fleur, became a make-implementation of Projectfile CI and currently transforming into fully declarative library</description><pubDate>Wed, 01 Jul 2026 22:41:53 GMT</pubDate><content:encoded>&lt;p&gt;This project started as a personal collection of familiar tools, gained declarative fleur, became a make-implementation of &lt;a href=&quot;https://dbuho.me/project/projectfile-ci-resolver/&quot;&gt;Projectfile CI&lt;/a&gt; and currently transforming into fully declarative library&lt;/p&gt;</content:encoded><category>Shell Scripting</category><category>Makefile</category><category>Continuous Integration</category><author>damian.buho@proton.me (Damián Búho)</author></item><item><title>Post: Why You Should Care About RISC-V</title><link>https://dbuho.me/post/why-you-should-care-about-risc-v/?utm_source=tag-continuous-integration&amp;utm_medium=rss</link><guid isPermaLink="false">01M5XR17NV4BGYBH7B2K1033ZB</guid><description>I try to support RISC-V everywhere I can, and you should too. Chances are (around 60%, actually) that you live in a country without an independent CPU/MCU industry. The consequences of the russian invasion in 2022 showed us that you can&amp;#39;t really stop high-tech imports into a country that went batshit crazy, but you can make chips somewhat harder to get. I obviously don&amp;#39;t have a problem with sanctions against the axis of evil. But one of these days, some orange clown (or clowns of any color) could decide that Uruguay, Chile, or New Zealand are as bad as North Korea or Iran—because they are too friendly to China, too gay, or something like that. And your country could be next. One Jacob Feldgoise already whines about RISC-V hindering good old world policing. RISC-V is not the simplest, but it is the most logical way to get closer to an &amp;quot;Uruguayan Xeon&amp;quot; or a &amp;quot;Nigerian STM32.&amp;quot; And it doesn&amp;#39;t have to be an entirely national project: regional alliances could help lower costs and achieve scale faster. Getting an ARM license is probably easier, but it&amp;#39;s another compliance leash from a country that loves exiting things without thinking them through. Without a stable supply of chips, you will have issues with everything from ATMs to train networks. It won&amp;#39;t be immediate—modern silicon is quite durable—but things will break down and require replacement. If you don&amp;#39;t have the benefit of a &amp;quot;death cult of living in squalor and constantly overcoming unnecessary self-imposed problems&amp;quot; in your population (like Russia has), it will become an issue very fast. An issue that both internal and external malevolent actors will exploit. Be less gay, have a chip. Sovereign RISC-V production is something that feels unnecessary, expensive, and alarmist now. But when it becomes &amp;quot;today&amp;#39;s problem,&amp;quot; it will be too late. And even if you have 30+ CPU suppliers, you can still be enough of an asshole that all of them refuse to sell to you (though things won&amp;#39;t change much for the real bad actors). What Can You Do About It?</description><pubDate>Tue, 30 Jun 2026 02:59:00 GMT</pubDate><content:encoded>&lt;p&gt;I try to support RISC-V everywhere I can, and you should too.&lt;/p&gt;
&lt;p&gt;Chances are (around 60%, actually) that you live in a country without an independent CPU/MCU industry. The consequences of the russian invasion in 2022 showed us that you can&amp;#39;t really stop high-tech imports into a country that went batshit crazy, but you can make chips somewhat harder to get.&lt;/p&gt;
&lt;p&gt;I obviously don&amp;#39;t have a problem with sanctions against the axis of evil. But one of these days, some orange clown (or clowns of any color) could decide that Uruguay, Chile, or New Zealand are as bad as North Korea or Iran—because they are too friendly to China, too gay, or something like that. And your country could be next.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cset.georgetown.edu/article/risc-v-what-it-is-and-why-it-matters/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;One Jacob Feldgoise already whines about RISC-V hindering good old world policing.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;RISC-V is not the simplest, but it is the most logical way to get closer to an &amp;quot;Uruguayan Xeon&amp;quot; or a &amp;quot;Nigerian STM32.&amp;quot; And it doesn&amp;#39;t have to be an entirely national project: regional alliances could help lower costs and achieve scale faster. Getting an ARM license is probably easier, but it&amp;#39;s another compliance leash from a country that loves exiting things without thinking them through.&lt;/p&gt;
&lt;p&gt;Without a stable supply of chips, you will have issues with everything from ATMs to train networks. It won&amp;#39;t be immediate—modern silicon is quite durable—but things will break down and require replacement. If you don&amp;#39;t have the benefit of a &amp;quot;death cult of living in squalor and constantly overcoming unnecessary self-imposed problems&amp;quot; in your population (like Russia has), it will become an issue very fast. An issue that both internal and external malevolent actors will exploit. Be less gay, have a chip.&lt;/p&gt;
&lt;p&gt;Sovereign RISC-V production is something that feels unnecessary, expensive, and alarmist now. But when it becomes &amp;quot;today&amp;#39;s problem,&amp;quot; it will be too late.&lt;/p&gt;
&lt;p&gt;And even if you have 30+ CPU suppliers, you can still be enough of an asshole that all of them refuse to sell to you (though things won&amp;#39;t change much for the real bad actors).&lt;/p&gt;
&lt;h2&gt;What Can You Do About It?&lt;/h2&gt;
&lt;p&gt;RISC-V is on the rise, but it still suffers from low adoption across both software and hardware — a classic chicken-and-egg issue.&lt;/p&gt;
&lt;h2&gt;If You Are a Developer&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;You can add cross-compilation to your project. It&amp;#39;s very easy to do with C, Go, and Rust. In the case of platforms with less support, your interest and pressure can help speed up the process (e.g., Node, Crystal, PHP).&lt;/li&gt;
&lt;li&gt;There is a project called &lt;strong&gt;RISE&lt;/strong&gt; that &lt;a href=&quot;https://github.com/apps/rise-risc-v-runners-personal&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;offers RISC-V runners for GitHub CI&lt;/a&gt;.
Although they use hardware without vector extensions, which makes running some distros (like Ubuntu 26.04) impossible, they can still be useful.&lt;/li&gt;
&lt;li&gt;Also consider &lt;strong&gt;Cloud-V&lt;/strong&gt;, &lt;a href=&quot;https://cloud-v.co/risc-v-cicd&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;they provide CI runners&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;If You Are a User (Especially Corporate)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ask maintainers of your favorite software to add RISC-V support. Vote for existing issues in issue trackers, or create new ones if they don&amp;#39;t exist.&lt;/li&gt;
&lt;li&gt;Get yourself some hardware or cloud units and research how ready your infrastructure is for a potential migration.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;If You Are an Activist Type&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Check if local universities have RISC-V programs; support them if you can.&lt;/li&gt;
&lt;li&gt;Check if your jurisdiction has digital/semiconductor sovereignty programs. If not, ask your authorities why not.&lt;/li&gt;
&lt;li&gt;Spread the word: go door-to-door and ask people if they want to hear the good news about RISC-V. Dress appropriately; don&amp;#39;t be weird.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Having a strong alternative architecture will, in the end, benefit all of us.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;// And after the end too, when we scavenge for RISC-V chips in the wasteland.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Where to Get One&lt;/h2&gt;
&lt;p&gt;This is very dynamic market with some supply chain issues, links will go stale faster than I hit publish.&lt;/p&gt;
&lt;p&gt;Good keywords to start your search are SiFive and SpacemiT. Or look at the &lt;a href=&quot;https://browser.geekbench.com/search?utf8=%E2%9C%93&amp;amp;q=RISC&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;Geekbench&lt;/a&gt;&lt;/p&gt;</content:encoded><category>RISC-V</category><category>Hardware</category><category>Digital Sovereignty</category><category>Continuous Integration</category><author>damian.buho@proton.me (Damián Búho)</author></item><item><title>Post: What is B19 images and how I wrap things in containers</title><link>https://dbuho.me/post/what-is-b19/?utm_source=tag-continuous-integration&amp;utm_medium=rss</link><guid isPermaLink="false">01M3DBSDTEQ9SDFATFNBFXEQ7B</guid><description>A big part of my portfolio consists of so-called b19-style images. (b19 means nothing—you just can&amp;#39;t get a proper namespace these days.) It started as an internal effort for my personal and commercial projects, but ended up as a set of conventions unified across 100+ various images (both wrappers and originals). I wanted every container to behave in a predictable way, agnostic of the tech stack, whether it&amp;#39;s a source-based or upstream-based project. I&amp;#39;m not urging anyone to adopt this directly yet—I need some time in public to polish everything—but if you&amp;#39;re tasked with a similar unification job or manage a fleet, feel free to steal the conventions. The conventions are anchored in B19/Ubuntu and flow organically into all downstream projects. The conventions are unopinionated (though the defaults can be). What&amp;#39;s inside?</description><pubDate>Tue, 09 Jun 2026 02:59:00 GMT</pubDate><content:encoded>&lt;p&gt;A big part of my portfolio consists of so-called b19-style images.&lt;br /&gt;
&lt;em&gt;(b19 means nothing—you just can&amp;#39;t get a proper namespace these days.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It started as an internal effort for my personal and commercial projects, but ended up as a set of conventions unified across 100+ various images (both wrappers and originals). I wanted every container to behave in a predictable way, agnostic of the tech stack, whether it&amp;#39;s a source-based or upstream-based project.&lt;/p&gt;
&lt;p&gt;I&amp;#39;m not urging anyone to adopt this directly yet—I need some time in public to polish everything—but if you&amp;#39;re tasked with a similar unification job or manage a fleet, feel free to steal the conventions.&lt;/p&gt;
&lt;p&gt;The conventions are anchored in &lt;a href=&quot;https://dbuho.me/project/b19-ubuntu/&quot;&gt;B19/Ubuntu&lt;/a&gt; and flow organically into all downstream projects.&lt;br /&gt;
The conventions are unopinionated (though the defaults can be).&lt;/p&gt;
&lt;p&gt;What&amp;#39;s inside?&lt;/p&gt;
&lt;h2&gt;Basic container decency&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Follows 12-factor app guidelines&lt;/li&gt;
&lt;li&gt;Reasonable, secure, and safe defaults with minimal user input required&lt;/li&gt;
&lt;li&gt;Images should be immutable; all state lives in volumes&lt;/li&gt;
&lt;li&gt;Support for XDG and other industry standards&lt;/li&gt;
&lt;li&gt;Proper telemetry everywhere&lt;/li&gt;
&lt;li&gt;File operations use locks, always keeping concurrency in mind&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The Dockerfile orchestrates&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;No shell sagas&lt;/li&gt;
&lt;li&gt;No mile-long &lt;code&gt;RUN&lt;/code&gt; commands—one &lt;code&gt;RUN&lt;/code&gt; per stage&lt;/li&gt;
&lt;li&gt;Minimal layers&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Switches, toggles, handles&lt;/h2&gt;
&lt;p&gt;B19-style images expose switches for all kinds of behavior: there&amp;#39;s no such thing as &amp;quot;too many switches.&amp;quot; Where possible, switches are set via environment variables (relying on various mounts and binds is messy).&lt;br /&gt;
Configuration files are generated via Jinja2 templates driven by environment variables.&lt;/p&gt;
&lt;h2&gt;Everything is &lt;code&gt;.d&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Numbered hooks everywhere. Everything can be extended or overridden via simple drop-in shell scripts in downstream projects. Hooks can be inherited:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Build is &lt;code&gt;build.d&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Healthcheck is &lt;code&gt;healthcheck.d&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Entrypoint is &lt;code&gt;entrypoint.d&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Designed with off-grid in mind&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Do not assume connectivity is guaranteed&lt;/li&gt;
&lt;li&gt;Do not assume fast or stable connectivity&lt;/li&gt;
&lt;li&gt;Timeouts, backoffs, and retries everywhere&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In other words, a b19 distribution comes with all the things you would end up adding to an official image anyway—right out of the box.&lt;/p&gt;</content:encoded><category>Meta</category><category>Containerization</category><category>Docker</category><category>Continuous Integration</category><category>Continuous Deployment</category><author>damian.buho@proton.me (Damián Búho)</author></item><item><title>Post: Released textlint-rule-ukraine</title><link>https://dbuho.me/post/released-textlint-rule-ukraine/?utm_source=tag-continuous-integration&amp;utm_medium=rss</link><guid isPermaLink="false">01M293G9HA0RNMP03GD6F1CP0Q</guid><description>I am a big fan of textlint, correct quotes, long dashes, and seeing &amp;quot;0 errors&amp;quot; in my logs. And I noticed how often Western media mess up correct transliterations of Ukrainian identifiers, using russian-to-English transliterations instead of proper Ukrainian-to-English ones. There is a nice web app with bots tackling this topic — check it out. I used their vocabulary to make a ruleset for Textlint — pretty sure they are not interested in doing it themselves. Published as my first npm package . Nothing complex or particularly cool — just wanted to experience npm from the other side. Excited to become another supply chain attack vector in the future!</description><pubDate>Sun, 17 May 2026 02:59:00 GMT</pubDate><content:encoded>&lt;p&gt;I am a big fan of textlint, correct quotes, long dashes, and seeing &amp;quot;0 errors&amp;quot; in my logs.&lt;/p&gt;
&lt;p&gt;And I noticed how often Western media mess up correct transliterations of Ukrainian identifiers,
using russian-to-English transliterations instead of proper Ukrainian-to-English ones.&lt;/p&gt;
&lt;p&gt;There is a &lt;a href=&quot;https://spellingukraine.com&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;nice web app with bots tackling this topic&lt;/a&gt; — check it out.
I used their vocabulary to make a ruleset for &lt;a href=&quot;https://textlint.org&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;Textlint&lt;/a&gt; — pretty sure they
are not interested in doing it themselves.&lt;/p&gt;
&lt;p&gt;Published as &lt;a href=&quot;https://www.npmjs.com/package/textlint-rule-ukraine&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;my first npm package&lt;/a&gt;.
Nothing complex or particularly cool — just wanted to experience npm from the other side.&lt;/p&gt;
&lt;p&gt;Excited to become another supply chain attack vector in the future!&lt;/p&gt;</content:encoded><category>Continuous Integration</category><category>Ukraine</category><author>damian.buho@proton.me (Damián Búho)</author></item></channel></rss>