From 128a21ba63abb533452fd2dad24ee02462756b6e Mon Sep 17 00:00:00 2001 From: Constantin Graf Date: Mon, 17 Feb 2025 22:26:16 -0500 Subject: [PATCH] Fix docker for ARM --- .../ISSUE_TEMPLATE/PULL_REQUEST_TEMPLATE.md | 0 .github/ISSUE_TEMPLATE/config.yml | 0 .github/workflows/build-public.yml | 145 ++++++++++++++---- docker/prod/Dockerfile | 2 +- 4 files changed, 118 insertions(+), 29 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/ISSUE_TEMPLATE/config.yml diff --git a/.github/ISSUE_TEMPLATE/PULL_REQUEST_TEMPLATE.md b/.github/ISSUE_TEMPLATE/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..e69de29b diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..e69de29b diff --git a/.github/workflows/build-public.yml b/.github/workflows/build-public.yml index a778e8ad..839d153c 100644 --- a/.github/workflows/build-public.yml +++ b/.github/workflows/build-public.yml @@ -11,10 +11,21 @@ on: - 'docker/prod/**' workflow_dispatch: +env: + DOCKERHUB_REPO: solidtime/solidtime + GHCR_REPO: ghcr.io/solidtime-io/solidtime + name: Build - Public jobs: build: - runs-on: ubuntu-22.04 + strategy: + matrix: + include: + - runs-on: "ubuntu-24.04-arm" + platform: "linux/arm64" + - runs-on: "ubuntu-24.04" + platform: "linux/amd64" + runs-on: ${{ matrix.runs-on }} permissions: packages: write contents: read @@ -29,7 +40,7 @@ jobs: fetch-depth: 0 # Required for WyriHaximus/github-action-get-previous-tag - name: "Get build" - id: build + id: release-build run: echo "build=$(git rev-parse --short=8 HEAD)" >> "$GITHUB_OUTPUT" - name: "Get Previous tag (normal push)" @@ -40,7 +51,7 @@ jobs: prefix: "v" - name: "Get version" - id: version + id: release-version run: | if ${{ !startsWith(github.ref, 'refs/tags/v') }}; then if ${{ startsWith(steps.previoustag.outputs.tag, 'v') }}; then @@ -61,21 +72,23 @@ jobs: rm .env.production .env.ci .env.example - name: "Add version to .env" - run: sed -i 's/APP_VERSION=0.0.0/APP_VERSION=${{ steps.version.outputs.app_version }}/g' .env + run: sed -i 's/APP_VERSION=0.0.0/APP_VERSION=${{ steps.release-version.outputs.app_version }}/g' .env - name: "Add build to .env" - run: sed -i 's/APP_BUILD=0/APP_BUILD=${{ steps.build.outputs.build }}/g' .env + run: sed -i 's/APP_BUILD=0/APP_BUILD=${{ steps.release-build.outputs.build }}/g' .env - name: "Output .env" run: cat .env - - name: "Install dependencies" - uses: php-actions/composer@v6 - if: steps.cache-vendor.outputs.cache-hit != 'true' # Skip if cache hit + - name: "Setup PHP with PECL extension" + uses: shivammathur/setup-php@v2 with: - command: install - only_args: --no-dev --no-ansi --no-interaction --prefer-dist --ignore-platform-reqs --classmap-authoritative - php_version: 8.3 + php-version: '8.3' + extensions: mbstring, dom, fileinfo, pgsql + + - name: "Install dependencies" + run: composer install --no-dev --no-ansi --no-interaction --prefer-dist --ignore-platform-reqs --classmap-authoritative + if: steps.cache-vendor.outputs.cache-hit != 'true' # Skip if cache hit - name: "Use Node.js" uses: actions/setup-node@v4 @@ -88,29 +101,31 @@ jobs: - name: "Build" run: npm run build - - name: "Login to GitHub Container Registry" + - name: "Prepare" + run: | + platform=${{ matrix.platform }} + echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV + + - name: "Docker meta" + id: "meta" + uses: docker/metadata-action@v5 + with: + images: | + ${{ env.DOCKERHUB_REPO }} + ${{ env.GHCR_REPO }} + + - name: "Login to Docker Hub Container Registry" uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: "Login to GitHub Container Registry" uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - name: "Docker meta" - id: "meta" - uses: docker/metadata-action@v5 - with: - images: | - solidtime/solidtime - ghcr.io/${{ github.repository }} - tags: | - type=ref,event=branch - type=ref,event=pr - type=semver,pattern={{version}} - type=semver,pattern={{major}}.{{minor}} - name: "Set up QEMU" uses: docker/setup-qemu-action@v3 @@ -118,16 +133,90 @@ jobs: - name: "Set up Docker Buildx" uses: docker/setup-buildx-action@v3 - - name: "Build and push" + - name: "Build and push by digest" + id: build uses: docker/build-push-action@v6 with: context: . file: docker/prod/Dockerfile build-args: | DOCKER_FILES_BASE_PATH=docker/prod/ - platforms: linux/amd64,linux/arm64 - push: true - tags: ${{ steps.meta.outputs.tags }} + platforms: ${{ matrix.platform }} labels: ${{ steps.meta.outputs.labels }} + outputs: type=image,"name=${{ env.DOCKERHUB_REPO }},${{ env.GHCR_REPO }}",push-by-digest=true,name-canonical=true,push=true cache-from: type=gha cache-to: type=gha,mode=max + + - name: "Export digest" + run: | + mkdir -p ${{ runner.temp }}/digests + digest="${{ steps.build.outputs.digest }}" + touch "${{ runner.temp }}/digests/${digest#sha256:}" + + - name: "Upload digest" + uses: actions/upload-artifact@v4 + with: + name: digests-${{ env.PLATFORM_PAIR }} + path: ${{ runner.temp }}/digests/* + if-no-files-found: error + retention-days: 1 + + merge: + runs-on: ubuntu-latest + permissions: + packages: write + contents: read + attestations: write + id-token: write + timeout-minutes: 90 + needs: + - build + steps: + - name: "Download digests" + uses: actions/download-artifact@v4 + with: + path: ${{ runner.temp }}/digests + pattern: digests-* + merge-multiple: true + + - name: "Login to Docker Hub" + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: "Login to GHCR" + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: "Set up Docker Buildx" + uses: docker/setup-buildx-action@v3 + + - name: "Docker meta" + id: meta + uses: docker/metadata-action@v5 + with: + images: | + ${{ env.DOCKERHUB_REPO }} + ${{ env.GHCR_REPO }} + tags: | + type=ref,event=branch + type=ref,event=pr + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + + - name: "Create manifest list and push" + working-directory: ${{ runner.temp }}/digests + run: | + docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + $(printf '${{ env.DOCKERHUB_REPO }}@sha256:%s ' *) + docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + $(printf '${{ env.GHCR_REPO }}@sha256:%s ' *) + + - name: "Inspect image" + run: | + docker buildx imagetools inspect ${{ env.DOCKERHUB_REPO }}:${{ steps.meta.outputs.version }} + docker buildx imagetools inspect ${{ env.GHCR_REPO }}:${{ steps.meta.outputs.version }} diff --git a/docker/prod/Dockerfile b/docker/prod/Dockerfile index f5419147..2a6afb21 100644 --- a/docker/prod/Dockerfile +++ b/docker/prod/Dockerfile @@ -182,7 +182,7 @@ COPY --chown=${USER}:${USER} ${DOCKER_FILES_BASE_PATH}deployment/php.ini /lib/ph # && composer clear-cache RUN cat .env -RUN php artisan env +#RUN php artisan env RUN php artisan storage:link RUN chmod +x /usr/local/bin/start-container