version: 2.1 defaults: &defaults working_directory: ~/outline docker: - image: cimg/node:20.10 - image: cimg/redis:5.0 - image: cimg/postgres:14.2 environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: password POSTGRES_DB: circle_test resource_class: large environment: NODE_ENV: test DATABASE_URL: postgres://postgres:password@localhost:5432/circle_test URL: http://localhost:3000 NODE_OPTIONS: --max-old-space-size=8000 executors: docker-publisher: environment: IMAGE_NAME: outlinewiki/outline BASE_IMAGE_NAME: outlinewiki/outline-base docker: - image: circleci/buildpack-deps:stretch jobs: build: <<: *defaults steps: - checkout - restore_cache: key: dependency-cache-v1-{{ checksum "package.json" }} - run: name: install-deps command: yarn install --frozen-lockfile - save_cache: key: dependency-cache-v1-{{ checksum "package.json" }} paths: - ./node_modules lint: <<: *defaults steps: - checkout - restore_cache: key: dependency-cache-v1-{{ checksum "package.json" }} - run: name: lint command: yarn lint types: <<: *defaults steps: - checkout - restore_cache: key: dependency-cache-v1-{{ checksum "package.json" }} - run: name: typescript command: yarn tsc test-app: <<: *defaults steps: - checkout - restore_cache: key: dependency-cache-v1-{{ checksum "package.json" }} - run: name: test command: yarn test:app test-shared: <<: *defaults steps: - checkout - restore_cache: key: dependency-cache-v1-{{ checksum "package.json" }} - run: name: test command: yarn test:shared test-server: <<: *defaults parallelism: 3 steps: - checkout - restore_cache: key: dependency-cache-v1-{{ checksum "package.json" }} - run: name: migrate command: ./node_modules/.bin/sequelize db:migrate - run: name: test command: | TESTFILES=$(circleci tests glob "server/**/*.test.ts" | circleci tests split) yarn test --maxWorkers=2 $TESTFILES bundle-size: <<: *defaults environment: NODE_ENV: production steps: - checkout - restore_cache: key: dependency-cache-v1-{{ checksum "package.json" }} - run: name: build-vite command: yarn vite:build - run: name: Send bundle stats to RelativeCI command: npx relative-ci-agent build-image: executor: docker-publisher steps: - checkout - setup_remote_docker: version: 20.10.6 - run: name: Install Docker buildx command: | mkdir -p ~/.docker/cli-plugins url="https://github.com/docker/buildx/releases/download/v0.8.0/buildx-v0.8.0.linux-amd64" curl -sSL -o ~/.docker/cli-plugins/docker-buildx $url chmod a+x ~/.docker/cli-plugins/docker-buildx - run: name: Enable Docker buildx command: export DOCKER_CLI_EXPERIMENTAL=enabled - run: name: Initialize Docker buildx command: | docker buildx install docker context create docker-multiarch docker run --rm --privileged multiarch/qemu-user-static --reset -p yes docker buildx create --name docker-multiarch --platform linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x docker-multiarch docker buildx inspect --builder docker-multiarch --bootstrap docker buildx use docker-multiarch - run: name: Build base image command: docker build -f Dockerfile.base -t $BASE_IMAGE_NAME:latest --load . - run: name: Login to Docker Hub command: echo "$DOCKERHUB_PASS" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin - run: name: Publish base Docker Image to Docker Hub command: docker push $BASE_IMAGE_NAME:latest - run: name: Build and push Docker image command: | if [[ "$CIRCLE_TAG" == *"-"* ]]; then docker buildx build -t $IMAGE_NAME:${CIRCLE_TAG/v/''} --platform linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x --push . else docker buildx build -t $IMAGE_NAME:latest -t $IMAGE_NAME:${CIRCLE_TAG/v/''} --platform linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x --push . fi workflows: version: 2 all: jobs: - build - lint: requires: - build - test-server: requires: - build - test-shared: requires: - build - test-app: requires: - build - types: requires: - build - bundle-size: requires: - build - types build-docker: jobs: - build-image: filters: tags: only: /^v.*/ branches: ignore: /.*/