Les objectifs sont la création d'un pipeline de base (sur la branche unique [main]), lui ajouter les scripts bash facilitant le build et la ré-utilisation des ces scripts sur différentes multi-plateformes CI/CD (plan futur). Nous ajoutons les fichiers qui vont avec: le Dockerfile, le .gitignore ainsi que ses badges.
Nous améliorons le pipeline en y ajoutant un versionning de l'image ainsi que la publication de l'image dans la registry Docker (Hub)
Voir les steps à la Préparation à la CI
Les tests unitaires
Sécuriser la qualité du code avec Spotless, Checkstyle & SpotBugs
Couverture de code avec JaCoCo
ou, le renforcement et la finalisation de main
Mise en place d'un pipeline CI/CD (4/4) - La branche main (final)
FLASHCARDS/
├── .github/workflows/
│ └─ main.yml
├── ci-scripts/
├── src/
│ ├─ main/java/com/example/flashcards/
│ │ ├─ config/ # security config
│ │ ├─ controller/ # REST controllers
│ │ ├─ dto/ # DTOs for API exchanges
│ │ ├─ entity/ # JPA entities
│ │ ├─ mapper/ # mappers
│ │ ├─ repository/ # JPA repositories
│ │ ├─ service/ # services
│ │ └─ FlashcardsApplication.java
│ ├─ resources/
│ │ └─ application.properties
│ └─ test/java/com/example/flashcards/
│ ├─ controller/
│ ├─ dto/
│ ├─ entity/
│ ├─ integration/
│ ├─ mapper/
│ ├─ service/
│ └─ resources/
└── pom.xml
FLASHCARDS/
├── ci-scripts/
│ ├── build.sh
│ ├── docker-build.sh
│ └── test.sh
#!/bin/bash
set -e
echo "=== Building app ==="
./mvnw clean package -DskipTests
#!/bin/bash
set -e
echo "=== Running tests ==="
./mvnw clean verify
#!/bin/bash
set -e
IMAGE_NAME="flashcards-app"
echo "Building Docker image: $IMAGE_NAME"
docker build -t $IMAGE_NAME .
- name: Make scripts and mvnw executable
run: |
chmod +x mvnw
chmod +x ci-scripts/*.sh
et/ou ajouter la ligne d'ajout de permission aux scripts dans les workflows,
git update-index --chmod=+x mvnw
git update-index --chmod=+x ci-scripts/*.sh
2. Vérification à faire, en local:
git ls-files --stage
git diff --summary
100755 ci-scripts/build.sh
100755 ci-scripts/docker-build.sh
100755 ci-scripts/test.sh
100755 mvnw
git add .
git commit -m "Make scripts and mvnw executable"
git push origin feature/branchName
Résultat: Les étapes du genre: "Make scripts and mvnw executable" ou les ligne chmod +x deviennent inutiles.name: Build and Test Flashcards App
on:
push:
branches: [ main ]
pull_request:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '17'
- name: Cache Maven dependencies
uses: actions/cache@v4
with:
path: ~/.m2
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven-
- name: Build
run: ci-scripts/build.sh
- name: Run tests
run: ci-scripts/test.sh
- name: Build Docker image
if: success() && hashFiles('Dockerfile') != ''
run: ci-scripts/docker-build.sh
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
COPY target/flashcards-*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
→ Qui dit "Dockerfile", dit ".dockerignore"
env:
IMAGE_NAME: flashcards
IMAGE_TAG: v${{ github.run_number }}
→ v${{ github.run_number }} construit automatiquement une image versionnée - name: Build Docker image with version tag
run: |
ci-scripts/docker-build.sh "$IMAGE_NAME" "$IMAGE_TAG"
IMAGE_NAME="flashcards-app"
echo "Building Docker image: $IMAGE_NAME"
→ Chaque exécution du pipeline déclenche un nouveau build, IMAGE_NAME=${1:-flashcards}
IMAGE_TAG=${2:-latest}
echo "== Building Docker image: ${IMAGE_NAME}:${IMAGE_TAG} =="
docker build -t ${IMAGE_NAME}:${IMAGE_TAG} .
L'utilisation de v${{ github.run_number }} n'est qu'une approche temporaire,
Plus tard, lors de la finalisation de la branche main, nous créons une vraie version, ainsi qu'une release
Vous devez disposer d'un compte Docker Hub
1. Créer un token depuis votre profil Docker Hub:
Account Settings → Security → New Access Token
github-actions-push - Expires on Never
Access permissions: Read, Write
2. Créer les secrets depuis votre repo
→ Settings → Secrets and variables → Actions
DOCKERHUB_TOKEN (value: your_DockerHub_token)
DOCKERHUB_USERNAME (value: your_DockerHub_account)
3. Ajouter cette étapes à la fin du pipeline:
- name: Log in to Docker Hub
run: echo "${{ secrets.DOCKERHUB_TOKEN }}" | docker login -u "${{ secrets.DOCKERHUB_USERNAME }}" --password-stdin
- name: Push image to Docker Hub
run: |
docker tag $IMAGE_NAME:$IMAGE_TAG ${{ secrets.DOCKERHUB_USERNAME }}/$IMAGE_NAME:$IMAGE_TAG
docker tag $IMAGE_NAME:$IMAGE_TAG ${{ secrets.DOCKERHUB_USERNAME }}/$IMAGE_NAME:latest
docker push ${{ secrets.DOCKERHUB_USERNAME }}/$IMAGE_NAME:$IMAGE_TAG
docker push ${{ secrets.DOCKERHUB_USERNAME }}/$IMAGE_NAME:latest
Les fichiers readme.md | readme_ci.md affichent en temps réel l'état du pipeline et les informations Docker, grâce à ces balises
Reflète le résultat du workflow [main][](https://github.com/user/repo/actions/workflows/main.yml)
[](https://hub.docker.com/r/user/imageName/tags)
[](https://hub.docker.com/r/user/imageName)
[](https://hub.docker.com/r/user/imageName)
docker pull valeriejeanne/flashcards:latest
docker run -p 8080:8080 valeriejeanne/flashcards:latest
Ouvrir ensuite http://localhost:8080