diff --git a/.github/workflows/docker-push.yml b/.github/workflows/docker-push.yml new file mode 100644 index 0000000..6e30210 --- /dev/null +++ b/.github/workflows/docker-push.yml @@ -0,0 +1,122 @@ +name: "Docker Push" + +on: + release: + types: [published] + schedule: + - cron: '30 12 * * *' + +permissions: + packages: write + contents: read + +env: + IMAGE_NAME: ${{ github.repository }} + +jobs: + Docker: + name: Docker Build & Publish + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Login to DockerHub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Login to GitHub Container Registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Prepare metadata for build + id: metadata + run: | + rev=$(git rev-list --tags --max-count=1) + version=$(git describe --tags "$rev" | tr -d 'v') + + if [[ -z "$version" ]] ; then + echo "::error::Can't find version info" + exit 1 + fi + + docker_file="Dockerfile" + base_image=$(grep 'FROM ' $docker_file | tail -1 | cut -f2 -d' ') + + if [[ -z "$base_image" ]] ; then + echo "::error::Can't extract base image info" + exit 1 + fi + + echo "::set-output name=version::$version" + echo "::set-output name=dockerfile::$docker_file" + echo "::set-output name=baseimage::$base_image" + + echo -e "\033[34mVersion:\033[0m $version" + echo -e "\033[34mDockerfile:\033[0m $docker_file" + echo -e "\033[34mBase image:\033[0m $base_image" + + - name: Check if build/rebuild is required + id: build_check + run: | + if [[ "${{github.event_name}}" == "release" ]] ; then + echo "::set-output name=build::true" + exit 0 + fi + + echo -e "::group::\033[34mDownloading built image…\033[0m" + + if ! docker pull ghcr.io/${{env.IMAGE_NAME}}:latest ; then + echo "::error::Can't download image ghcr.io/${{env.IMAGE_NAME}}:latest" + exit 1 + fi + + echo "::endgroup::" + echo -e "::group::\033[34mDownloading base image…\033[0m" + + if ! docker pull ${{steps.metadata.outputs.baseimage}} ; then + echo "::error::Can't download image ${{steps.metadata.outputs.baseimage}}" + exit 1 + fi + + echo "::endgroup::" + + base_layer=$(docker inspect "${{steps.metadata.outputs.baseimage}}" | jq -r '.[0].RootFS.Layers[-1]') + + if [[ -z "$base_layer" ]] ; then + echo "::error::Can't extract layers info from base image" + exit 1 + fi + + if ! docker inspect "ghcr.io/${{env.IMAGE_NAME}}:latest" | jq -r '.[0].RootFS.Layers' | grep -q "$base_layer" ; then + echo "::warning::Rebuild image (reason: base image rebuilt)" + echo "::set-output name=build::true" + exit 0 + fi + + - name: Build and push Docker image + if: ${{ steps.build_check.outputs.build == 'true' }} + uses: docker/build-push-action@v3 + with: + push: true + context: . + file: ${{steps.metadata.outputs.dockerfile}} + tags: | + ghcr.io/${{env.IMAGE_NAME}}:${{steps.metadata.outputs.version}} + ghcr.io/${{env.IMAGE_NAME}}:latest + ${{env.IMAGE_NAME}}:${{steps.metadata.outputs.version}} + ${{env.IMAGE_NAME}}:latest + + - name: Show info about built Docker image + uses: essentialkaos/docker-info-action@v1 + with: + image: ${{env.IMAGE_NAME}}:latest + show-labels: true diff --git a/.github/workflows/ghcr.yml b/.github/workflows/ghcr.yml deleted file mode 100644 index 937f0a8..0000000 --- a/.github/workflows/ghcr.yml +++ /dev/null @@ -1,59 +0,0 @@ -name: "GHCR Publish" - -on: - release: - types: [published] - -permissions: - packages: write - contents: read - -env: - REGISTRY: ghcr.io - IMAGE_NAME: ${{ github.repository }} - -jobs: - GHCR: - name: GHCR Build & Publish - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Login to DockerHub - uses: docker/login-action@v2 - env: - DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} - if: ${{ env.DOCKERHUB_USERNAME != '' }} - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Login to GitHub Container Registry - uses: docker/login-action@v2 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Extract metadata (tags, labels) for Docker - id: meta - uses: docker/metadata-action@v4 - with: - images: ${{env.REGISTRY}}/${{env.IMAGE_NAME}} - flavor: latest=true - - - name: Build and push Docker image - uses: docker/build-push-action@v3 - with: - context: . - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - - - name: Show info about built Docker image - uses: essentialkaos/docker-info-action@v1 - with: - image: ${{env.REGISTRY}}/${{env.IMAGE_NAME}}:latest - show-labels: true