diff --git a/.github/actions/build-push/action.yml b/.github/actions/build-push/action.yml new file mode 100644 index 00000000..af94b040 --- /dev/null +++ b/.github/actions/build-push/action.yml @@ -0,0 +1,67 @@ +name: Build and Push +description: Build and push Docker images +author: Julien Neuhart + +inputs: + github_token: + description: The GitHub token + required: true + default: ${{ github.token }} + docker_hub_username: + description: The Docker Hub username + required: true + docker_hub_password: + description: The Docker Hub password + required: true + platform: + description: linux/amd64, linux/386, linux/arm64, linux/arm/v7 + required: true + version: + description: Gotenberg version + required: true + alternate_repository: + description: Alternate repository to push the tags to + dry_run: + description: Dry run this action + +outputs: + tags: + description: Comma separated list of tag + value: ${{ steps.build_push.outputs.tags }} + tags_cloud_run: + description: Comma separated list of Cloud Run tags (linux/amd64 only) + value: ${{ steps.build_push.outputs.tags_cloud_run }} + +runs: + using: composite + steps: + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Check out code + uses: actions/checkout@v4 + + - name: Log in to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ inputs.docker_hub_username }} + password: ${{ inputs.docker_hub_password }} + + - name: Build and push ${{ inputs.platform }} + id: build_push + shell: bash + run: | + .github/actions/build-push/build-push.sh \ + --version "${{ inputs.version }}" \ + --platform "${{ inputs.platform }}" \ + --alternate-repository "${{ inputs.alternate_repository }}" \ + --dry-run "${{ inputs.dry_run }}" + + - name: Outputs + shell: bash + run: | + echo "tags=${{ steps.build_push.outputs.tags }}" + echo "tags_cloud_run=${{ steps.build_push.outputs.tags_cloud_run }}" diff --git a/.github/actions/build-push/build-push.sh b/.github/actions/build-push/build-push.sh new file mode 100755 index 00000000..fd3e341f --- /dev/null +++ b/.github/actions/build-push/build-push.sh @@ -0,0 +1,173 @@ +#!/bin/bash + +# Exit early. +# See: https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#The-Set-Builtin. +set -e + +# Source dot env file. +source .env + +# Arguments. +version="" +platform="" +alternate_repository="" +dry_run="" + +while [[ $# -gt 0 ]]; do + case $1 in + --version) + version="${2//v}" + shift 2 + ;; + --platform) + platform="$2" + shift 2 + ;; + --alternate-repository) + alternate_repository="$2" + shift 2 + ;; + --dry-run) + dry_run="$2" + shift 2 + ;; + *) + echo "Unknown option $1" + exit 1 + ;; + esac +done + +echo "Build and push ๐Ÿ‘ท" +echo + +echo "Gotenberg version: $version" +echo "Target platform: $platform" + +if [ -n "$alternate_repository" ]; then + DOCKER_REPOSITORY=$alternate_repository + echo "โš ๏ธ Using $alternate_repository for DOCKER_REPOSITORY" + fi + + if [ "$dry_run" = "true" ]; then + echo "๐Ÿšง Dry run" + fi + +# Build tags arrays. +tags=() +tags_cloud_run=() + +IFS='/' read -ra arch <<< "$platform" +IFS='.' read -ra semver <<< "$version" + +if [ "${#semver[@]}" -eq 3 ]; then + echo + echo "Semver version detected" + + major="${semver[0]}" + minor="${semver[1]}" + patch="${semver[2]}" + + tags+=("$DOCKER_REGISTRY/$DOCKER_REPOSITORY:latest-${arch[1]})") + tags+=("$DOCKER_REGISTRY/$DOCKER_REPOSITORY:$major-${arch[1]}") + tags+=("$DOCKER_REGISTRY/$DOCKER_REPOSITORY:$major.$minor-${arch[1]}r") + tags+=("$DOCKER_REGISTRY/$DOCKER_REPOSITORY:$major.$minor.$patch-${arch[1]}") + + if [ "$platform" = "linux/amd64" ]; then + tags_cloud_run+=("$DOCKER_REGISTRY/$DOCKER_REPOSITORY:latest-cloudrun") + tags_cloud_run+=("$DOCKER_REGISTRY/$DOCKER_REPOSITORY:$major-cloudrun") + tags_cloud_run+=("$DOCKER_REGISTRY/$DOCKER_REPOSITORY:$major.$minor-cloudrun") + tags_cloud_run+=("$DOCKER_REGISTRY/$DOCKER_REPOSITORY:$major.$minor.$patch-cloudrun") + fi +else + echo + echo "Non-semver version detected, fallback to $version" + + tags+=("$DOCKER_REGISTRY/$DOCKER_REPOSITORY:$version-${arch[1]}") + if [ "$platform" = "linux/amd64" ]; then + tags_cloud_run+=("$DOCKER_REGISTRY/$DOCKER_REPOSITORY:$version-cloudrun") + fi +fi + +tags_flags=() +tags_cloud_run_flags=() + +echo "Will push the following tags:" +for tag in "${tags[@]}"; do + tags_flags+=("-t" "$tag") + echo "- $tag" +done +for tag in "${tags_cloud_run[@]}"; do + tags_cloud_run_flags+=("-t" "$tag") + echo "- $tag" +done +echo + +# Build and push images. +run_cmd() { + local cmd="$1" + + if [ "$dry_run" = "true" ]; then + echo "๐Ÿšง Dry run - would run the following command:" + echo "$cmd" + echo + else + echo "โš™๏ธ Running command:" + echo "$cmd" + eval "$cmd" + echo + fi +} + +join() { + local delimiter="$1" + shift + local IFS="$delimiter" + echo "$*" +} + +cmd="docker buildx build \ + --build-arg GOLANG_VERSION=$GOLANG_VERSION \ + --build-arg GOTENBERG_VERSION=$version \ + --build-arg GOTENBERG_USER_GID=$GOTENBERG_USER_GID \ + --build-arg GOTENBERG_USER_UID=$GOTENBERG_USER_UID \ + --build-arg NOTO_COLOR_EMOJI_VERSION=$NOTO_COLOR_EMOJI_VERSION \ + --build-arg PDFTK_VERSION=$PDFTK_VERSION \ + --build-arg PDFCPU_VERSION=$PDFCPU_VERSION \ + --push \ + --platform $platform \ + ${tags_flags[*]} \ + -f $DOCKERFILE $DOCKER_BUILD_CONTEXT +" +run_cmd "$cmd" + +if [ "$platform" != "linux/amd64" ]; then + echo "โš ๏ธ Skip Cloud Run variant(s)" + echo "โœ… Done!" + echo "tags=$(join "," "${tags[@]}")" >> "$GITHUB_OUTPUT" + echo "tags_cloud_run=$(join "," "${tags_cloud_run[@]}")" >> "$GITHUB_OUTPUT" + exit 0 +fi + +source_tag_cloud_run="$DOCKER_REGISTRY/$DOCKER_REPOSITORY:$version-${arch[1]}" +cmd="docker pull $source_tag_cloud_run" +run_cmd "$cmd" + + target_tag_cloud_run="$DOCKER_REGISTRY/$DOCKER_REPOSITORY:$version" + cmd="docker image tag $source_tag_cloud_run $target_tag_cloud_run" + run_cmd "$cmd" + +cmd="docker build \ + --build-arg DOCKER_REGISTRY=$DOCKER_REGISTRY \ + --build-arg DOCKER_REPOSITORY=$DOCKER_REPOSITORY \ + --build-arg GOTENBERG_VERSION=$version \ + --push \ + ${tags_cloud_run_flags[*]} \ + -f $DOCKERFILE_CLOUDRUN $DOCKER_BUILD_CONTEXT +" +run_cmd "$cmd" + +echo "โœ… Done!" +echo "tags=$(join "," "${tags[@]}")" >> "$GITHUB_OUTPUT" +echo "tags_cloud_run=$(join "," "${tags_cloud_run[@]}")" >> "$GITHUB_OUTPUT" +exit 0 diff --git a/.github/actions/clean/action.yml b/.github/actions/clean/action.yml new file mode 100644 index 00000000..4dae20bf --- /dev/null +++ b/.github/actions/clean/action.yml @@ -0,0 +1,31 @@ +name: Clean +description: Clean tags from Docker Hub +author: Julien Neuhart + +inputs: + docker_hub_username: + description: The Docker Hub username + required: true + docker_hub_password: + description: The Docker Hub password + required: true + tags: + description: Comma separated list of tags to clean + snapshot_version: + description: Snapshot version to clean + dry_run: + description: Dry run this action + +runs: + using: composite + steps: + - name: Clean tags from Docker Hub + env: + DOCKERHUB_USERNAME: ${{ inputs.docker_hub_username }} + DOCKERHUB_TOKEN: ${{ inputs.docker_hub_password }} + shell: bash + run: | + .github/actions/clean/clean.sh \ + --tags "${{ inputs.tags }}" \ + --snapshot-version "${{ inputs.snapshot_version }}" \ + --dry-run "${{ inputs.dry_run }}" diff --git a/.github/actions/clean/clean.sh b/.github/actions/clean/clean.sh new file mode 100755 index 00000000..4cfbc1dc --- /dev/null +++ b/.github/actions/clean/clean.sh @@ -0,0 +1,122 @@ +#!/bin/bash + +# Exit early. +# See: https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#The-Set-Builtin. +set -e + +# Source dot env file. +source .env + +# Arguments. +tags="" +snapshot_version="" +dry_run="" + +while [[ $# -gt 0 ]]; do + case $1 in + --tags) + tags="$2" + shift 2 + ;; + --snapshot-version) + snapshot_version="${2//v}" + shift 2 + ;; + --dry-run) + dry_run="$2" + shift 2 + ;; + *) + echo "Unknown option $1" + exit 1 + ;; + esac +done + +echo "Clean tag(s) from Docker Hub ๐Ÿงน" +echo + +IFS=',' read -ra tags_to_delete <<< "$tags" +if [ -n "$snapshot_version" ]; then + tags_to_delete+=("$DOCKER_REGISTRY/snapshot:$snapshot_version") + tags_to_delete+=("$DOCKER_REGISTRY/snapshot:$snapshot_version-cloudrun") +fi + +echo "Will delete the following tag(s):" +for tag in "${tags_to_delete[@]}"; do + echo "- $tag" +done + + if [ "$dry_run" = "true" ]; then + echo "๐Ÿšง Dry run" + fi +echo + +# Delete tags. +base_url="https://hub.docker.com/v2" +token="" + +if [ "$dry_run" = "true" ]; then + token="placeholder" + echo "๐Ÿšง Dry run - would call $base_url to get a token" + echo +else + echo "๐ŸŒ Get token from $base_url" + + readarray -t lines < <( + curl -s -X POST \ + -H "Content-Type: application/json" \ + -d "{\"username\":\"$DOCKERHUB_USERNAME\", \"password\":\"$DOCKERHUB_TOKEN\"}" \ + -w "\n%{http_code}" \ + "$base_url/users/login" + ) + + http_code="${lines[-1]}" + unset 'lines[-1]' + json_body=$(printf "%s\n" "${lines[@]}") + + if [ "$http_code" -ne "200" ]; then + echo "โŒ Wrong HTTP status - $http_code" + echo "$json_body" + exit 1 + fi + + token=$(jq -r '.token' <<< "$json_body") + echo +fi + +if [ -z "$token" ]; then + echo "โŒ No token from Docker Hub" + exit 1 +fi + +for tag in "${tags_to_delete[@]}"; do + if [ "$dry_run" = "true" ]; then + echo "๐Ÿšง Dry run - would call $base_url to delete tag $tag" + echo + else + echo "๐ŸŒ Delete tag $tag" + IFS=':' read -ra tag_parts <<< "$tag" + + readarray -t lines < <( + curl -s -X DELETE \ + -H "Authorization: Bearer $token" \ + -w "\n%{http_code}" \ + "$base_url/repositories/${tag_parts[0]}/tags/${tag_parts[1]}/" + ) + + http_code="${lines[-1]}" + unset 'lines[-1]' + + if [ "$http_code" -ne "200" ] && [ "$http_code" -ne "204" ]; then + echo "โŒ Wrong HTTP status - $http_code" + printf '%s\n' "${lines[@]}" + exit 1 + fi + + echo + fi +done + +echo "โœ… Done!" +exit 0 diff --git a/.github/actions/merge/action.yml b/.github/actions/merge/action.yml new file mode 100644 index 00000000..941b37fd --- /dev/null +++ b/.github/actions/merge/action.yml @@ -0,0 +1,48 @@ +name: Merge +description: Merge tags to single multi-platform tags +author: Julien Neuhart + +inputs: + github_token: + description: The GitHub token + required: true + default: ${{ github.token }} + docker_hub_username: + description: The Docker Hub username + required: true + docker_hub_password: + description: The Docker Hub password + required: true + tags: + description: Comma separated tags to merge + required: true + alternate_registry: + description: Alternate registry to also push resulting tags + dry_run: + description: Dry run this action + +runs: + using: composite + steps: + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Check out code + uses: actions/checkout@v4 + + - name: Log in to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ inputs.docker_hub_username }} + password: ${{ inputs.docker_hub_password }} + + - name: Merge + shell: bash + run: | + .github/actions/merge/merge.sh \ + --tags "${{ inputs.tags }}" \ + --alternate-registry "${{ inputs.alternate_registry }}" \ + --dry-run "${{ inputs.dry_run }}" diff --git a/.github/actions/merge/merge.sh b/.github/actions/merge/merge.sh new file mode 100755 index 00000000..c6bdfd4d --- /dev/null +++ b/.github/actions/merge/merge.sh @@ -0,0 +1,109 @@ +#!/bin/bash + +# Exit early. +# See: https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#The-Set-Builtin. +set -e + +# Source dot env file. +source .env + +# Arguments. +tags="" +alternate_registry="" +dry_run="" + +while [[ $# -gt 0 ]]; do + case $1 in + --tags) + tags="$2" + shift 2 + ;; + --alternate-registry) + alternate_registry="$2" + shift 2 + ;; + --dry-run) + dry_run=$2 + shift 2 + ;; + *) + echo "Unknown option $1" + exit 1 + ;; + esac +done + +echo "Merge tag(s) ๐Ÿ‘ท" +echo + +echo "Tag(s) to merge:" +IFS=',' read -ra tags_to_merge <<< "$tags" +for tag in "${tags_to_merge[@]}"; do + echo "- $tag" +done + +if [ -n "$alternate_registry" ]; then + echo "โš ๏ธ Will also push to $alternate_registry registry" +fi + + if [ "$dry_run" = "true" ]; then + echo "๐Ÿšง Dry run" + fi + + echo + + # Build merge map. + declare -A merge_map + + for tag in "${tags_to_merge[@]}"; do + target_tag="${tag//-amd64/}" + target_tag="${target_tag//-arm64/}" + target_tag="${target_tag//-arm/}" + target_tag="${target_tag//-386/}" + + merge_map["$target_tag"]+="$tag " + done + +# Merge tags. +run_cmd() { + local cmd="$1" + + if [ "$dry_run" = "true" ]; then + echo "๐Ÿšง Dry run - would run the following command:" + echo "$cmd" + echo + else + echo "โš™๏ธ Running command:" + echo "$cmd" + eval "$cmd" + echo + fi +} + + for target in "${!merge_map[@]}"; do + IFS=' ' read -ra source_tags <<< "${merge_map[$target]}" + + cmd="docker buildx imagetools create \ + -t $target \ + ${source_tags[*]} + " + run_cmd "$cmd" + + echo "โžก๏ธ $target pushed" + echo + if [ -n "$alternate_registry" ]; then + alternate_target="${target//$DOCKER_REGISTRY/$alternate_registry}" + cmd="docker buildx imagetools create \ + -t $target \ + $alternate_target + " + run_cmd "$cmd" + + echo "โžก๏ธ $alternate_target pushed" + ecno + fi + done + + +echo "โœ… Done!" +exit 0 diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 2b9f8833..3bad94f9 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,8 +1,7 @@ version: 2 updates: - # Maintain dependencies for GitHub Actions - package-ecosystem: "github-actions" directory: "/" schedule: - interval: "weekly" + interval: "weekly" \ No newline at end of file diff --git a/.github/workflows/__build-push.yml b/.github/workflows/__build-push.yml deleted file mode 100644 index 301ae058..00000000 --- a/.github/workflows/__build-push.yml +++ /dev/null @@ -1,51 +0,0 @@ -on: - workflow_call: - inputs: - runs_on: - type: string - required: true - platform: - type: string - required: true - gotenberg_version: - type: string - required: true - alternate_repository: - type: string - default: '' - outputs: - tags: - value: ${{ jobs.build_push.outputs.tags }} - -permissions: - contents: read - -jobs: - build_push: - name: Build and push Docker images - runs-on: ${{ inputs.runs_on }} - outputs: - tags: ${{ steps.build_push.outputs.tags }} - steps: - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Check out code - uses: actions/checkout@v4 - - - name: Log in to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Build and push ${{ inputs.platform }} - id: build_push - uses: gotenberg/gotenberg-release-action/actions/build-push@main - with: - version: ${{ inputs.gotenberg_version }} - platform: ${{ inputs.platform }} - alternate_repository: ${{ inputs.alternate_repository }} diff --git a/.github/workflows/__delete.yml b/.github/workflows/__delete.yml deleted file mode 100644 index 96d2156e..00000000 --- a/.github/workflows/__delete.yml +++ /dev/null @@ -1,28 +0,0 @@ -on: - workflow_call: - inputs: - gotenberg_version: - type: string - required: true - alternate_repository: - type: string - default: '' - -permissions: - contents: read - -jobs: - delete: - name: Delete Docker images - runs-on: ubuntu-latest - steps: - - name: Check out code - uses: actions/checkout@v4 - - - name: Delete - uses: gotenberg/gotenberg-release-action/actions/delete@main - with: - docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }} - docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }} - version: ${{ inputs.gotenberg_version }} - alternate_repository: ${{ inputs.alternate_repository }} diff --git a/.github/workflows/__merge-clean.yml b/.github/workflows/__merge-clean.yml deleted file mode 100644 index baf48444..00000000 --- a/.github/workflows/__merge-clean.yml +++ /dev/null @@ -1,40 +0,0 @@ -on: - workflow_call: - inputs: - tags: - type: string - required: true - alternate_registry: - type: string - default: '' - -permissions: - contents: read - -jobs: - merge_clean: - name: Merge and clean Docker images - runs-on: ubuntu-latest - steps: - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Check out code - uses: actions/checkout@v4 - - - name: Log in to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Merge and clean - uses: gotenberg/gotenberg-release-action/actions/merge-clean@main - with: - docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }} - docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }} - tags: ${{ inputs.tags }} - alternate_registry: ${{ inputs.alternate_registry }} diff --git a/.github/workflows/continuous-delivery.yml b/.github/workflows/continuous-delivery.yml index e2d8c402..74e151f9 100644 --- a/.github/workflows/continuous-delivery.yml +++ b/.github/workflows/continuous-delivery.yml @@ -2,7 +2,7 @@ name: Continuous Delivery on: release: - types: [ published ] + types: [published] permissions: contents: read @@ -10,39 +10,81 @@ permissions: jobs: release_amd64: name: Release linux/amd64 - uses: ./.github/workflows/__build-push.yml - secrets: inherit - with: - runs_on: ubuntu-latest - platform: linux/amd64 - gotenberg_version: ${{ github.event.release.tag_name }} + runs-on: ubuntu-latest + outputs: + tags: ${{ steps.build_push.outputs.tags }} + tags_cloud_run: ${{ steps.build_push.outputs.tags_cloud_run }} + steps: + - name: Checkout source code + uses: actions/checkout@v4 + + - name: Build and push + id: build_push + uses: ./.github/actions/build-push + with: + docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }} + docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }} + version: ${{ github.event.release.tag_name }} + platform: linux/amd64 release_386: name: Release linux/386 - uses: ./.github/workflows/__build-push.yml - secrets: inherit - with: - runs_on: ubuntu-latest - platform: linux/386 - gotenberg_version: ${{ github.event.release.tag_name }} + runs-on: ubuntu-latest + outputs: + tags: ${{ steps.build_push.outputs.tags }} + tags_cloud_run: ${{ steps.build_push.outputs.tags_cloud_run }} + steps: + - name: Checkout source code + uses: actions/checkout@v4 + + - name: Build and push + id: build_push + uses: ./.github/actions/build-push + with: + docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }} + docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }} + version: ${{ github.event.release.tag_name }} + platform: linux/386 release_arm64: name: Release linux/arm64 - uses: ./.github/workflows/__build-push.yml - secrets: inherit - with: - runs_on: ubuntu-24.04-arm - platform: linux/arm64 - gotenberg_version: ${{ github.event.release.tag_name }} + runs-on: ubuntu-24.04-arm + outputs: + docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }} + docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }} + tags: ${{ steps.build_push.outputs.tags }} + tags_cloud_run: ${{ steps.build_push.outputs.tags_cloud_run }} + steps: + - name: Checkout source code + uses: actions/checkout@v4 + + - name: Build and push + id: build_push + uses: ./.github/actions/build-push + with: + docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }} + docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }} + version: ${{ github.event.release.tag_name }} + platform: linux/arm64 release_arm_v7: name: Release linux/arm/v7 - uses: ./.github/workflows/__build-push.yml - secrets: inherit - with: - runs_on: ubuntu-24.04-arm - platform: linux/arm/v7 - gotenberg_version: ${{ github.event.release.tag_name }} + runs-on: ubuntu-24.04-arm + outputs: + tags: ${{ steps.build_push.outputs.tags }} + tags_cloud_run: ${{ steps.build_push.outputs.tags_cloud_run }} + steps: + - name: Checkout source code + uses: actions/checkout@v4 + + - name: Build and push + id: build_push + uses: ./.github/actions/build-push + with: + docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }} + docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }} + version: ${{ github.event.release.tag_name }} + platform: linux/arm/v7 merge_clean_release_tags: needs: @@ -51,8 +93,22 @@ jobs: - release_arm64 - release_arm_v7 name: Merge and clean release tags - uses: ./.github/workflows/__merge-clean.yml - secrets: inherit - with: - tags: "${{ needs.release_amd64.outputs.tags }},${{ needs.release_386.outputs.tags }},${{ needs.release_arm64.outputs.tags }},${{ needs.release_arm_v7.outputs.tags }}" - alternate_registry: thecodingmachine + runs-on: ubuntu-latest + steps: + - name: Checkout source code + uses: actions/checkout@v4 + + - name: Merge + uses: ./.github/actions/merge + with: + docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }} + docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }} + tags: "${{ needs.release_amd64.outputs.tags }},${{ needs.release_386.outputs.tags }},${{ needs.release_arm64.outputs.tags }},${{ needs.release_arm_v7.outputs.tags }}" + alternate_registry: thecodingmachine + + - name: Clean + uses: ./.github/actions/clean + with: + docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }} + docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }} + tags: "${{ needs.release_amd64.outputs.tags }},${{ needs.release_386.outputs.tags }},${{ needs.release_arm64.outputs.tags }},${{ needs.release_arm_v7.outputs.tags }}" diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index f65d9d7b..02f7b5ad 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -16,7 +16,6 @@ permissions: contents: write jobs: - lint: name: Lint runs-on: ubuntu-latest @@ -24,7 +23,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v5 with: - go-version: '1.23' + go-version: "1.23" cache: false - name: Checkout source code @@ -65,54 +64,94 @@ jobs: snapshot_amd64: if: github.event_name == 'pull_request' needs: - - tests + - tests name: Snapshot linux/amd64 - uses: ./.github/workflows/__build-push.yml - secrets: inherit - with: - runs_on: ubuntu-latest - platform: linux/amd64 - gotenberg_version: pr-${{ github.event.pull_request.number }} - alternate_repository: snapshot + runs-on: ubuntu-latest + outputs: + tags: ${{ steps.build_push.outputs.tags }} + tags_cloud_run: ${{ steps.build_push.outputs.tags_cloud_run }} + steps: + - name: Checkout source code + uses: actions/checkout@v4 + + - name: Build and push + id: build_push + uses: ./.github/actions/build-push + with: + docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }} + docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }} + version: pr-${{ github.event.pull_request.number }} + platform: linux/amd64 + alternate_repository: snapshot snapshot_386: if: github.event_name == 'pull_request' needs: - - tests + - tests name: Snapshot linux/386 - uses: ./.github/workflows/__build-push.yml - secrets: inherit - with: - runs_on: ubuntu-latest - platform: linux/386 - gotenberg_version: pr-${{ github.event.pull_request.number }} - alternate_repository: snapshot + runs-on: ubuntu-latest + outputs: + tags: ${{ steps.build_push.outputs.tags }} + tags_cloud_run: ${{ steps.build_push.outputs.tags_cloud_run }} + steps: + - name: Checkout source code + uses: actions/checkout@v4 + + - name: Build and push + id: build_push + uses: ./.github/actions/build-push + with: + docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }} + docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }} + version: pr-${{ github.event.pull_request.number }} + platform: linux/386 + alternate_repository: snapshot snapshot_arm64: if: github.event_name == 'pull_request' needs: - - tests + - tests name: Snapshot linux/arm64 - uses: ./.github/workflows/__build-push.yml - secrets: inherit - with: - runs_on: ubuntu-24.04-arm - platform: linux/arm64 - gotenberg_version: pr-${{ github.event.pull_request.number }} - alternate_repository: snapshot + runs-on: ubuntu-24.04-arm + outputs: + tags: ${{ steps.build_push.outputs.tags }} + tags_cloud_run: ${{ steps.build_push.outputs.tags_cloud_run }} + steps: + - name: Checkout source code + uses: actions/checkout@v4 + + - name: Build and push + id: build_push + uses: ./.github/actions/build-push + with: + docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }} + docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }} + version: pr-${{ github.event.pull_request.number }} + platform: linux/arm64 + alternate_repository: snapshot snapshot_arm_v7: if: github.event_name == 'pull_request' needs: - - tests + - tests name: Snapshot linux/arm/v7 - uses: ./.github/workflows/__build-push.yml - secrets: inherit - with: - runs_on: ubuntu-24.04-arm - platform: linux/arm/v7 - gotenberg_version: pr-${{ github.event.pull_request.number }} - alternate_repository: snapshot + runs-on: ubuntu-24.04-arm + outputs: + tags: ${{ steps.build_push.outputs.tags }} + tags_cloud_run: ${{ steps.build_push.outputs.tags_cloud_run }} + steps: + - name: Checkout source code + uses: actions/checkout@v4 + + - name: Build and push + id: build_push + uses: ./.github/actions/build-push + with: + docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }} + docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }} + version: pr-${{ github.event.pull_request.number }} + platform: linux/arm/v7 + alternate_repository: snapshot merge_clean_snapshot_tags: needs: @@ -121,58 +160,112 @@ jobs: - snapshot_arm64 - snapshot_arm_v7 name: Merge and clean snapshot tags - uses: ./.github/workflows/__merge-clean.yml - secrets: inherit - with: - tags: "${{ needs.snapshot_amd64.outputs.tags }},${{ needs.snapshot_386.outputs.tags }},${{ needs.snapshot_arm64.outputs.tags }},${{ needs.snapshot_arm_v7.outputs.tags }}" + runs-on: ubuntu-latest + steps: + - name: Checkout source code + uses: actions/checkout@v4 + + - name: Merge + uses: ./.github/actions/merge + with: + docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }} + docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }} + tags: "${{ needs.snapshot_amd64.outputs.tags }},${{ needs.snapshot_386.outputs.tags }},${{ needs.snapshot_arm64.outputs.tags }},${{ needs.snapshot_arm_v7.outputs.tags }}" + + - name: Clean + uses: ./.github/actions/clean + with: + docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }} + docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }} + tags: "${{ needs.snapshot_amd64.outputs.tags }},${{ needs.snapshot_386.outputs.tags }},${{ needs.snapshot_arm64.outputs.tags }},${{ needs.snapshot_arm_v7.outputs.tags }}" edge_amd64: if: github.event_name == 'push' && github.ref == 'refs/heads/main' needs: - - tests + - tests name: Edge linux/amd64 - uses: ./.github/workflows/__build-push.yml - secrets: inherit - with: - runs_on: ubuntu-latest - platform: linux/amd64 - gotenberg_version: edge + runs-on: ubuntu-latest + outputs: + tags: ${{ steps.build_push.outputs.tags }} + tags_cloud_run: ${{ steps.build_push.outputs.tags_cloud_run }} + steps: + - name: Checkout source code + uses: actions/checkout@v4 + + - name: Build and push + id: build_push + uses: ./.github/actions/build-push + with: + docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }} + docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }} + version: edge + platform: linux/amd64 edge_386: if: github.event_name == 'push' && github.ref == 'refs/heads/main' needs: - tests name: Edge linux/386 - uses: ./.github/workflows/__build-push.yml - secrets: inherit - with: - runs_on: ubuntu-latest - platform: linux/386 - gotenberg_version: edge + runs-on: ubuntu-latest + outputs: + tags: ${{ steps.build_push.outputs.tags }} + tags_cloud_run: ${{ steps.build_push.outputs.tags_cloud_run }} + steps: + - name: Checkout source code + uses: actions/checkout@v4 + + - name: Build and push + id: build_push + uses: ./.github/actions/build-push + with: + docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }} + docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }} + version: edge + platform: linux/386 edge_arm64: if: github.event_name == 'push' && github.ref == 'refs/heads/main' needs: - - tests + - tests name: Edge linux/arm64 - uses: ./.github/workflows/__build-push.yml - secrets: inherit - with: - runs_on: ubuntu-24.04-arm - platform: linux/arm64 - gotenberg_version: edge + runs-on: ubuntu-24.04-arm + outputs: + tags: ${{ steps.build_push.outputs.tags }} + tags_cloud_run: ${{ steps.build_push.outputs.tags_cloud_run }} + steps: + - name: Checkout source code + uses: actions/checkout@v4 + + - name: Build and push + id: build_push + uses: ./.github/actions/build-push + with: + docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }} + docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }} + version: edge + platform: linux/arm64 edge_arm_v7: if: github.event_name == 'push' && github.ref == 'refs/heads/main' needs: - - tests + - tests name: Edge linux/arm/v7 - uses: ./.github/workflows/__build-push.yml - secrets: inherit - with: - runs_on: ubuntu-24.04-arm - platform: linux/arm/v7 - gotenberg_version: edge + runs-on: ubuntu-24.04-arm + outputs: + tags: ${{ steps.build_push.outputs.tags }} + tags_cloud_run: ${{ steps.build_push.outputs.tags_cloud_run }} + steps: + - name: Checkout source code + uses: actions/checkout@v4 + + - name: Build and push + id: build_push + uses: ./.github/actions/build-push + with: + docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }} + docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }} + version: edge + platform: linux/arm/v7 merge_clean_edge_tags: needs: @@ -181,8 +274,22 @@ jobs: - edge_arm64 - edge_arm_v7 name: Merge and clean edge tags - uses: ./.github/workflows/__merge-clean.yml - secrets: inherit - with: - tags: "${{ needs.edge_amd64.outputs.tags }},${{ needs.edge_386.outputs.tags }},${{ needs.edge_arm64.outputs.tags }},${{ needs.edge_arm_v7.outputs.tags }}" - alternate_registry: thecodingmachine + runs-on: ubuntu-latest + steps: + - name: Checkout source code + uses: actions/checkout@v4 + + - name: Merge + uses: ./.github/actions/merge + with: + docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }} + docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }} + tags: "${{ needs.edge_amd64.outputs.tags }},${{ needs.edge_386.outputs.tags }},${{ needs.edge_arm64.outputs.tags }},${{ needs.edge_arm_v7.outputs.tags }}" + alternate_registry: thecodingmachine + + - name: Clean + uses: ./.github/actions/clean + with: + docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }} + docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }} + tags: "${{ needs.edge_amd64.outputs.tags }},${{ needs.edge_386.outputs.tags }},${{ needs.edge_arm64.outputs.tags }},${{ needs.edge_arm_v7.outputs.tags }}" diff --git a/.github/workflows/pull-request-cleanup.yml b/.github/workflows/pull-request-cleanup.yml index 1815466d..dad5e1c3 100644 --- a/.github/workflows/pull-request-cleanup.yml +++ b/.github/workflows/pull-request-cleanup.yml @@ -2,17 +2,22 @@ name: Pull Request Cleanup on: pull_request: - types: [ closed ] + types: [closed] permissions: contents: read jobs: - cleanup: - name: Cleanup - uses: ./.github/workflows/__delete.yml - secrets: inherit - with: - gotenberg_version: pr-${{ github.event.pull_request.number }} - alternate_repository: snapshot + name: Cleanup Docker images + runs-on: ubuntu-latest + steps: + - name: Check out code + uses: actions/checkout@v4 + + - name: Cleanup + uses: ./.github/actions/clean + with: + docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }} + docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }} + snapshot_version: pr-${{ github.event.pull_request.number }}