Настройка GitLab CI/CD для Nest.js
В этой статье мы настроим Docker для приложения Nest.js в режиме монорепозитория с поддержкой rest, graphql, cron и microservices.
Данная статья является частью серии статей по Nest.js:
- Часть 0. Введение
- Часть 1. Настройка приложения на Nest.js с протоколами rest, graphql, console и microservices
- Часть 2. Настройка Docker для Nest.js
- Часть 3. Настройка Docker Swarm
- Часть 4. Настройка Backend Infrastructure
- Часть 5. Настройка GitLab CI/CD для Nest.js
- Часть 6. Настройка GitLab CI/CD для frontend
.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
}]
}]
]
}