diff options
| author | Mohamed Bassem <me@mbassem.com> | 2025-11-30 01:19:52 +0000 |
|---|---|---|
| committer | Mohamed Bassem <me@mbassem.com> | 2025-11-30 01:20:02 +0000 |
| commit | 2e88961757b181f5715b1949fc41ead0d8b5145c (patch) | |
| tree | b50a99ebed8cfccf9397ded07b611eace4533206 /.github/workflows | |
| parent | 2ef751ef49e8760e7694b7d7155db735607d7d9a (diff) | |
| download | karakeep-2e88961757b181f5715b1949fc41ead0d8b5145c.tar.zst | |
ci: parallelize the docker workflow for platforms
Diffstat (limited to '.github/workflows')
| -rw-r--r-- | .github/workflows/docker.yml | 135 |
1 files changed, 112 insertions, 23 deletions
diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index ab68ac84..ee36f1c7 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -8,28 +8,39 @@ on: - main jobs: - push: + build: strategy: fail-fast: false matrix: + platform: [linux/amd64, linux/arm64] + image: [web, workers, cli, mcp, aio] include: - - name: karakeep-web + - platform: linux/amd64 + suffix: amd64 + - platform: linux/arm64 + suffix: arm64 + - image: web + name: karakeep-web target: web tags_latest: ghcr.io/hoarder-app/hoarder-web:latest,ghcr.io/mohamedbassem/hoarder-web:latest,ghcr.io/karakeep-app/karakeep-web:latest tags_release: ghcr.io/hoarder-app/hoarder-web:${{ github.event.release.name }},ghcr.io/mohamedbassem/hoarder-web:${{ github.event.release.name }},ghcr.io/karakeep-app/karakeep-web:${{ github.event.release.name }},ghcr.io/hoarder-app/hoarder-web:release,ghcr.io/mohamedbassem/hoarder-web:release,ghcr.io/karakeep-app/karakeep-web:release - - name: karakeep-workers + - image: workers + name: karakeep-workers target: workers tags_latest: ghcr.io/hoarder-app/hoarder-workers:latest,ghcr.io/mohamedbassem/hoarder-workers:latest,ghcr.io/karakeep-app/karakeep-workers:latest tags_release: ghcr.io/hoarder-app/hoarder-workers:${{ github.event.release.name }},ghcr.io/mohamedbassem/hoarder-workers:${{ github.event.release.name }},ghcr.io/karakeep-app/karakeep-workers:${{ github.event.release.name }},ghcr.io/hoarder-app/hoarder-workers:release,ghcr.io/mohamedbassem/hoarder-workers:release,ghcr.io/karakeep-app/karakeep-workers:release - - name: karakeep-cli + - image: cli + name: karakeep-cli target: cli tags_latest: ghcr.io/hoarder-app/hoarder-cli:latest,ghcr.io/mohamedbassem/hoarder-cli:latest,ghcr.io/karakeep-app/karakeep-cli:latest tags_release: ghcr.io/hoarder-app/hoarder-cli:${{ github.event.release.name }},ghcr.io/mohamedbassem/hoarder-cli:${{ github.event.release.name }},ghcr.io/karakeep-app/karakeep-cli:${{ github.event.release.name }},ghcr.io/hoarder-app/hoarder-cli:release,ghcr.io/mohamedbassem/hoarder-cli:release,ghcr.io/karakeep-app/karakeep-cli:release - - name: karakeep-mcp + - image: mcp + name: karakeep-mcp target: mcp tags_latest: ghcr.io/karakeep-app/karakeep-mcp:latest tags_release: ghcr.io/karakeep-app/karakeep-mcp:${{ github.event.release.name }},ghcr.io/karakeep-app/karakeep-mcp:release - - name: karakeep-aio + - image: aio + name: karakeep-aio target: aio tags_latest: ghcr.io/hoarder-app/hoarder:latest,ghcr.io/karakeep-app/karakeep:latest tags_release: ghcr.io/hoarder-app/hoarder:${{ github.event.release.name }},ghcr.io/karakeep-app/karakeep:${{ github.event.release.name }},ghcr.io/hoarder-app/hoarder:release,ghcr.io/karakeep-app/karakeep:release @@ -40,6 +51,8 @@ jobs: steps: - uses: actions/checkout@v4 + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 @@ -50,29 +63,105 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.GHCR_GITHUB_PAT }} + - name: Prepare tags + id: tags + run: | + set -euo pipefail + add_suffix() { + local value="$1" + local out="" + IFS=',' read -ra items <<< "$value" + for item in "${items[@]}"; do + out+="${item}-${{ matrix.suffix }}," + done + echo "${out%,}" + } + + latest_with_suffix=$(add_suffix "${{ matrix.tags_latest }}") + all_tags="${latest_with_suffix}" + + if [[ "${{ github.event_name }}" == "release" ]]; then + release_with_suffix=$(add_suffix "${{ matrix.tags_release }}") + all_tags="${all_tags},${release_with_suffix}" + echo "release=${release_with_suffix}" >> "$GITHUB_OUTPUT" + fi + + echo "latest=${latest_with_suffix}" >> "$GITHUB_OUTPUT" + echo "all=${all_tags}" >> "$GITHUB_OUTPUT" + - name: Build ${{ matrix.name }} uses: docker/build-push-action@v5 with: context: . - build-args: SERVER_VERSION=nightly + build-args: SERVER_VERSION=${{ github.event_name == 'release' && github.event.release.name || 'nightly' }} file: docker/Dockerfile target: ${{ matrix.target }} - platforms: linux/amd64,linux/arm64 + platforms: ${{ matrix.platform }} push: true - tags: ${{ matrix.tags_latest }} - cache-from: type=registry,ref=ghcr.io/karakeep-app/karakeep-build-cache:${{ matrix.target }} - cache-to: type=registry,mode=max,ref=ghcr.io/karakeep-app/karakeep-build-cache:${{ matrix.target }} + tags: ${{ steps.tags.outputs.all }} + cache-from: type=registry,ref=ghcr.io/karakeep-app/karakeep-build-cache:${{ matrix.target }}-${{ matrix.suffix }} + cache-to: type=registry,mode=max,ref=ghcr.io/karakeep-app/karakeep-build-cache:${{ matrix.target }}-${{ matrix.suffix }} - - name: Build ${{ matrix.name }} (release) - uses: docker/build-push-action@v5 - if: github.event_name == 'release' + manifest: + needs: build + runs-on: ubuntu-latest + permissions: + packages: write + contents: read + strategy: + fail-fast: false + matrix: + include: + - name: karakeep-web + tags_latest: ghcr.io/hoarder-app/hoarder-web:latest,ghcr.io/mohamedbassem/hoarder-web:latest,ghcr.io/karakeep-app/karakeep-web:latest + tags_release: ghcr.io/hoarder-app/hoarder-web:${{ github.event.release.name }},ghcr.io/mohamedbassem/hoarder-web:${{ github.event.release.name }},ghcr.io/karakeep-app/karakeep-web:${{ github.event.release.name }},ghcr.io/hoarder-app/hoarder-web:release,ghcr.io/mohamedbassem/hoarder-web:release,ghcr.io/karakeep-app/karakeep-web:release + - name: karakeep-workers + tags_latest: ghcr.io/hoarder-app/hoarder-workers:latest,ghcr.io/mohamedbassem/hoarder-workers:latest,ghcr.io/karakeep-app/karakeep-workers:latest + tags_release: ghcr.io/hoarder-app/hoarder-workers:${{ github.event.release.name }},ghcr.io/mohamedbassem/hoarder-workers:${{ github.event.release.name }},ghcr.io/karakeep-app/karakeep-workers:${{ github.event.release.name }},ghcr.io/hoarder-app/hoarder-workers:release,ghcr.io/mohamedbassem/hoarder-workers:release,ghcr.io/karakeep-app/karakeep-workers:release + - name: karakeep-cli + tags_latest: ghcr.io/hoarder-app/hoarder-cli:latest,ghcr.io/mohamedbassem/hoarder-cli:latest,ghcr.io/karakeep-app/karakeep-cli:latest + tags_release: ghcr.io/hoarder-app/hoarder-cli:${{ github.event.release.name }},ghcr.io/mohamedbassem/hoarder-cli:${{ github.event.release.name }},ghcr.io/karakeep-app/karakeep-cli:${{ github.event.release.name }},ghcr.io/hoarder-app/hoarder-cli:release,ghcr.io/mohamedbassem/hoarder-cli:release,ghcr.io/karakeep-app/karakeep-cli:release + - name: karakeep-mcp + tags_latest: ghcr.io/karakeep-app/karakeep-mcp:latest + tags_release: ghcr.io/karakeep-app/karakeep-mcp:${{ github.event.release.name }},ghcr.io/karakeep-app/karakeep-mcp:release + - name: karakeep-aio + tags_latest: ghcr.io/hoarder-app/hoarder:latest,ghcr.io/karakeep-app/karakeep:latest + tags_release: ghcr.io/hoarder-app/hoarder:${{ github.event.release.name }},ghcr.io/karakeep-app/karakeep:${{ github.event.release.name }},ghcr.io/hoarder-app/hoarder:release,ghcr.io/karakeep-app/karakeep:release + steps: + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Github Registry + uses: docker/login-action@v3 with: - context: . - build-args: SERVER_VERSION=${{ github.event.release.name }} - file: docker/Dockerfile - target: ${{ matrix.target }} - platforms: linux/amd64,linux/arm64 - push: true - tags: ${{ matrix.tags_release }} - cache-from: type=registry,ref=ghcr.io/karakeep-app/karakeep-build-cache:${{ matrix.target }} - cache-to: type=registry,mode=max,ref=ghcr.io/karakeep-app/karakeep-build-cache:${{ matrix.target }} + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GHCR_GITHUB_PAT }} + + - name: Create manifests for ${{ matrix.name }} + env: + TAGS_LATEST: ${{ matrix.tags_latest }} + TAGS_RELEASE: ${{ matrix.tags_release }} + IS_RELEASE: ${{ github.event_name == 'release' }} + run: | + set -euo pipefail + + create_manifest() { + local tag="$1" + docker buildx imagetools create \ + -t "${tag}" \ + "${tag}-amd64" \ + "${tag}-arm64" + } + + IFS=',' read -ra latest_tags <<< "${TAGS_LATEST}" + for tag in "${latest_tags[@]}"; do + create_manifest "$tag" + done + + if [[ "${IS_RELEASE}" == "true" ]]; then + IFS=',' read -ra release_tags <<< "${TAGS_RELEASE}" + for tag in "${release_tags[@]}"; do + create_manifest "$tag" + done + fi |
