diff --git a/.dockerignore b/.dockerignore index 2259d76..b924a5a 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,7 +1,3 @@ -# Ignore everything -**/* - -# Allow files and directories -!*.js -!*.json -!*.ts \ No newline at end of file +config +dist +node_modules \ No newline at end of file diff --git a/.github/workflows/build-and-push-image.yml b/.github/workflows/build-and-push-image.yml index 7513261..bfd1dae 100644 --- a/.github/workflows/build-and-push-image.yml +++ b/.github/workflows/build-and-push-image.yml @@ -1,26 +1,32 @@ -name: Build and push image +name: MultiArchDockerBuild on: push: branches: - master + - develop jobs: - build_and_push_image: - name: Build Docker image and push to registries + build_multi_arch_image: + name: Build multi-arch Docker image. runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 + - name: Set up QEMU + uses: docker/setup-qemu-action@v1 + - name: Set up Docker Buildx id: buildx uses: docker/setup-buildx-action@v1 + with: + install: true - name: Login to DockerHub uses: docker/login-action@v1 with: - username: charlocharlie + username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Login to GitHub Container Registry @@ -30,15 +36,32 @@ jobs: username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Build and push - id: docker_build_push + - name: Build and push master + if: ${{ github.ref == 'refs/heads/master' }} uses: docker/build-push-action@v2 with: + target: deploy push: true tags: | charlocharlie/markov-discord:latest ghcr.io/${{ github.repository }}:latest - ghcr.io/${{ github.repository }}:${{ github.sha }} + platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/arm/v6 + build-args: | + COMMIT_SHA=${{ github.sha }} + cache-from: type=gha,scope=${{ github.workflow }} + cache-to: type=gha,mode=max,scope=${{ github.workflow }} - - name: Image digest - run: echo ${{ steps.docker_build_push.outputs.digest }} \ No newline at end of file + - name: Build and push dev + if: ${{ github.ref == 'refs/heads/develop' }} + uses: docker/build-push-action@v2 + with: + target: deploy + push: true + tags: | + charlocharlie/epicgames-freegames:dev + ghcr.io/claabs/epicgames-freegames-node:dev + platforms: linux/amd64 + build-args: | + COMMIT_SHA=${{ github.sha }} + cache-from: type=gha,scope=${{ github.workflow }} + cache-to: type=gha,mode=max,scope=${{ github.workflow }} diff --git a/Dockerfile b/Dockerfile index f7dcf32..60a46c7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,45 +2,49 @@ # BASE ######## FROM node:16-alpine3.14 as base -WORKDIR /usr/src/app -COPY package*.json ./ -# Install build tools for erlpack, then install prod deps only, then remove build tools -RUN apk add --no-cache make gcc g++ python && \ - npm ci --only=production && \ - apk del make gcc g++ python +WORKDIR /usr/src/app ######## # BUILD ######## FROM base as build -# Copy all *.json, *.js, *.ts -COPY . . -# Prod deps already installed, add dev deps -RUN npm i +COPY package*.json ./ +# Install build tools for erlpack, then install prod deps only +RUN apk add --no-cache make gcc g++ python3 \ + && npm ci --only=production + +# Copy all jsons +COPY package*.json tsconfig.json ./ + +# Add dev deps +RUN npm ci + +# Copy source code +COPY src src RUN npm run build ######## # DEPLOY ######## -FROM node:16-alpine3.14 as deploy -WORKDIR /usr/src/app - -ENV NPM_CONFIG_LOGLEVEL warn +FROM base as deploy # Steal node_modules from base image -COPY --from=base /usr/src/app/node_modules ./node_modules/ +COPY --from=build /usr/src/app/node_modules node_modules # Steal compiled code from build image -COPY --from=build /usr/src/app/dist ./ +COPY --from=build /usr/src/app/dist dist # Copy package.json for version number -COPY package*.json ./ +COPY package*.json ormconfig.js ./ -RUN mkdir config +# RUN mkdir config -# RUN ls -al +ARG COMMIT_SHA="" -CMD [ "pm2-runtime", "start", "ecosystem.config.js" ] \ No newline at end of file +ENV NODE_ENV=production \ + COMMIT_SHA=${COMMIT_SHA} + +CMD [ "node", "/usr/src/app/dist/index.js" ] \ No newline at end of file diff --git a/package.json b/package.json index ce7e3d3..9a1c298 100644 --- a/package.json +++ b/package.json @@ -2,13 +2,14 @@ "name": "markov-discord", "version": "2.0.0", "description": "A conversational Markov chain bot for Discord", - "main": "index.js", + "main": "dist/index.js", "scripts": { "start": "node dist/index.js", "start:ts": "ts-node src/index.ts", "build": "rimraf dist && tsc", "lint": "tsc --noEmit && eslint **/*.ts *.js", - "docker-up": "docker run --rm -e TOKEN=abc123 -it $(docker build -q .)" + "docker:build": "docker build . -t charlocharlie/markov-discord:latest --target deploy", + "docker:run": "docker run --rm -ti -v $(pwd)/config:/usr/src/app/config charlocharlie/markov-discord:latest" }, "repository": "https://github.com/claabs/markov-discord.git", "keywords": [