Einrichten der kontinuierlichen Bereitstellung in einem GitHub-Repository

Im heutigen Beitrag werfen wir einen kurzen Blick darauf, wie man eine kontinuierliche Bereitstellung in einem GitHub-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 GitHub-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.
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)
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.
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 branchconcurrency: 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:
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 branchconcurrency: 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.
Herzlichen Glückwunsch, Sie haben Argo CD erfolgreich mit k3s und Cilium 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!