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 }}" if [ "${{ gitea.event_name }}" = "workflow_dispatch" ]; then echo "Manual trigger - building all images" # List all directories with Dockerfile IMAGES=$(find images -mindepth 1 -maxdepth 1 -type d -exec test -f {}/Dockerfile \; -print | xargs -n1 basename | tr '\n' ',' | sed 's/,$//') 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 # Convert to JSON array JSON=$(echo "$IMAGES" | tr ',' '\n' | sed 's/.*/"&"/' | tr '\n' ',' | 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: 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"