name: Docker Image CI - Docker Hub on: workflow_dispatch: inputs: node_version: description: 'Node.js version to build this image with.' type: choice required: true default: '24' options: - '20' - '24' tag_version: description: 'Tag version of the image to be pushed.' type: string required: true default: 'latest' permissions: contents: read jobs: prepare: runs-on: ubuntu-latest outputs: node_version: ${{ steps.defaults.outputs.node_version }} tag_version: ${{ steps.defaults.outputs.tag_version }} steps: - name: Set default values id: defaults env: NODE_VERSION_INPUT: ${{ github.event.inputs.node_version || '24' }} TAG_VERSION_INPUT: ${{ github.event.inputs.tag_version || 'latest' }} run: | echo "node_version=${NODE_VERSION_INPUT}" >> $GITHUB_OUTPUT echo "tag_version=${TAG_VERSION_INPUT}" >> $GITHUB_OUTPUT build: needs: prepare runs-on: ${{ matrix.runner }} strategy: fail-fast: false matrix: include: - image: flowiseai/flowise dockerfile: ./docker/Dockerfile platform: linux/amd64 runner: ubuntu-latest - image: flowiseai/flowise dockerfile: ./docker/Dockerfile platform: linux/arm64 runner: ubuntu-24.04-arm - image: flowiseai/flowise-worker dockerfile: docker/worker/Dockerfile platform: linux/amd64 runner: ubuntu-latest - image: flowiseai/flowise-worker dockerfile: docker/worker/Dockerfile platform: linux/arm64 runner: ubuntu-24.04-arm steps: - name: Prepare env run: | platform=${{ matrix.platform }} echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV image=${{ matrix.image }} echo "IMAGE_SLUG=${image//\//-}" >> $GITHUB_ENV - name: Checkout uses: actions/checkout@v6.0.2 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v4.0.0 - name: Login to Docker Hub uses: docker/login-action@v4 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build and push by digest id: build uses: docker/build-push-action@v6.19.2 with: context: . file: ${{ matrix.dockerfile }} platforms: ${{ matrix.platform }} build-args: | NODE_VERSION=${{ needs.prepare.outputs.node_version }} outputs: type=image,name=${{ matrix.image }},push-by-digest=true,name-canonical=true,push=true - name: Export digest run: | mkdir -p ${{ runner.temp }}/digests digest="${{ steps.build.outputs.digest }}" touch "${{ runner.temp }}/digests/${digest#sha256:}" - name: Upload digest uses: actions/upload-artifact@v4 with: name: digests-${{ env.IMAGE_SLUG }}-${{ env.PLATFORM_PAIR }} path: ${{ runner.temp }}/digests/* if-no-files-found: error retention-days: 1 merge: needs: [prepare, build] runs-on: ubuntu-latest strategy: fail-fast: false matrix: image: - flowiseai/flowise - flowiseai/flowise-worker steps: - name: Prepare env run: | image=${{ matrix.image }} echo "IMAGE_SLUG=${image//\//-}" >> $GITHUB_ENV - name: Download digests uses: actions/download-artifact@v4 with: path: ${{ runner.temp }}/digests pattern: digests-${{ env.IMAGE_SLUG }}-linux-* merge-multiple: true - name: Set up Docker Buildx uses: docker/setup-buildx-action@v4.0.0 - name: Login to Docker Hub uses: docker/login-action@v4 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Create manifest list and push working-directory: ${{ runner.temp }}/digests run: | docker buildx imagetools create \ -t ${{ matrix.image }}:${{ needs.prepare.outputs.tag_version }} \ $(printf '${{ matrix.image }}@sha256:%s ' *) - name: Inspect image run: | docker buildx imagetools inspect ${{ matrix.image }}:${{ needs.prepare.outputs.tag_version }}