From 2ca455a957f2af81e46d73aab0f8093b7da2ab4a Mon Sep 17 00:00:00 2001 From: Avior Date: Wed, 30 Apr 2025 22:53:22 +0200 Subject: [PATCH] feat: Add support for ARM servers (#528) --- .dockerignore | 1 - .github/workflows/build.yml | 122 +++++++++++++++++++++--------------- Dockerfile.github-actions | 40 ++++++++++++ 3 files changed, 112 insertions(+), 51 deletions(-) create mode 100644 Dockerfile.github-actions diff --git a/.dockerignore b/.dockerignore index 600783217..e50d5df3d 100644 --- a/.dockerignore +++ b/.dockerignore @@ -19,4 +19,3 @@ dist/ # production /server/dist -/server/generated diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 705269a53..a7c494da7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,63 +1,85 @@ name: Build Docker image + on: push: - branches: - - '*' - tags: - - v* - pull_request: - branches: - - master + +env: + REGISTRY_IMAGE: | + ghcr.io/tcgdex/server + tcgdex/server jobs: build: runs-on: ubuntu-latest - + name: Build TCGdex Server steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Docker meta - id: meta - uses: docker/metadata-action@v5 - with: - images: | - ghcr.io/tcgdex/server - tcgdex/server - tags: | - type=edge - type=ref,event=pr - type=ref,event=branch,prefix=branch- - type=semver,pattern={{version}} - type=semver,pattern={{major}}.{{minor}} - type=semver,pattern={{major}} - type=semver,pattern=latest + - name: Checkout + uses: actions/checkout@v4 + with: + # fetch full history for `updated` support + fetch-depth: 0 - - name: Login to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKERHUB_USER }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - if: ${{ !github.event.pull_request.head.repo.fork && github.actor != 'dependabot[bot]' }} + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY_IMAGE }} + tags: | + type=edge + type=ref,event=pr + type=ref,event=branch,prefix=branch- + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=semver,pattern={{major}} + type=semver,pattern=latest - - name: Login to Github Packages - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.DOCKER_TOKEN }} - if: ${{ !github.event.pull_request.head.repo.fork && github.actor != 'dependabot[bot]' }} + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USER }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + if: ${{ !github.event.pull_request.head.repo.fork && github.actor != 'dependabot[bot]' }} - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 + - name: Login to Github Packages + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.DOCKER_TOKEN }} + if: ${{ !github.event.pull_request.head.repo.fork && github.actor != 'dependabot[bot]' }} + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Pre build server + run: | + bun install --frozen-lockfile + cd server + bun install --frozen-lockfile + bun run compile + rm -rf node_modules + cd .. + rm -rf node_modules + + - name: Build and push + id: build + uses: docker/build-push-action@v6 + with: + context: . + platforms: linux/amd64,linux/arm64 + file: ./Dockerfile.github-actions + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + push: ${{ !github.event.pull_request.head.repo.fork && github.actor != 'dependabot[bot]' }} + cache-to: type=gha,mode=max - - name: Build and push - uses: docker/build-push-action@v6 - with: - context: . - push: ${{ !github.event.pull_request.head.repo.fork && github.actor != 'dependabot[bot]' }} - file: ./Dockerfile - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} diff --git a/Dockerfile.github-actions b/Dockerfile.github-actions new file mode 100644 index 000000000..9f9704cfb --- /dev/null +++ b/Dockerfile.github-actions @@ -0,0 +1,40 @@ +FROM docker.io/oven/bun:1-alpine AS build + +# go to work folder +WORKDIR /usr/src/app + +# allow bun user to edit folder +RUN chown -R bun:bun . + +USER bun + +ADD --chown=bun:bun server/package.json server/bun.lockb ./server/ + +# install prod deps dependencies +RUN cd server && \ + bun install --frozen-install --production + +# go to another VM +FROM docker.io/oven/bun:1-alpine AS prod + +# inform software to be in production +ENV NODE_ENV=production + +# run as non root user +USER bun + +# go to work folder +WORKDIR /usr/src/app + +# copy from build image +COPY --chown=bun:bun ./server/public ./public +COPY --chown=bun:bun ./server/package.json ./package.json +COPY --chown=bun:bun --from=build /usr/src/app/server/node_modules ./node_modules +COPY --chown=bun:bun ./server/src ./src +COPY --chown=bun:bun ./server/generated ./generated + +# Expose port +EXPOSE 3000 + +# run it ! +CMD ["bun", "src/index.ts"]