Настройка GitLab CI/CD для Nest.js

В этой статье мы настроим Docker для приложения Nest.js в режиме монорепозитория с поддержкой rest, graphql, cron и microservices.

Данная статья является частью серии статей по Nest.js:

.gitlab-ci.yml

Для начала создадим файл .gitlab-ci.yml в корне проекта:

stages:
  - build
  - deploy
  - release

before_script:
  - docker login -u $CI_REGISTRY_USER -p $CI_JOB_TOKEN $CI_REGISTRY

build:
  stage: build
  script:
    - docker build --tag $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG --target final .
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
    - if: $CI_COMMIT_TAG =~ /^v\d.*/

deploy stage:
  stage: deploy
  environment:
    name: stage-testnet
  tags:
    - shell
  variables:
    KAFKA_CLIENT_ID: ${CI_PROJECT_NAME}-testnet
    TRAEFIK_HOST: nestjs-monorepa-starter.stage-testnet.nimbusplatform.io
    NETWORKS_NAME: nimbus-stage-testnet
    DOCKER_HOST: $DOCKER_HOST_STAGE
  script:
    - docker stack deploy --prune --with-registry-auth -c stack.yaml ${CI_PROJECT_NAME}-testnet
    - sleep 10
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

create-release:
  stage: release
  variables:
    SLACK_WEBHOOK: $SLACK_WEBHOOK_NIMBUS_RELEASES
    SEMANTIC_RELEASE_PACKAGE: $CI_PROJECT_NAME
  script:
    - npx semantic-release
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
      when: manual

deploy prod-testnet:
  stage: deploy
  environment:
    name: prod-testnet
  variables:
    KAFKA_CLIENT_ID: ${CI_PROJECT_NAME}-testnet
    TRAEFIK_HOST: nestjs-monorepa-starter.testnet.nimbusplatform.io
    NETWORKS_NAME: nimbus-prod-testnet
    DOCKER_HOST: $DOCKER_HOST_PRODUCTION
  script:
    - docker stack deploy --prune --with-registry-auth -c stack.yml ${CI_PROJECT_NAME}-testnet
  rules:
    - if: $CI_COMMIT_TAG =~ /^v\d.*/
      when: manual

deploy prod-mainnet:
  stage: deploy
  environment:
    name: prod-mainnet
  variables:
    KAFKA_CLIENT_ID: ${CI_PROJECT_NAME}-mainnet
    TRAEFIK_HOST: nestjs-monorepa-starter.mainnet.nimbusplatform.io
    NETWORKS_NAME: nimbus-prod-mainnet
    DOCKER_HOST: $DOCKER_HOST_PRODUCTION
  script:
    - docker stack deploy --prune --with-registry-auth -c stack.yml ${CI_PROJECT_NAME}-mainnet
  rules:
    - if: $CI_COMMIT_TAG =~ /^v\d.*/
      when: manual

.releaserc

{
  "plugins": [
    ["@semantic-release/commit-analyzer", {
      "preset": "conventionalcommits"
    }],
    ["@semantic-release/release-notes-generator", {
        "preset": "conventionalcommits"
    }],
    ["@semantic-release/changelog", {
      "changelogFile": "CHANGELOG.md"
    }],
    ["@semantic-release/gitlab", {
      "assets": ["CHANGELOG.md"]
    }],
    ["semantic-release-slack-bot", {
      "notifyOnSuccess": false,
      "notifyOnFail": false,
      "branchesConfig": [{
          "pattern": "master",
          "notifyOnSuccess": true,
          "notifyOnFail": true
        }]
    }]
  ]
}