Zum Inhalt springen

Einrichten der kontinuierlichen Bereitstellung in einem GitHub-Repository

Diese Übersetzung wurde von einer generativen KI mithilfe von Action Continuous Translation erstellt. →

A beautiful cover image with the text "Github CD"

Im heutigen Beitrag werfen wir einen kurzen Blick darauf, wie man eine kontinuierliche Bereitstellung in einem githubGitHub-Repository einrichtet. Wir sind uns ziemlich sicher, dass dieses Setup auch mit anderen Git-Registrys funktioniert. Beachten Sie jedoch, dass sich dieser Beitrag ausschließlich auf GitHub konzentriert.

Dieser Beitrag setzt voraus, dass Sie githubGitHub-Actions in Kombination mit Argo CD verwenden, um Ihre Anwendungen auf einem Kubernetes-Cluster bereitzustellen. Folgen Sie unseren anderen Bereitstellungsbeiträgen, um weitere Anleitungen zur Einrichtung beider Technologien auf Ihrem persönlichen Server zu erhalten.

Vorbereitungen

Wir empfehlen, ein Docker Hub-Konto zu erstellen oder ein anderes Docker-Registry Ihrer Wahl zu nutzen.

Ihr GitHub-Repository muss die folgenden Bedingungen erfüllen:

  • Hat eine Dockerfile (idealerweise im Stammordner)
  • Hat zwei GitHub-Secrets (GitHub-Secret erstellen):
    • DOCKER\_USERNAME: Ihr Docker-Benutzername
    • DOCKER_PASSWORD: Ihr Docker-Passwort (oder Access Token)

Erstellen einer Workflow-Datei (oder mehrerer)

GitHub Actions sind spezielle Jobs in GitHub, die meist auf Linux-Servern ausgeführt werden und über das Erstellen von yaml-Dateien im Verzeichnis .github/workflows gesteuert werden können. Diese speziellen Dateien können festlegen, nach welchen Ereignissen diese Jobs ausgeführt werden sollen, und bieten Ihnen viel Freiheit. Als regelmäßiger GitHub-Actions-Nutzer kann ich Ihnen sagen, dass Sie sich daran gewöhnen sollten, Ihre yaml-Dateien ziemlich oft umzuschreiben, da Sie häufig kleine Details übersehen. Aber ohne weitere Umschweife, lassen Sie uns direkt in die Erstellung einer passenden deployment.yaml-Datei einsteigen, die einige Aufgaben für uns erledigt:

  • Eine neue Docker-Image-Version in Docker Hub hochladen (mit der neuesten Version).
  • Die manifest/deployment.yaml-Datei aktualisieren, damit Argo CD über das neue getaggte Image informiert wird.
  • (optional) Ein neues Release auf GitHub erstellen, damit die Zeitpunkte der Releases dokumentiert sind, wo sie sein sollten.
deployment.yaml
name: Deployment
on:
push:
branches: [main]
merge_group:
pull_request:
branches: [main]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# Automatically cancel in-progress actions on the same branch
concurrency:
group: ${{ github.workflow }}-${{ github.event_name == 'pull_request_target' && github.head_ref || github.ref }}
cancel-in-progress: true
env:
REGISTRY: docker.io
IMAGE_NAME: trueberryless/blog
NODE_VERSION: 20
jobs:
deployment:
if: contains(github.event.head_commit.message, 'deploy') || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Check out the repo
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Create tag
run: echo "IMAGE_TAG=$(echo $GITHUB_REF_NAME-$GITHUB_SHA)" >> $GITHUB_ENV
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Log in to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v4
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: |
${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}
${{ env.IMAGE_NAME }}:latest
labels: ${{ steps.meta.outputs.labels }}
- name: Update deployment.yaml file
run: |
yq eval '.spec.template.spec.containers[0].image = "${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}"' -i manifest/deployment.yaml
- uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: update deployment.json container image (automated)
- uses: ncipollo/release-action@v1
with:
tag: ${{ env.IMAGE_TAG }}
makeLatest: true
body: "A docker image has been deployed to [Docker Hub](https://hub.docker.com/r/${{ env.IMAGE_NAME }}/tags)."

Hier finden Sie eine veraltete docker-hub.yaml, die wir früher verwendet haben, da sie gute Versionierungsstrategien bietet:

docker-hub.yaml
144 ausgeblendete Zeilen
name: Docker Image Push
on:
push:
branches: [main]
merge_group:
pull_request:
branches: [main]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# Automatically cancel in-progress actions on the same branch
concurrency:
group: ${{ github.workflow }}-${{ github.event_name == 'pull_request_target' && github.head_ref || github.ref }}
cancel-in-progress: true
env:
REGISTRY: docker.io
IMAGE_NAME: trueberryless/blog
NODE_VERSION: 18
jobs:
docker-push-image:
if: contains(github.event.head_commit.message, 'version') || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Check out the repo
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Check if file exists
run: |
if [ -f .github/artifacts/version.json ]; then
echo "File exists"
echo "FILE_EXISTS=true" >> $GITHUB_ENV
else
echo "File does not exist"
echo "FILE_EXISTS=false" >> $GITHUB_ENV
fi
- name: read_json
if: ${{ env.FILE_EXISTS == 'true' }}
id: version
uses: zoexx/github-action-json-file-properties@release
with:
file_path: ".github/artifacts/version.json"
- name: save environment variables
if: ${{ env.FILE_EXISTS == 'true' }}
run: |
echo "MAJOR=${{steps.version.outputs.major}}" >> $GITHUB_ENV
echo "MINOR=${{steps.version.outputs.minor}}" >> $GITHUB_ENV
echo "PATCH=${{steps.version.outputs.patch}}" >> $GITHUB_ENV
- name: create environment variables
if: ${{ env.FILE_EXISTS == 'false' }}
run: |
echo "MAJOR=0" >> $GITHUB_ENV
echo "MINOR=0" >> $GITHUB_ENV
echo "PATCH=0" >> $GITHUB_ENV
- name: echo environment variables
run: |
echo ${{ env.MINOR }}
echo ${{ env.MINOR }}
echo ${{ env.MINOR }}
- name: Major version
if: contains(github.event.head_commit.message, 'major')
run: |
echo "New major version"
echo "MAJOR=$((${{ env.MAJOR }}+1))" >> $GITHUB_ENV
echo "MINOR=0" >> $GITHUB_ENV
echo "PATCH=0" >> $GITHUB_ENV
- name: Minor version
if: contains(github.event.head_commit.message, 'minor')
run: |
echo "New minor version"
echo "MINOR=$((${{ env.MINOR }}+1))" >> $GITHUB_ENV
echo "PATCH=0" >> $GITHUB_ENV
- name: Patch version
if: contains(github.event.head_commit.message, 'patch') || github.event_name == 'workflow_dispatch'
run: |
echo "New patch version"
echo "PATCH=$((${{ env.PATCH }}+1))" >> $GITHUB_ENV
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Log in to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v4
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: |
${{ env.IMAGE_NAME }}:${{ env.MAJOR }}.${{ env.MINOR }}.${{ env.PATCH }}
${{ env.IMAGE_NAME }}:latest
labels: ${{ steps.meta.outputs.labels }}
- name: Check out the repo
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Create folder if necessary
if: ${{ env.FILE_EXISTS == 'false' }}
run: mkdir -p .github/artifacts
- name: write_json
id: create-json
uses: jsdaniell/create-json@v1.2.2
with:
name: "version.json"
json: '{ "major": ${{ env.MAJOR }}, "minor": ${{ env.MINOR }}, "patch": ${{ env.PATCH }} }'
dir: ".github/artifacts/"
- uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: update version.json (automated)
- name: Update deployment.yaml file
run: |
yq eval '.spec.template.spec.containers[0].image = "${{ env.IMAGE_NAME }}:${{ env.MAJOR }}.${{ env.MINOR }}.${{ env.PATCH }}"' -i manifest/deployment.yaml
- uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: update deployment.json container image (automated)

Nachdem Sie den Inhalt unserer deployment.yaml-Datei kopiert und die neue Datei im .github/workflows-Ordner erstellt haben, müssen Sie einige sehr wichtige Anpassungen vornehmen:

  • Ändern Sie den IMAGE_NAME in Ihr persönliches Docker Hub-Repository. Der Bildname besteht aus Ihrem Kontonamen und dem Repositoriesnamen. Wenn Sie sich nicht sicher sind, wie Ihr Bildname lautet, können Sie die URL des Docker Hub-Repositories ansehen, dort sollte er irgendwo zu finden sein.

Jetzt sollten Sie bereit sein, das Schlüsselwort deploy in jede Commit-Nachricht für den Hauptzweig Ihres Repositories einzufügen, und es sollte automatisch ein Docker-Image an Docker Hub senden und das Manifest für Argo CD aktualisieren.

Feiern Sie mit einem Kaffee!

Herzlichen Glückwunsch, Sie haben Argo CD erfolgreich mit k3s und ciliumCilium eingerichtet! Sie haben eine Kaffeepause verdient. Genießen Sie eine wohlverdiente Tasse, und wenn Sie mit mir einen virtuellen Kaffee teilen möchten, können Sie gerne meine Arbeit auf Ko-fi unterstützen. Vielen Dank!