name: Build and Push Docker Images on: push: branches: [main] paths: - 'images/**' workflow_dispatch: env: REGISTRY: gitea.arnodo.fr jobs: detect-changes: runs-on: docker container: image: alpine:3.20 outputs: image_list: ${{ steps.changes.outputs.image_list }} has_changes: ${{ steps.changes.outputs.has_changes }} steps: - name: Install dependencies run: apk add --no-cache git - name: Checkout repository run: | git clone --depth 2 https://gitea.arnodo.fr/${{ gitea.repository }}.git . git checkout ${{ gitea.sha }} - name: Detect images to build id: changes run: | echo "Event: ${{ gitea.event_name }}" # Debug: show images directory echo "Content of images/:" ls -la images/ || echo "images/ not found" if [ "${{ gitea.event_name }}" = "workflow_dispatch" ]; then echo "Manual trigger - building all images" # Simple loop to find images with Dockerfile IMAGES="" for dir in images/*/; do if [ -f "${dir}Dockerfile" ]; then name=$(basename "$dir") echo "Found image: $name" IMAGES="${IMAGES}${name}," fi done IMAGES=${IMAGES%,} # Remove trailing comma else echo "Push event - detecting changes" IMAGES=$(git diff --name-only HEAD~1 HEAD -- images/ 2>/dev/null | cut -d'/' -f2 | sort -u | grep -v '^$' | tr '\n' ',' | sed 's/,$//') fi echo "Detected images: >$IMAGES<" if [ -z "$IMAGES" ]; then echo "has_changes=false" >> $GITHUB_OUTPUT echo "image_list=[]" >> $GITHUB_OUTPUT else # Format JSON avec awk pour être sûr JSON=$(printf '%s\n' "$IMAGES" | tr ',' '\n' | awk '{printf "\"%s\",", $0}' | sed 's/,$//' | sed 's/^/[/' | sed 's/$/]/') echo "JSON: $JSON" echo "has_changes=true" >> $GITHUB_OUTPUT echo "image_list=$JSON" >> $GITHUB_OUTPUT fi build: needs: detect-changes if: needs.detect-changes.outputs.has_changes == 'true' runs-on: docker container: image: docker:cli strategy: matrix: image: ${{ fromJson(needs.detect-changes.outputs.image_list) }} fail-fast: false steps: - name: Debug matrix run: | echo "Matrix image value: '${{ matrix.image }}'" echo "All matrix: ${{ toJson(matrix) }}" - name: Install git and checkout run: | apk add --no-cache git git clone --depth 1 https://gitea.arnodo.fr/${{ gitea.repository }}.git . - name: Login to Registry run: | echo "${{ secrets.REGISTRY_TOKEN }}" | docker login ${{ env.REGISTRY }} -u ${{ gitea.actor }} --password-stdin - name: Build and Push run: | IMAGE_NAME="${{ env.REGISTRY }}/damien/${{ matrix.image }}" IMAGE_PATH="images/${{ matrix.image }}" echo "Building ${IMAGE_NAME}:latest from ${IMAGE_PATH}" docker build -t "${IMAGE_NAME}:latest" "${IMAGE_PATH}" docker push "${IMAGE_NAME}:latest" echo "✅ Pushed ${IMAGE_NAME}:latest"