diff --git a/.github/workflows/Manual_Publish_Docker.yml b/.github/workflows/Manual_Publish_Docker.yml index b56e8f6ee..f17f68500 100644 --- a/.github/workflows/Manual_Publish_Docker.yml +++ b/.github/workflows/Manual_Publish_Docker.yml @@ -1,26 +1,50 @@ -name: Manual Publish Docker Latest +name: Build and Publish Docker Images on: workflow_dispatch: + inputs: + build_all: + description: 'Build all images' + type: boolean + default: false + build_base: + description: 'Build base image' + type: boolean + default: false + build_build: + description: 'Build build image' + type: boolean + default: false + build_sm: + description: 'Build SM image' + type: boolean + default: false + skip_main_build: + description: 'Skip main build' + type: boolean + default: false + prod: + description: 'Production build' + type: boolean + default: false permissions: contents: read + packages: write env: - REGISTRY_IMAGE: senexcrenshaw/streammaster + REGISTRY: ghcr.io + BASE_IMAGE_NAME: ${{ github.repository }}-builds + FINAL_IMAGE_NAME: ${{ github.repository }} jobs: - build: + setup: runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - platform: - - linux/amd64 - - linux/arm64 - + outputs: + version: ${{ steps.gitversion.outputs.semVer }} + branchName: ${{ steps.gitversion.outputs.branchName }} + buildMeta ${{ steps.gitversion.outputs.buildMetadata }} steps: - - name: Checkout - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 @@ -30,145 +54,186 @@ jobs: versionSpec: "5.x" - name: Determine Version + id: gitversion uses: gittools/actions/gitversion/execute@v0 - with: - useConfigFile: true - updateAssemblyInfo: true - targetPath: StreamMasterAPI - - - name: Docker meta - id: meta - uses: docker/metadata-action@v4 - with: - images: ${{ env.REGISTRY_IMAGE }} - tags: | - latest - ${{ env.GitVersion_SemVer }} - ${{ env.GitVersion_SemVer }}-${{ env.GitVersion_BuildMetaDataPadded }} - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + build-base: + needs: setup + if: ${{ inputs.build_base || inputs.build_all }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - - name: Login to Docker Hub + - name: Login to GHCR uses: docker/login-action@v2 with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} - - name: Build and push by digest - id: build + - name: Build and push base image uses: docker/build-push-action@v4 with: context: . - platforms: ${{ matrix.platform }} - labels: ${{ steps.meta.outputs.labels }} - outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true + file: Dockerfile.base + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ env.REGISTRY }}/${{ env.BASE_IMAGE_NAME }}:${{ needs.setup.outputs.version }}-base - - name: Export digest - run: | - mkdir -p /tmp/digests - digest="${{ steps.build.outputs.digest }}" - touch "/tmp/digests/${digest#sha256:}" + - name: Save base version + run: echo "${{ needs.setup.outputs.version }}" > basever - - name: Upload digest + - name: Upload base version uses: actions/upload-artifact@v3 with: - name: digests - path: /tmp/digests/* - if-no-files-found: error - retention-days: 1 + name: basever + path: basever - merge: + build-build: + needs: setup + if: ${{ inputs.build_build || inputs.build_all }} runs-on: ubuntu-latest - needs: - - build steps: - - name: Checkout - uses: actions/checkout@v3 + - uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Login to GHCR + uses: docker/login-action@v2 with: - fetch-depth: 0 + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} - - name: Install GitVersion - uses: gittools/actions/gitversion/setup@v0 + - name: Build and push build image + uses: docker/build-push-action@v4 with: - versionSpec: "5.x" + context: . + file: Dockerfile.build + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ env.REGISTRY }}/${{ env.BASE_IMAGE_NAME }}:${{ needs.setup.outputs.version }}-build - - name: Determine Version - uses: gittools/actions/gitversion/execute@v0 + - name: Save build version + run: echo "${{ needs.setup.outputs.version }}" > buildver + + - name: Upload build version + uses: actions/upload-artifact@v3 with: - useConfigFile: true - updateAssemblyInfo: true - targetPath: StreamMasterAPI + name: buildver + path: buildver - - name: Download digests + build-sm: + needs: [setup, build-build] + if: ${{ inputs.build_sm || inputs.build_all }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Download build version uses: actions/download-artifact@v3 with: - name: digests - path: /tmp/digests + name: buildver + path: buildver - - name: Display GitVersion variables + - name: Prepare SM Dockerfile run: | - echo "Major: ${{ env.GitVersion_Major }}" - echo "Minor: ${{ env.GitVersion_Minor }}" - echo "Patch: ${{ env.GitVersion_Patch }}" - echo "PreReleaseTag: ${{ env.GitVersion_PreReleaseTag }}" - echo "PreReleaseTagWithDash: ${{ env.GitVersion_PreReleaseTagWithDash }}" - echo "PreReleaseLabel: ${{ env.GitVersion_PreReleaseLabel }}" - echo "PreReleaseNumber: ${{ env.GitVersion_PreReleaseNumber }}" - echo "WeightedPreReleaseNumber: ${{ env.GitVersion_WeightedPreReleaseNumber }}" - echo "BuildMetaData: ${{ env.GitVersion_BuildMetaData }}" - echo "BuildMetaDataPadded: ${{ env.GitVersion_BuildMetaDataPadded }}" - echo "FullBuildMetaData: ${{ env.GitVersion_FullBuildMetaData }}" - echo "MajorMinorPatch: ${{ env.GitVersion_MajorMinorPatch }}" - echo "SemVer: ${{ env.GitVersion_SemVer }}" - echo "LegacySemVer: ${{ env.GitVersion_LegacySemVer }}" - echo "LegacySemVerPadded: ${{ env.GitVersion_LegacySemVerPadded }}" - echo "AssemblySemVer: ${{ env.GitVersion_AssemblySemVer }}" - echo "AssemblySemFileVer: ${{ env.GitVersion_AssemblySemFileVer }}" - echo "FullSemVer: ${{ env.GitVersion_FullSemVer }}" - echo "InformationalVersion: ${{ env.GitVersion_InformationalVersion }}" - echo "BranchName: ${{ env.GitVersion_BranchName }}" - echo "EscapedBranchName: ${{ env.GitVersion_EscapedBranchName }}" - echo "Sha: ${{ env.GitVersion_Sha }}" - echo "ShortSha: ${{ env.GitVersion_ShortSha }}" - echo "NuGetVersionV2: ${{ env.GitVersion_NuGetVersionV2 }}" - echo "NuGetVersion: ${{ env.GitVersion_NuGetVersion }}" - echo "NuGetPreReleaseTagV2: ${{ env.GitVersion_NuGetPreReleaseTagV2 }}" - echo "NuGetPreReleaseTag: ${{ env.GitVersion_NuGetPreReleaseTag }}" - echo "VersionSourceSha: ${{ env.GitVersion_VersionSourceSha }}" - echo "CommitsSinceVersionSource: ${{ env.GitVersion_CommitsSinceVersionSource }}" - echo "CommitsSinceVersionSourcePadded: ${{ env.GitVersion_CommitsSinceVersionSourcePadded }}" - echo "UncommittedChanges: ${{ env.GitVersion_UncommittedChanges }}" - echo "CommitDate: ${{ env.GitVersion_CommitDate }}" + set -e # Exit immediately if a command exits with a non-zero status. + buildver=$(cat buildver/buildver) + echo "FROM --platform=\$BUILDPLATFORM ${{ env.REGISTRY }}/${{ env.BASE_IMAGE_NAME }}:${buildver}-build AS build" > Dockerfile.sm + cat Dockerfile.sm.template >> Dockerfile.sm - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - - name: Docker meta - id: meta - uses: docker/metadata-action@v4 + - name: Login to GHCR + uses: docker/login-action@v2 with: - images: ${{ env.REGISTRY_IMAGE }} - tags: | - latest - ${{ env.GitVersion_SemVer }} - ${{ env.GitVersion_SemVer }}-${{ env.GitVersion_BuildMetaDataPadded }} + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} - - name: Login to Docker Hub - uses: docker/login-action@v2 + - name: Build and push SM image + uses: docker/build-push-action@v4 with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} + context: . + file: Dockerfile.sm + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ env.REGISTRY }}/${{ env.BASE_IMAGE_NAME }}:${{ needs.setup.outputs.version }}-sm - - name: Build and Push Image - working-directory: /tmp/digests - run: | - docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ - $(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *) + - name: Save SM version + run: echo "${{ needs.setup.outputs.version }}" > smver + + - name: Upload SM version + uses: actions/upload-artifact@v3 + with: + name: smver + path: smver + + build-final: + needs: [setup, build-base, build-sm] + if: ${{ !inputs.skip_main_build || inputs.build_all }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 - - name: Inspect image + - name: Download base version + uses: actions/download-artifact@v3 + with: + name: basever + path: basever + + - name: Download SM version + uses: actions/download-artifact@v3 + with: + name: smver + path: smver + + - name: Prepare final Dockerfile run: | - docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }} + set -e # Exit immediately if a command exits with a non-zero status. + + if [ -f "basever/basever" ]; then + basever=$(cat basever/basever) + else + echo "Error: basever/basever not found!" + exit 1 + fi + + if [ -f "smver/smver" ]; then + smver=$(cat smver/smver) + else + echo "Error: smver/smver not found!" + exit 1 + fi + + + echo "FROM ${{ env.REGISTRY }}/${{ env.BASE_IMAGE_NAME }}:${smver}-sm AS sm" > Dockerfile + echo "FROM ${{ env.REGISTRY }}/${{ env.BASE_IMAGE_NAME }}:${basever}-base AS base" >> Dockerfile + cat Dockerfile.template >> Dockerfile + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Login to GHCR + uses: docker/login-action@v2 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push final image + uses: docker/build-push-action@v4 + with: + context: . + file: Dockerfile + platforms: linux/amd64,linux/arm64 + push: true + tags: | + ${{ env.REGISTRY }}/${{ env.FINAL_IMAGE_NAME }}:${{ needs.setup.outputs.version }} + ${{ env.REGISTRY }}/${{ env.FINAL_IMAGE_NAME }}:${{ inputs.prod && 'latest' || needs.setup.outputs.branchName }} \ No newline at end of file