<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2026-03-13T21:45:03+01:00</updated><id>/feed.xml</id><title type="html">ANGU Software Blog</title><subtitle>Sharing ideas and experience around software development. Mostly–but not limited to–iOS.</subtitle><entry><title type="html">Hosting a Jekyll blog on Codeberg.org</title><link href="/hosting/2026/03/13/jekyll-blog-on-codeberg-forgejo.html" rel="alternate" type="text/html" title="Hosting a Jekyll blog on Codeberg.org" /><published>2026-03-13T00:00:00+01:00</published><updated>2026-03-13T00:00:00+01:00</updated><id>/hosting/2026/03/13/jekyll-blog-on-codeberg-forgejo</id><content type="html" xml:base="/hosting/2026/03/13/jekyll-blog-on-codeberg-forgejo.html"><![CDATA[<p>I had been planning to start a blog for some time, collecting topics and testing Jekyll on GitHub Pages. As part of my move to Codeberg, I set up the blog as a proof of concept for hosting my repositories and evaluating <a href="https://docs.codeberg.org/codeberg-pages/">Codeberg’s Pages service</a>. For my trial, I simply created the initial Jekyll page with no fancy content. My focus was on trying out the process of publishing the blog site. Eventually, this very blog containing this post emerged from the trial.</p>

<h2 id="jekyll-static-site-generator">Jekyll static site generator</h2>

<p>To create a static web page with Jekyll, we only need the things listed in the <a href="https://jekyllrb.com/docs/">Jekyll Quick Start Guide</a>, which includes:</p>

<ul>
  <li>Ruby with RubyGems</li>
  <li>installing Jekyll and Bundler via RubyGems.</li>
  <li>create a new site</li>
  <li>have Jekyll generate it.</li>
</ul>

<p>The Jekyll documentation offers a guide on how to install the necessary <a href="https://jekyllrb.com/docs/installation/#requirements">requirements</a> for various platforms.</p>

<h2 id="codeberg-pages">Codeberg pages</h2>

<p>The Codeberg Pages service converts the content of a repository into a static website. You can deploy the page via a Webhook or a Forgejo action.</p>

<p>The Webhook option publishes the repository’s content without any pre-processing. However, since I use Jekyll as a site generator, pre-processing is necessary as the static content of the site needs to be generated first. Therefore, publishing the site using the Forgejo Action may be the preferred option.</p>

<h2 id="running-the-forgejo-action">Running the Forgejo Action</h2>

<p>The first attempts to use the action was using one of the <a href="https://codeberg.org/actions/meta#available-runners">Actions runners Codeberg provided</a>.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">on</span><span class="pi">:</span>
  <span class="na">workflow_dispatch</span><span class="pi">:</span>
    <span class="na">input</span><span class="pi">:</span> <span class="pi">[]</span>
  <span class="na">push</span><span class="pi">:</span>
    <span class="na">branches</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">blog</span><span class="pi">]</span>

<span class="na">jobs</span><span class="pi">:</span>
  <span class="na">publish-blog</span><span class="pi">:</span>
    <span class="na">runs-on</span><span class="pi">:</span> <span class="s">codeberg-tiny</span>
    <span class="na">steps</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Check out the repository</span>
        <span class="na">uses</span><span class="pi">:</span> <span class="s">https://data.forgejo.org/actions/checkout@v6</span>
      <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Setup build environment</span>
        <span class="na">run</span><span class="pi">:</span> <span class="s">bundle install</span>
      <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Build ANGU Software Blog</span>
        <span class="na">run</span><span class="pi">:</span> <span class="s">bundle exec jekyll build</span>
      <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Publish blog</span>
        <span class="na">uses</span><span class="pi">:</span> <span class="s">https://codeberg.org/git-pages/action@v2</span>
        <span class="na">with</span><span class="pi">:</span>
          <span class="na">site</span><span class="pi">:</span> <span class="s2">"</span><span class="s">https://$.codeberg.page/angu-software-blog/"</span>
          <span class="na">token</span><span class="pi">:</span> <span class="s">$</span>
          <span class="na">source</span><span class="pi">:</span> <span class="s">_site/</span>
</code></pre></div></div>

<p>Unfortunately this didn’t work because the runner did not had <code class="language-plaintext highlighter-rouge">ruby</code> and <code class="language-plaintext highlighter-rouge">bundler</code> installed, which is required for Jekyll to build the site.</p>

<p>The workflow would fail already before the git-pages action would be triggered.</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>(x) Setup build environment
/var/run/act/workflow/1.sh: line 2: bundle: command not found
⚙️ [runner]: exitcode '127': command not found, please refer to https://github.com/nektos/act/issues/107 for more information
</code></pre></div></div>

<p>I decided to not bother to install a ruby environment on the Codeberg runner, instead to use my own <a href="devops/2026/03/01/forging-a-mac-os-compatible-forgejo-actions-runner.html">MacBook as a self-hosted runner</a>.</p>

<p>I adapted the workflow to use my self-hosted macOS forgejo runner and gave it a go.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># ...</span>
<span class="na">jobs</span><span class="pi">:</span>
  <span class="na">publish-blog</span><span class="pi">:</span>
    <span class="na">runs-on</span><span class="pi">:</span> <span class="s">angu-mac</span>
<span class="c1"># ...</span>
</code></pre></div></div>

<p>Again no luck. Although the site generation succeeded the git-pages action failed.</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>(x) Publish blog
⚙️ [runner]: unable to evaluate current system architecture: unable to get docker info to determine current system architecture [...]
</code></pre></div></div>

<p>It seems the action tries to determine the os it is running on but fails to do so.</p>

<h2 id="the-pragmatic-workaround">The pragmatic workaround</h2>

<p>Since the git-pages action was not an option for now, what were the alternatives?</p>

<p>I came up with a simple pragmatic solution:</p>

<ul>
  <li>Create a separate pages repository on Codeberg</li>
  <li>Run a custom script which builds the site and pushes the generated content to the page-repository</li>
</ul>

<p>The <a href="https://codeberg.org/angu-software/angu-software-blog/src/branch/blog/scripts/publish.sh">publish script</a> implements the following steps:</p>

<ol>
  <li>Generate the site</li>
  <li>Check out the pages repo</li>
  <li>Replace the repo content with the newly generated content</li>
  <li>Push an update to the pages repo</li>
</ol>

<p>The script is executed on every commit to main of the Jekyll repository.</p>

<p>This works! The curl-it is that I now have two repositories to maintain. Which is acceptable for now since one is basically just a storage of the generated page content which happen to be able to be rendered by the Codeberg pages service.</p>

<h2 id="another-alternative">Another alternative</h2>

<p>I reported <a href="https://codeberg.org/git-pages/action/issues/4#issuecomment-11529451">the issue</a> of the Forgejo Action. During the discussion an alternative approach was suggested as a workaround on a macOS runner. The suggestion was to simply run the commands the action would do with a matching git-pages binary for my MacBook runner architecture.</p>

<p>I could even install the git-pages binary on my macOS runner and just call it instead of downloading it on every run. This works because git-pages is also available on Homebrew, or just download it fro the git repo.</p>

<p>This seems like a feasible solution, but I did not tried it yet.</p>

<h2 id="conclusion">Conclusion</h2>

<p>There are always multiple solutions to a problem. Sometimes a very pragmatic approach leads to success when an obvious one is failing.</p>

<p>By creating a separate pages repo and pushing the generated Jekyll site on every commit I managed to enable site deployment in minutes, while the obvious choice to use the existing forgejo actin failed to detect my runners platform.</p>

<p>I still plan to improve on the solution and omit the extra repository by either directly using the git-pages CLI or even fixing the Forgejo action.</p>

<hr />]]></content><author><name></name></author><category term="hosting" /><category term="Forgejo" /><category term="Codeberg" /><category term="macOS" /><category term="Automation" /><category term="Actions" /><summary type="html"><![CDATA[I had been planning to start a blog for some time, collecting topics and testing Jekyll on GitHub Pages. As part of my move to Codeberg, I set up the blog as a proof of concept for hosting my repositories and evaluating Codeberg’s Pages service. For my trial, I simply created the initial Jekyll page with no fancy content. My focus was on trying out the process of publishing the blog site. Eventually, this very blog containing this post emerged from the trial.]]></summary></entry><entry><title type="html">Forging a macOS-Compatible Forgejo Actions Runner</title><link href="/devops/2026/03/01/forging-a-mac-os-compatible-forgejo-actions-runner.html" rel="alternate" type="text/html" title="Forging a macOS-Compatible Forgejo Actions Runner" /><published>2026-03-01T00:00:00+01:00</published><updated>2026-03-01T00:00:00+01:00</updated><id>/devops/2026/03/01/forging-a-mac-os-compatible-forgejo-actions-runner</id><content type="html" xml:base="/devops/2026/03/01/forging-a-mac-os-compatible-forgejo-actions-runner.html"><![CDATA[<p>I am migrating my repositories from GitHub to <a href="https://codeberg.org">Codeberg</a>, which is built on <a href="https://forgejo.org/">Forgejo</a>. As an iOS engineer, I need automation support on macOS—a feature not currently available among Codeberg’s Forgejo runners. This post details how I built the required Forgejo runner binary on my Mac to address this need.</p>

<h2 id="building-forgejo-runner-binary">Building Forgejo runner binary</h2>

<blockquote>
  <p>The <a href="https://forgejo.org/docs/latest/admin/actions/runner-installation/">Forgejo Runner</a> is a daemon that fetches workflows to run from a Forgejo instance, executes them, sends back with the logs and ultimately reports its success or failure.</p>
</blockquote>

<p>Forgejo does not provide a binary for macOS among the many <a href="https://code.forgejo.org/forgejo/runner/releases">Linux distributions</a>.</p>

<p>The <a href="https://code.forgejo.org/forgejo/runner">Forgejo runner repository</a> README.md, however, states that we can build our own runner binary:</p>

<blockquote>
  <p><strong>Building</strong></p>
  <ul>
    <li>Install Go and make(1)</li>
    <li>make build</li>
  </ul>
</blockquote>

<p>After downloading and installing <a href="https://go.dev/doc/install">The Go Programming Language</a> for macOS, we can use the following script to clone the Forgejo Runner repository on a specific version and compile the binary:</p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/bin/zsh</span>
<span class="nb">set</span> <span class="nt">-e</span>

<span class="c"># clone repo</span>
<span class="nb">echo</span> <span class="s2">"[INFO] Cloning Forgejo Runner repo ..."</span>
git clone <span class="s2">"https://code.forgejo.org/forgejo/runner.git"</span> <span class="s2">"forgejo-runner"</span>
<span class="nb">cd</span> <span class="s2">"forgejo-runner"</span>

<span class="c"># Check out revision</span>
<span class="nv">RUNNER_VERSION_TAG</span><span class="o">=</span><span class="s2">"v12.6.4"</span>
<span class="nb">echo</span> <span class="s2">"[INFO] Checking out version </span><span class="nv">$RUNNER_VERSION_TAG</span><span class="s2"> ..."</span>
git fetch <span class="nt">--tags</span>
git checkout <span class="nv">$RUNNER_VERSION_TAG</span>

<span class="c"># build runner</span>
<span class="nb">echo</span> <span class="s2">"[INFO] Build runner ..."</span>
make build

<span class="nb">echo</span> <span class="s2">"[INFO] Successful build '</span><span class="si">$(</span>forgejo-runner <span class="nt">-v</span><span class="si">)</span><span class="s2">'"</span>
</code></pre></div></div>

<p>Once the script has been executed, we can find the macOS Forgejo Action Runner binary in the current directory</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ ./build-forgejo-runner.sh
[INFO] Start building Forgejo Runner v12.6.4 ...
[INFO] Cloning Forgejo Runner repo ...
[INFO] Checking out version v12.6.4 ...
[INFO] Build runner ...
[INFO] Successful build 'forgejo-runner version v12.6.4'
</code></pre></div></div>

<h2 id="using-the-runner">Using the runner</h2>

<p>Once we have built the runner for macOS, we can follow the <a href="https://forgejo.org/docs/latest/admin/actions/runner-installation/">Forgejo Runner installation guide</a> to register and start the runner.</p>

<p>To avoid memorizing steps or repeatedly consulting the docs, I created a management tool: <a href="https://codeberg.org/angu-software/forgejo-runners-management">forgejo-runners-management</a>.</p>

<p>The tool includes scripts for:</p>
<ul>
  <li>building a runner binary for macOS</li>
  <li>registering a runner on Codeberg</li>
  <li>starting runners</li>
</ul>

<p>This makes it much easier to manage even multiple runners on a single machine.</p>

<h2 id="conclusion">Conclusion</h2>

<p>While Codeberg and Forgejo do not provide Action Runners for macOS out of the box, building a macOS binary is entirely possible.</p>

<p>The <a href="https://codeberg.org/angu-software/forgejo-runners-management">forgejo-runners-management</a> tool simplifies the process and makes managing runners both convenient and enjoyable.</p>

<p>Happy forging!</p>

<hr />]]></content><author><name></name></author><category term="DevOps" /><category term="Forgejo" /><category term="Codeberg" /><category term="macOS" /><category term="Automation" /><category term="Git" /><category term="Runners" /><summary type="html"><![CDATA[I am migrating my repositories from GitHub to Codeberg, which is built on Forgejo. As an iOS engineer, I need automation support on macOS—a feature not currently available among Codeberg’s Forgejo runners. This post details how I built the required Forgejo runner binary on my Mac to address this need.]]></summary></entry></feed>