Wir nutzen, wie auch viele andere Entwickler GitHub Workflows, damit wir einige Prozesse, wie Testing bei Pull Requests automatisieren können.
Heute möchte ich Ihnen vorstellen, wie Sie ebenfalls ein vorhandenes Makefile mit in eine GitHub Automation einfließen lassen können.
In diesem Beispiel möchten wir bei jedem neuen Release und mit einer weiteren GitHub Action in das Docker Hub einloggen und ein Image mit zwei Tags automatisiert erstellen und dieses ebenfalls in Docker Hub puschen.
Dazu starten wir mit unserer .yml Konfigurationsdatei. Diese liegt in unsererm Repository in dem folgenden Verzeichnis .github/workflows/. Wir erstellen in diesem Verzeichnis nun eine Datei mit dem Namen makefile.yml. Diese Datei hat den folgenden Inhalt:
name: Makefile CI
on:
push:
tags:
- "v*.*.*"
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Clone repository
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
- name: Build Docker Image
run: make docker-build
- name: Push Image to Docker Hub
run: make docker-push
In dieser Datei wird der Name der Action beschrieben und ebenfalls, wann diese ausgelöst werden soll. In unserem Fall soll diese Action nur bei einem neuen Tag mit der Syntax „v*.*.*“ ausgeführt werden.
Ebenfalls werden die verschiedenen Steps der Action beschrieben. In dem ersten Step erstellen wir eine Kopie von unsererm GitHub Repository. Danach Loggen wir uns mit der GitHub Action docker/login-action@v2 in unserern Docker Hub Account ein. Dazu benötigen wir einen Benuzternamen und das Passwort, welches der Access Token ist. Diese haben wir in diesem Beispiel in dem Repository als Secret gespeichert. Wie man ein Secret anlegt, finden Sie hier.
Nachdem wir uns erfolgreich im Docker Hub angemeldet haben, führen wir erst den Befehl zum Bauen des Docker Image aus. Der dahinter liegende Code in unserem Makefile sieht wie folgt aus:
docker-build:
docker build -t ${DOCKER_HUB_USERNAME}/${BINARY_NAME}:${VERSION} -t ${DOCKER_HUB_USERNAME}/${BINARY_NAME}:latest .
Hier wurden ebenfalls einige Variablen deklariert, die dem Image zwei Tags zuweisen. Einmal die aktuelle Version, den Docker Hub Username und den Namen des Projektes. Die Definition der Variablen sieht wie folgt aus:
BINARY_NAME=compver
GIT_TAG=$(shell git describe --tags --abbrev=0)
VERSION=$(if $(GIT_TAG),$(GIT_TAG),unavailible)
DOCKER_HUB_USERNAME=gowizzard
Nachdem nun das Docker Image mit den Tags erstellt wurde, soll dieses in das Docker Hub hochgeladen werden, dazu führen wir den letzten Step unserer GitHub Action aus. Dahinter liegt der folgende Code, der ebenfalls wieder einige Variablen enthält:
docker-push:
docker push -a ${DOCKER_HUB_USERNAME}/${BINARY_NAME}
Nun wurden alle Schritte abgearbeitet und die GitHub Action bereinigt sich selbst, indem sie sich wieder aus dem Docker Hub abmeldet und das kopierte Repository wieder entfernt.
Jetzt können Sie in Ihrem Docker Hub sich die neu erstellten Images mit den Tags ansehen. Somit müssen Sie diese nicht mehr händisch erstellen, sondern jede neue Versionsnummer startet diese GitHub Action automatisch.