From bab7b9936e107c311d2e1c6e98fcf016482ff950 Mon Sep 17 00:00:00 2001 From: Malte Hansen Date: Tue, 12 Nov 2024 14:40:52 +0100 Subject: [PATCH] Add GitHub workflow to build multi-arch Docker images Co-authored-by: Hu1buerger --- .github/workflows/deploy-docker.yml | 161 ++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 .github/workflows/deploy-docker.yml diff --git a/.github/workflows/deploy-docker.yml b/.github/workflows/deploy-docker.yml new file mode 100644 index 000000000..e51232fe5 --- /dev/null +++ b/.github/workflows/deploy-docker.yml @@ -0,0 +1,161 @@ +name: CI Pipeline + +on: + push: + branches: + - main + pull_request: + branches: + - main + workflow_dispatch: + +jobs: + npm-install: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'npm' + - name: Cache dependencies + uses: actions/cache@v4 + with: + path: | + .npm/ + node_modules/ + key: ${{ runner.os }}-npm-cache-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-npm-cache- + - name: Install dependencies + run: npm install + + linting: + runs-on: ubuntu-latest + needs: npm-install + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'npm' + - name: Cache dependencies + uses: actions/cache/restore@v4 + with: + path: | + .npm/ + node_modules/ + key: ${{ runner.os }}-npm-cache-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-npm-cache- + - name: Run linting + run: npm run lint + + test: + runs-on: ubuntu-latest + needs: npm-install + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'npm' + - name: Cache dependencies + uses: actions/cache/restore@v4 + with: + path: | + .npm/ + node_modules/ + key: ${{ runner.os }}-npm-cache-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-npm-cache- + - name: Run tests + run: npm test + + build: + runs-on: ubuntu-latest + needs: [test, linting] + env: + VERSION_TAG: ${{ github.ref_name }}-${{ github.sha }} + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + - name: Install Ember CLI + run: npm install -g ember-cli + - name: Cache dependencies + uses: actions/cache/restore@v4 + with: + path: | + .npm/ + node_modules/ + key: ${{ runner.os }}-npm-cache-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-npm-cache- + - name: Build production + run: ember build --prod + - name: Upload dist folder as artifact + uses: actions/upload-artifact@v4 + with: + name: prod-assets + path: dist/ + retention-days: 3 + + build-and-deploy: + runs-on: ubuntu-latest + needs: [build] + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + strategy: + matrix: + platform: [linux/amd64, linux/arm64] + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Download dist artifact + uses: actions/download-artifact@v4 + with: + name: prod-assets + path: dist/ + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Log in to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + - name: Build and push Docker image (amd64) + run: | + export PLATFORM=$(echo ${{ matrix.platform }} | cut -d'/' -f2) + docker buildx build \ + --platform ${{ matrix.platform }} \ + --tag ${{ vars.DOCKER_IMAGE_NAME }}:$PLATFORM . \ + --push + + publish-multi-arch: + runs-on: ubuntu-latest + needs: [build-and-deploy] + steps: + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Log in to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + - name: Publish multi-arch image + run: | + docker buildx imagetools create \ + -t ${{ vars.DOCKER_IMAGE_NAME }}:latest \ + ${{ vars.DOCKER_IMAGE_NAME }}:amd64 \ + ${{ vars.DOCKER_IMAGE_NAME }}:arm64