name: Test, build, and push Docker images on: pull_request: # During PRs, we just check if the changes Dockerfiles can be successfully built branches: - main paths: - "docker/**" workflow_dispatch: schedule: - cron: "0 0 * * *" # every day at midnight concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} cancel-in-progress: true env: REGISTRY: diffusers CI_SLACK_CHANNEL: ${{ secrets.CI_DOCKER_CHANNEL }} jobs: test-build-docker-images: runs-on: group: aws-general-8-plus if: github.event_name == 'pull_request' steps: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Check out code uses: actions/checkout@v6 - name: Find Changed Dockerfiles id: file_changes uses: jitterbit/get-changed-files@v1 with: format: "space-delimited" token: ${{ secrets.GITHUB_TOKEN }} - name: Build Changed Docker Images env: CHANGED_FILES: ${{ steps.file_changes.outputs.all }} run: | echo "$CHANGED_FILES" ALLOWED_IMAGES=( diffusers-pytorch-cpu diffusers-pytorch-cuda diffusers-pytorch-xformers-cuda diffusers-pytorch-minimum-cuda diffusers-doc-builder ) declare -A IMAGES_TO_BUILD=() for FILE in $CHANGED_FILES; do # skip anything that isn't still on disk if [[ ! -e "$FILE" ]]; then echo "Skipping removed file $FILE" continue fi for IMAGE in "${ALLOWED_IMAGES[@]}"; do if [[ "$FILE" == docker/${IMAGE}/* ]]; then IMAGES_TO_BUILD["$IMAGE"]=1 fi done done if [[ ${#IMAGES_TO_BUILD[@]} -eq 0 ]]; then echo "No relevant Docker changes detected." exit 0 fi for IMAGE in "${!IMAGES_TO_BUILD[@]}"; do DOCKER_PATH="docker/${IMAGE}" echo "Building Docker image for $IMAGE" docker build -t "$IMAGE" "$DOCKER_PATH" done if: steps.file_changes.outputs.all != '' build-and-push-docker-images: runs-on: group: aws-general-8-plus if: github.event_name != 'pull_request' permissions: contents: read packages: write strategy: fail-fast: false matrix: image-name: - diffusers-pytorch-cpu - diffusers-pytorch-cuda - diffusers-pytorch-xformers-cuda - diffusers-pytorch-minimum-cuda - diffusers-doc-builder steps: - name: Checkout repository uses: actions/checkout@v6 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ env.REGISTRY }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build and push uses: docker/build-push-action@v6 with: no-cache: true context: ./docker/${{ matrix.image-name }} push: true tags: ${{ env.REGISTRY }}/${{ matrix.image-name }}:latest - name: Post to a Slack channel id: slack uses: huggingface/hf-workflows/.github/actions/post-slack@main with: # Slack channel id, channel name, or user id to post message. # See also: https://api.slack.com/methods/chat.postMessage#channels slack_channel: ${{ env.CI_SLACK_CHANNEL }} title: "🤗 Results of the ${{ matrix.image-name }} Docker Image build" status: ${{ job.status }} slack_token: ${{ secrets.SLACK_CIFEEDBACK_BOT_TOKEN }}