Seit einer ganzen Weile läuft dieser Blog mit Jekylls und ist mit git versioniert. Immer wenn ich einen neuen Post veröffentlichen möchte, muss ich

bundle exec jekyll build

ausführen und dann mit rsync die neuen Dateien auf meinen host kopieren. Dafür habe ich mir ursprünglich mal ein kleines Rakefile geschrieben um das einfacher zu machen. Das Problem an der Sache ist dass ich das eigentlich nur auf meinem Mac machen kann und auch immer manuell starten muss. Früher™️ hatte ich meine eigene gitlab installation laufen und damit auch mein eigenes CI/CD. Der Aufwand die Installation zu pflegen war mir aber zu hoch und so bin ich nun doch bei einem privaten Github Repository gelandet. Da gibt es ja Github Actions die eine rudimentäre build-pipeline ermöglichen und das nutze ich nun um meinen blog einfacher zu aktualisieren.

Im wesentlichen funktioniert das genau wie lokal:

  • ich baue die website mit jekyll
  • ich kopiere die dateien mit rsync auf meinen host

nur passiert das jetzt immer, wenn ich einen neuen commit in einem bestimmten branch pushe. Das kann ich von fast überall - sogar meinem Telefon.

Mal sehen ob ich damit jetzt öfter was poste oder nicht.

Das Github Action Format ist relativ simple und leicht anpassbar: Man legt sich ein yaml-file in .github/workflows/jekyll-build.yaml

name: Build and deploy Jekyll site
on:
  push:
    branches:
      - production

jobs:
  jekyll:
      name: Build and deploy Jekyll site
      runs-on: ubuntu-latest
      steps:
      - name: Install ImageMagick
        run: |
          sudo apt-get update
          sudo apt-get install imagemagick libmagickwand-dev
      - name: Install ruby 3
        run: |
          sudo apt install ruby-full
          ruby --version
      - name: add gem bin to env
        run: |
          echo "/home/runner/.gem/ruby/2.7.0/bin" >> $GITHUB_PATH
      - name: debug PATH 
        run: |
          echo "$PATH" 
      - name: Install bundler
        run: |
          gem install bundler --user-install
      - name: Install Rake
        run: |
          gem install rake --user-install
      - name: Checkout
        uses: actions/checkout@v2
      - name: Install GemFile
        run: |
          bundle install
      - name: Build Page 
        run: |
          rake build
      - name: Deploy to host
        uses: up9cloud/action-rsync@v1.1
        env:
          HOST: blog.kanedo.net
          USER: user
          KEY: $
          TARGET: virtual/blog.kanedo.net/
          VERBOSE: true
          ARGS: -rtzh --delete
          SSH_ARGS: '-p 22 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'
          SOURCE: ./_site/

Der letzte Schritt, rsync, ist eine externe action vom marketplace aber sonst sind alles einfache bash commands die im ubuntu image laufen. Nett ist, dass man mittels secrets einen private SSH Key hinterlegen kann, der dann von rsync benutzt wird. Cool wäre es jetzt noch, dem rsync SSH Key nur Zugriff auf das eine Verzeichniss zu geben… wenn jemand ne Idee hat?