Configurer le déploiement continu dans un dépôt GitHub
Cette traduction a été générée par une IA générative à l'aide de la traduction continue Action. →
Dans le post d’aujourd’hui, nous allons examiner brièvement comment configurer un déploiement continu dans un dépôt GitHub. Nous sommes assez sûrs que cette configuration fonctionne également pour d’autres registres Git, mais si vous en utilisez un autre, gardez à l’esprit que cet article est conçu uniquement pour GitHub.
Ce post suppose également que vous utilisez GitHub Actions combiné avec Argo CD pour déployer vos applications sur un cluster Kubernetes. Suivez nos autres articles sur le déploiement pour des instructions supplémentaires sur la façon de configurer ces deux technologies sur votre serveur personnel.
Nous recommandons de créer un compte Docker Hub ou de choisir un autre registre Docker si vous le souhaitez.
Votre dépôt GitHub doit remplir ces conditions :
- A un Dockerfile (idéalement dans le dossier racine)
- A deux Secrets GitHub (créer un Secret GitHub) :
- DOCKER\_USERNAME : Votre nom d’utilisateur Docker
- DOCKER_PASSWORD : Votre mot de passe Docker (ou jeton d’accès)
Les GitHub Actions sont des tâches spécifiques sur GitHub qui fonctionnent principalement sur des serveurs Linux et peuvent être contrôlées en créant des fichiers yaml dans le répertoire .github/workflows. Ces fichiers particuliers permettent de définir les événements déclencheurs des tâches et offrent beaucoup de flexibilité. En tant qu’utilisateur régulier des GitHub Actions, je peux vous dire qu’il faut souvent réécrire vos fichiers yaml car les petits détails sont facilement négligés. Mais sans plus attendre, passons directement à la création d’un fichier deployment.yaml adapté, qui effectuera les tâches suivantes pour nous :
- Pousser une nouvelle image Docker sur Docker Hub (avec la dernière version).
- Mettre à jour le fichier
manifest/deployment.yamlpour qu’Argo CD soit informé de la nouvelle image taguée. - (optionnel) Créer une nouvelle release sur GitHub, afin que les temps de publication soient documentés où ils doivent l’être.
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)."Voici un fichier docker-hub.yaml obsolète que nous utilisions auparavant car il proposait de bonnes stratégies de versioning :
144 collapsed lines
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)Après avoir copié le contenu de notre fichier deployment.yaml et créé le nouveau fichier dans le dossier .github/workflows, vous devez effectuer quelques adaptations très importantes :
- Modifiez le
IMAGE_NAMEpour qu’il corresponde à votre dépôt personnel sur Docker Hub. Le nom de l’image se compose de votre nom de compte et du nom du dépôt. Si vous n’êtes pas sûr de ce qu’est le nom de votre image, vous pouvez regarder l’URL du dépôt Docker Hub, il devrait y figurer quelque part.
Maintenant, vous êtes prêt à ajouter le mot-clé deploy dans n’importe quel message de commit sur la branche principale de votre dépôt, et cela devrait automatiquement pousser une image Docker sur Docker Hub et mettre à jour le manifeste pour Argo CD.
Félicitations, vous avez configuré Argo CD avec k3s et
Cilium avec succès ! Vous méritez une pause café. Savourez une tasse bien méritée, et si vous souhaitez partager un café virtuel avec moi, n’hésitez pas à soutenir mon travail sur Ko-fi. Merci !