aboutsummaryrefslogtreecommitdiffstats
path: root/.github/workflows/docker.yml
blob: 4f1a4edcbf3ae1bb57337c8218b6282f8a43ac04 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
name: Build and Push Docker
on:
  release:
    types:
      - created
  push:
    branches:
      - main

jobs:
  build:
    strategy:
      fail-fast: false
      matrix:
        platform: [linux/amd64, linux/arm64]
        image: [web, workers, cli, mcp, aio]
        include:
          - platform: linux/amd64
            suffix: amd64
            os: ubuntu-latest
          - platform: linux/arm64
            suffix: arm64
            os: ubuntu-24.04-arm
          - 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
          - 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
          - 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
          - 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
          - 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
    runs-on: ${{ matrix.os }}
    permissions:
      packages: write
      contents: read

    steps:
      - uses: actions/checkout@v4
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Login to Github Registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          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=${{ github.event_name == 'release' && github.event.release.name || 'nightly' }}
          file: docker/Dockerfile
          target: ${{ matrix.target }}
          platforms: ${{ matrix.platform }}
          push: true
          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 }}

  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:
          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