#******************************************************************************* # buidDocker.yml # # Workflow to build and push a multiplatform (amd64, arm64 & arm7) Linux Docker # image for Medley. This workflow uses the latest Maiko docker image and the # latest Medley release on github. # # This workflow contains a sentry that causes it to skip the build (as identified # by its commit SHA) if its already been done. Setting the "force" input to true # will bypass this sentry, # # Updated 2022-01-18 by Frank Halasz from on earlier buildDocker.yml # # Copyright 2022 by Interlisp.org # # ****************************************************************************** name: 'Build/Push Docker Image' # Run this workflow on ... on: workflow_dispatch: force: description: "Force build even if build already successfully completed for this commit" type: choice options: - 'false' - 'true' workflow_call: outputs: successful: description: "'True' if medley docker build completed successully" value: ${{ jobs.complete.outputs.build_successful }} inputs: force: description: "Force build even if build already successfully completed for this commit" required: false type: string default: 'false' secrets: DOCKER_USERNAME: required: true DOCKER_PASSWORD: required: true defaults: run: shell: bash jobs: ###################################################################################### # Regularize the inputs so they can be referenced the same way whether they are # the result of a workflow_dispatch or a workflow_call inputs: runs-on: ubuntu-latest outputs: force: ${{ steps.force.outputs.force }} steps: - id: force run: > if [ '${{ toJSON(inputs) }}' = 'null' ]; then echo ::set-output name=force::'${{ github.event.inputs.force }}'; echo "workflow_dispatch"; else echo ::set-output name=force::'${{ inputs.force }}'; echo "workflow_call"; fi ###################################################################################### # Use sentry-action to determine if this release has already been built # based on the latest commit to the repo sentry: needs: inputs runs-on: ubuntu-latest outputs: release_not_built: ${{ steps.check.outputs.release_not_built }} steps: # Checkout the actions for this repo owner - name: Checkout Actions uses: actions/checkout@v2 with: repository: ${{ github.repository_owner }}/.github path: ./Actions_${{ github.sha }} - run: mv ./Actions_${{ github.sha }}/actions ../actions && rm -rf ./Actions_${{ github.sha }} # Check if build already run for this commit - name: Build already completed? id: check continue-on-error: true uses: ./../actions/check-sentry-action with: tag: "docker" ###################################################################################### # # Build and push the medley docker image # build_and-push: runs-on: ubuntu-latest needs: [inputs, sentry] if: | needs.sentry.outputs.release_not_built == 'true' || needs.inputs.outputs.force == 'true' steps: # Checkout latest commit - name: Checkout Medley uses: actions/checkout@v2 # Set repo env variables - name: Set repo/docker env variables id: repo_env run: | REPO_NAME=${GITHUB_REPOSITORY#*/} echo "REPO_NAME=${REPO_NAME}" >> ${GITHUB_ENV} echo ::set-output name=repo_name::${REPO_NAME} DOCKER_NAMESPACE=$(echo "${{ github.repository_owner }}" | tr '[:upper:]' '[:lower:]') echo "DOCKER_NAMESPACE=${DOCKER_NAMESPACE}" >> ${GITHUB_ENV} echo ::set-output name=docker_namespace::${DOCKER_NAMESPACE} # Get tag of latest Medley release. - name: Get Medley Release Information id: release_info uses: abatilo/release-info-action@v1.3.0 with: owner: ${{ github.repository_owner }} repo: medley # Get asset tars from latest Medley release - name: Download Release Assets uses: robinraju/release-downloader@v1.2 with: repository: ${{ github.repository_owner }}/medley token: ${{ secrets.GITHUB_TOKEN }} latest: true fileName: "*" out-file-path: "release_tars" # Get Maiko release information about latest Maiko Docker Image - name: Get info from latest Maiko image id: maiko_setup run: | docker pull ${DOCKER_NAMESPACE}/maiko:latest MAIKO_RELEASE=$(docker run --entrypoint /bin/bash ${DOCKER_NAMESPACE}/maiko:latest -c "echo \${MAIKO_RELEASE}") echo "MAIKO_RELEASE=${MAIKO_RELEASE}" >> ${GITHUB_ENV} echo ::set-output name=maiko_release::${MAIKO_RELEASE} # Setup environment variables - name: Setup Environment Variables id: setup_env run: | RELEASE_TAG=${{ steps.release_info.outputs.latest_tag }} DOCKER_IMAGE=${DOCKER_NAMESPACE}/${REPO_NAME} DOCKER_TAGS="${DOCKER_IMAGE}:latest,${DOCKER_IMAGE}:${RELEASE_TAG#*-}_${MAIKO_RELEASE#*-}" echo ::set-output name=docker_tags::${DOCKER_TAGS} echo ::set-output name=docker_image::${DOCKER_IMAGE} echo ::set-output name=build_time::$(date -u +'%Y-%m-%dT%H:%M:%SZ') echo ::set-output name=release_tag::${RELEASE_TAG} echo "release_tag=${RELEASE_TAG}" >> ${GITHUB_ENV} # Setup the Docker Machine Emulation environment. - name: Set up QEMU uses: docker/setup-qemu-action@master with: platforms: linux/amd64,linux/arm64,linux/arm/v7 # Setup the Docker Buildx funtion - name: Set up Docker Buildx id: buildx uses: docker/setup-buildx-action@master # Login into DockerHub - required to store the created image - name: Login to DockerHub uses: docker/login-action@v1 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} # Do the Docker Build using the Dockerfile in the repository # checked out and the release tars just downloaded. # Push the result to Docker Hub - name: Build Docker Image for Push to Docker Hub uses: docker/build-push-action@v2 with: builder: ${{ steps.buildx.outputs.name }} build-args: | BUILD_DATE=${{ steps.setup_env.outputs.build_time }} RELEASE_TAG=${{ steps.setup_env.outputs.release_tag }} MAIKO_RELEASE=${{ steps.setup_env.outputs.maiko_release }} DOCKER_NAMESPACE=${{ steps.repo_env.outputs.docker_namespace }} REPO_OWNER=${{ github.repository_owner }} context: ./release_tars file: ./Dockerfile platforms: linux/amd64,linux/arm64,linux/arm/v7 # Push the result to DockerHub push: true tags: ${{ steps.setup_env.outputs.docker_tags }} ###################################################################################### # Use set-sentry-action to determine set the sentry that says this release has # been successfully built complete: runs-on: ubuntu-latest outputs: build_successful: ${{ steps.output.outputs.build_successful }} needs: [inputs, sentry, build_and-push] steps: # Checkout the actions for this repo owner - name: Checkout Actions uses: actions/checkout@v2 with: repository: ${{ github.repository_owner }}/.github path: ./Actions_${{ github.sha }} - run: mv ./Actions_${{ github.sha }}/actions ../actions && rm -rf ./Actions_${{ github.sha }} # Set sentry - name: Set flag that build for this commit has been completed id: set uses: ./../actions/set-sentry-action with: tag: "docker" - name: Output id: output run: | echo ::set-output name=build_successful::'true' ######################################################################################