From 10bae24c5c1955c41cb77e16f30cf633c26549d1 Mon Sep 17 00:00:00 2001 From: Areedtz Date: Sat, 27 Aug 2022 14:37:22 +0200 Subject: [PATCH] Build arm64 docker image and use github actions (#1134) * Setup build pipeline for arm64 docker images using GitHub Actions --- .github/workflows/build-code.yml | 33 ++++++++++++++++++++ .github/workflows/docker-image.yml | 49 ++++++++++++++++++++++++++++++ Dockerfile | 18 ++++++++--- prisma/schema.prisma | 2 +- 4 files changed, 97 insertions(+), 5 deletions(-) create mode 100644 .github/workflows/build-code.yml create mode 100644 .github/workflows/docker-image.yml diff --git a/.github/workflows/build-code.yml b/.github/workflows/build-code.yml new file mode 100644 index 000000000..7f8a09845 --- /dev/null +++ b/.github/workflows/build-code.yml @@ -0,0 +1,33 @@ +name: Build code + +on: + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + node_version: + - 16 + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Use Node.js ${{ matrix.node_version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node_version }} + cache: 'yarn' + + - name: Install dependencies + run: yarn install --frozen-lockfile + + - name: Check formatting + run: yarn format:check + + - name: Execute tests + run: yarn test + + - name: Build application + run: yarn build:all diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml new file mode 100644 index 000000000..d9b5780a0 --- /dev/null +++ b/.github/workflows/docker-image.yml @@ -0,0 +1,49 @@ +name: Docker image CD + +on: + push: + tags: + - '*.*.*' + pull_request: + branches: + - 'main' + +jobs: + build_and_push: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Docker metadata + id: meta + uses: docker/metadata-action@v4 + with: + images: ghostfolio/ghostfolio + tags: | + type=raw,value=arm64 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v2 + + - name: Login to DockerHub + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Build and push + uses: docker/build-push-action@v3 + with: + context: . + platforms: linux/arm64 + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.output.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max diff --git a/Dockerfile b/Dockerfile index 8521e893b..eaf857fe5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,6 @@ -FROM node:16-alpine as builder +FROM --platform=$BUILDPLATFORM node:16-slim as builder # Build application and add additional files - WORKDIR /ghostfolio # Only add basic files without the application itself to avoid rebuilding @@ -10,9 +9,16 @@ COPY ./CHANGELOG.md CHANGELOG.md COPY ./LICENSE LICENSE COPY ./package.json package.json COPY ./yarn.lock yarn.lock +COPY ./.yarnrc .yarnrc COPY ./prisma/schema.prisma prisma/schema.prisma -RUN apk add --no-cache python3 g++ make openssl git +RUN apt update && apt install -y \ + git \ + g++ \ + make \ + openssl \ + python3 \ + && rm -rf /var/lib/apt/lists/* RUN yarn install # See https://github.com/nrwl/nx/issues/6586 for further details @@ -45,7 +51,11 @@ COPY package.json /ghostfolio/dist/apps/api RUN yarn database:generate-typings # Image to run, copy everything needed from builder -FROM node:16-alpine +FROM node:16-slim +RUN apt update && apt install -y \ + openssl \ + && rm -rf /var/lib/apt/lists/* + COPY --from=builder /ghostfolio/dist/apps /ghostfolio/apps WORKDIR /ghostfolio/apps/api EXPOSE 3333 diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 364e71940..0ee858b43 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1,7 +1,7 @@ generator client { provider = "prisma-client-js" previewFeatures = [] - binaryTargets = ["debian-openssl-1.1.x", "native"] + binaryTargets = ["linux-arm64-openssl-1.1.x", "debian-openssl-1.1.x", "native"] } datasource db {