Aller au contenu
A beautiful cover image with the text "Github CD"

Dans le post d’aujourd’hui, nous allons examiner brièvement comment configurer un déploiement continu dans un dépôt GitHubGitHub. 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 GitHubGitHub 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.

Préparatifs

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)

Créer un ou plusieurs fichiers de workflow

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.yaml pour 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.
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)."

Voici un fichier docker-hub.yaml obsolète que nous utilisions auparavant car il proposait de bonnes stratégies de versioning :

docker-hub.yaml
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 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)

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_NAME pour 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.

Célébrez avec un café !

Félicitations, vous avez configuré Argo CD avec k3s et ciliumCilium 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 !