name: Docker on: push: branches: - master tags: - "v*.*.*" paths-ignore: - '**/*.md' - '.gitignore' - '.github/**' - '!.github/workflows/docker.yml' - 'docker/**' - '!docker/codex.Dockerfile' - '!docker/docker-entrypoint.sh' workflow_dispatch: env: DOCKER_FILE: docker/codex.Dockerfile DOCKER_REPO: codexstorage/nim-codex MAKE_PARALLEL: 4 NIMFLAGS: '-d:disableMarchNative -d:codex_enable_api_debug_peers=true' NIMFLAGS_RELEASE: '-d:disableMarchNative' NAT_IP_AUTO: true NAT_IP_AUTO_RELEASE: false jobs: # Build platform specific image build: strategy: fail-fast: true matrix: target: - os: linux arch: amd64 - os: linux arch: arm64 include: - target: os: linux arch: amd64 builder: ubuntu-22.04 - target: os: linux arch: arm64 builder: buildjet-4vcpu-ubuntu-2204-arm name: Build ${{ matrix.target.os }}/${{ matrix.target.arch }} runs-on: ${{ matrix.builder }} outputs: tags-linux-amd64: ${{ steps.tags.outputs.tags-linux-amd64 }} tags-linux-arm64: ${{ steps.tags.outputs.tags-linux-arm64 }} env: PLATFORM: ${{ format('{0}/{1}', 'linux', matrix.target.arch) }} SUFFIX: ${{ format('{0}-{1}', 'linux', matrix.target.arch) }} steps: - name: Checkout uses: actions/checkout@v3 - name: Docker - Variables run: | # Release if [[ ${{ startsWith(github.ref, 'refs/tags/') }} == "true" ]]; then echo "NIMFLAGS=${{ env.NIMFLAGS_RELEASE }}" >>$GITHUB_ENV echo "NAT_IP_AUTO=${{ env.NAT_IP_AUTO_RELEASE }}" >>$GITHUB_ENV fi - name: Docker - Meta id: meta uses: docker/metadata-action@v4 with: images: ${{ env.DOCKER_REPO }} flavor: | latest=false tags: | type=semver,pattern={{version}},suffix=-${{ env.SUFFIX }} type=sha,suffix=-${{ env.SUFFIX }},enable=${{ !startsWith(github.ref, 'refs/tags/') }} - name: Docker - Set tags output id: tags run: | if [[ '${{ matrix.target.os }}' == 'linux' && '${{ matrix.target.arch }}' == 'amd64' ]]; then echo "tags-linux-amd64=${{ steps.meta.outputs.tags }}" >> "$GITHUB_OUTPUT" elif [[ '${{ matrix.target.os }}' == 'linux' && '${{ matrix.target.arch }}' == 'arm64' ]]; then echo "tags-linux-arm64=${{ steps.meta.outputs.tags }}" >> "$GITHUB_OUTPUT" fi - name: Docker - Login to Docker Hub uses: docker/login-action@v2 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Docker - Build and Push uses: docker/build-push-action@v4 with: context: . file: ${{ env.DOCKER_FILE }} platforms: ${{ env.PLATFORM }} push: true build-args: | MAKE_PARALLEL=${{ env.MAKE_PARALLEL }} NIMFLAGS=${{ env.NIMFLAGS }} NAT_IP_AUTO=${{ env.NAT_IP_AUTO }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} # Publish single image publish: name: Push single image runs-on: ubuntu-latest needs: build steps: - name: Docker - Meta id: meta uses: docker/metadata-action@v4 with: images: ${{ env.DOCKER_REPO }} tags: | type=semver,pattern={{version}} type=sha,enable=${{ !startsWith(github.ref, 'refs/tags/') }} - name: Docker - Set tags run: | # Transform multi-line tags in to the comma-seperated TAGS=$(echo "${{ steps.meta.outputs.tags }}" | tr '\n' ',' | awk '{gsub(/,$/,"");}1') echo "TAGS=${TAGS}" >>$GITHUB_ENV - name: Docker - Login to Docker Hub uses: docker/login-action@v2 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Docker - Create and push manifest images uses: Noelware/docker-manifest-action@master with: inputs: ${{ env.TAGS }} images: ${{ needs.build.outputs.tags-linux-amd64 }},${{ needs.build.outputs.tags-linux-arm64 }} push: true