HashiCorp ΠΏΠΎΠΊΠ°Π·Π° Π½ΠΎΠ² ΠΏΡΠΎΠ΅ΠΊΡ
Π ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ Ρ ΡΠΎΡΠΌΠ°ΡΠ° ΡΠΈ, HashiCorp ΠΏΡΡΠ½Π° Waypoint ΠΊΠ°ΡΠΎ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ ΠΈ ΠΈΠ΄Π²Π° Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠΈ. ΠΠΈΠ²ΠΎΡΠΎ Π½Π° ΠΎΡΠΊΠ΅ΡΡΡΠ°ΡΠΎΡΠ° Π·Π°Π²ΠΈΡΠΈ ΠΎΡ Π²Π°Ρ, Waypoint ΠΈΠ΄Π²Π° ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌ ΡΠ°ΠΉΠ», ΠΊΠΎΠΉΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π½Π° Π²Π°ΡΠΈΡ Π»Π°ΠΏΡΠΎΠΏ ΠΈΠ»ΠΈ ΠΎΡ ΠΈΠ·Π±ΡΠ°Π½ΠΈΡ ΠΎΡ Π²Π°Ρ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π·Π° ΠΎΡΠΊΠ΅ΡΡΡΠ°ΡΠΈΡ Π½Π° CI/CD. Π¦Π΅Π»ΡΠ° Π·Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΡΡΠΎ Π·Π°Π²ΠΈΡΠΈ ΠΎΡ Π²Π°Ρ, ΡΡΠΉ ΠΊΠ°ΡΠΎ Waypoint ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° Kubernetes, Docker, Google Cloud Run, AWS ECS ΠΈ Π΄Ρ.
Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ ΠΏΡΠΎΡΠ΅ΡΠΎΡ
ΡΡΡΠ°Ρ
ΠΎΡΠ½ΠΎΡΠΎ
Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ ΠΊΠ»ΠΎΠ½ΠΈΡΠ°ΠΌΠ΅ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ, Π½Π΅ΠΊΠ° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΠΏΠΎΠΊΠ°Π·Π²Π° Π΅Π΄Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°:
ΠΠ°ΠΊΡΠΎ ΠΌΠΎΠΆΠ΅ Π±ΠΈ ΡΡΠ΅ Π·Π°Π±Π΅Π»ΡΠ·Π°Π»ΠΈ, Π² ΡΠΎΠ·ΠΈ ΠΏΡΠΎΠ΅ΠΊΡ Π½ΡΠΌΠ° Dockerfile. Π’Π΅ Π½Π΅ ΡΠ° Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ°, Π·Π°ΡΠΎΡΠΎ Π²ΡΡΡΠ½ΠΎΡΡ Π½Π΅ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ΠΌ ΠΎΡ ΡΡΡ
, ΡΡΠΉ ΠΊΠ°ΡΠΎ Waypoint ΡΠ΅ ΡΠ΅ ΠΏΠΎΠ³ΡΠΈΠΆΠΈ Π·Π° ΡΡΡ
Π²ΠΌΠ΅ΡΡΠΎ Π½Π°Ρ. ΠΠ΅ΠΊΠ° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΡΠ°ΠΉΠ»Π° ΠΏΠΎ-ΠΎΡΠ±Π»ΠΈΠ·ΠΎ waypoint.hcl
Π·Π° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ:
project = "example-nodejs"
app "example-nodejs" {
labels = {
"service" = "example-nodejs",
"env" = "dev"
}
build {
use "pack" {}
registry {
use "aws-ecr" {
region = "us-east-1"
repository = "waypoint-gitlab"
tag = "latest"
}
}
}
deploy {
use "aws-ecs" {
region = "us-east-1"
memory = "512"
}
}
}
ΠΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ°Π·Π°ΡΠ° Π½Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅, Waypoint ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Cloud Native Buildpacks (
Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π±ΡΠ΄Π΅ ΠΈΠ·Π³ΡΠ°Π΄Π΅Π½ΠΎ, Waypoint Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΡΠ΅ Π³ΠΎ ΠΊΠ°ΡΠΈ Π² Π½Π°ΡΠΈΡ AWS ECR ΡΠ΅Π³ΠΈΡΡΡΡ, ΡΠ°ΠΊΠ° ΡΠ΅ Π΄Π° Π΅ Π³ΠΎΡΠΎΠ²ΠΎ Π·Π° ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½Π΅. Π ΠΊΡΠ°Ρ Π½Π° ΡΠ³Π»ΠΎΠ±ΡΠ²Π°Π½Π΅ΡΠΎ ΡΡΡΠΏΠΊΠ°ΡΠ° Π½Π° Π΄ΠΎΡΡΠ°Π²ΠΊΠ° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°
ΠΡ ΠΌΠΎΡ Π»Π°ΠΏΡΠΎΠΏ Π΅ Π»Π΅ΡΠ½ΠΎ. ΠΠΎΡΡΠ°Π²ΠΈΡ Waypoint, ΠΊΠΎΠΉΡΠΎ Π²Π΅ΡΠ΅ Π΅ ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΠ΅Π½ Π² ΠΌΠΎΡ AWS Π°ΠΊΠ°ΡΠ½Ρ ΠΈ ΡΠΎΠΉ βΠΏΡΠΎΡΡΠΎ ΡΠ°Π±ΠΎΡΠΈβ. ΠΠΎ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ΅ ΡΠ»ΡΡΠ²Π°, Π°ΠΊΠΎ ΠΈΡΠΊΠ°ΠΌ Π΄Π° Π½Π°Π΄Ρ Π²ΡΡΠ»ΡΠΌ ΠΌΠΎΡ Π»Π°ΠΏΡΠΎΠΏ? ΠΠ»ΠΈ ΠΌΠΎΠΆΠ΅ Π±ΠΈ ΠΈΡΠΊΠ°ΠΌ Π΄Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°ΠΌ ΡΠΎΠ²Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ ΠΊΠ°ΡΠΎ ΡΠ°ΡΡ ΠΎΡ ΠΌΠΎΡ ΡΡΠ»ΠΎΡΡΠ΅Π½ CI/CD ΡΡΡΠ±ΠΎΠΏΡΠΎΠ²ΠΎΠ΄, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ ΡΠ΅ΠΊΡΡΠΈΡΠ΅ ΠΌΠΈ ΡΠ΅ΡΡΠΎΠ²Π΅ Π·Π° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ, ΡΠ΅ΡΡΠΎΠ²Π΅ Π·Π° ΡΠΈΠ³ΡΡΠ½ΠΎΡΡ ΠΈ Π΄ΡΡΠ³ΠΈ? Π’ΠΎΠ²Π° Π΅ ΡΠ°ΡΡΡΠ° ΠΎΡ ΠΈΡΡΠΎΡΠΈΡΡΠ°, Π² ΠΊΠΎΡΡΠΎ ΡΠ΅ Π½Π°ΠΌΠ΅ΡΠ²Π° GitLab CI/CD!
NB ΠΠΊΠΎ ΠΏΡΠΎΡΡΠΎ ΠΏΠ»Π°Π½ΠΈΡΠ°ΡΠ΅ Π΄Π° Π²Π½Π΅Π΄ΡΠΈΡΠ΅ CI / CD ΠΈΠ»ΠΈ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅ Π΄Π° ΠΏΡΠΈΠ»Π°Π³Π°ΡΠ΅ Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠΈΡΠ΅ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΡΡΡΠ±ΠΎΠΏΡΠΎΠ²ΠΎΠ΄ΠΈ, ΠΎΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π½ΠΎΠ²ΠΈΡ ΠΊΡΡΡ Slurm.
βCI/CD Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ° Π½Π° Gitlab CIβ . ΠΠ΅ΡΠ΅ Π΅ Π½Π°Π»ΠΈΡΠ΅Π½ Π½Π° ΡΠ΅Π½Π° Π·Π° ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½Π° ΠΏΠΎΡΡΡΠΊΠ°.
Π’ΠΎΡΠΊΠ° Π² GitLab CI/CD
ΠΠ° Π΄Π° ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π° Π² GitLab CI/CD, Π½Π΅ΠΊΠ° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊΠ²ΠΎ Π½ΠΈ ΡΡΡΠ±Π²Π° Π² Π½Π°ΡΠΈΡ ΡΠ°ΠΉΠ» .gitlab-ci.yml
:
- ΠΠ° ΠΏΡΡΠ²ΠΎ ΠΌΡΡΡΠΎ, ΠΈΠΌΠ°ΡΠ΅ Π½ΡΠΆΠ΄Π° ΠΎΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅ΡΠΎ Π΄Π° ΡΠ°Π±ΠΎΡΠΈ Π²ΡΡΡΠ΅ Π² Π½Π΅Π³ΠΎ. Waypoint ΡΠ°Π±ΠΎΡΠΈ Π½Π° Π²ΡΡΠΊΠ° Linux Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΡ, Π½ΡΠΆΠ΄Π°Π΅ ΡΠ΅ ΡΠ°ΠΌΠΎ ΠΎΡ Docker, ΡΠ°ΠΊΠ° ΡΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠ°Π±ΠΎΡΠΈΠΌ Ρ ΠΎΠ±ΡΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Docker.
- Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ Waypoint Π² ΡΠΎΠ²Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅. Π Π±ΡΠ΄Π΅ΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡΠ±ΠΈΡΠ°ΠΌΠ΅
ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΌΠ΅ΡΠ° ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΠ·ΠΈΡΠ°ΠΉΡΠ΅ ΡΠΎΠ·ΠΈ ΠΏΡΠΎΡΠ΅Ρ Π·Π° ΡΠ΅Π±Π΅ ΡΠΈ. - ΠΠ°ΠΊΡΠ°Ρ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ Π·Π° Waypoint
ΠΠΎ-Π³ΠΎΡΠ΅ Π΅ Π²ΡΠΈΡΠΊΠΎ, ΠΎΡ ΠΊΠΎΠ΅ΡΠΎ Π½Π°ΡΠΈΡΡ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ ΡΠ΅ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅, Π·Π° Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΠΈ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ΡΠ΅, Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° ΠΈΠ·Π²ΡΡΡΠ²Π°Π½Π΅ Π½Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ΡΠΎ, Π½ΠΎ Π·Π° Π΄Π° Π²Π½Π΅Π΄ΡΠΈΠΌ Π² AWS, ΠΈΠΌΠ°ΠΌΠ΅ Π½ΡΠΆΠ΄Π° ΠΎΡ ΠΎΡΠ΅ Π½Π΅ΡΠΎ: ΡΡΡΠ±Π²Π° Π΄Π° Π²Π»Π΅Π·Π΅ΠΌ Π² Π½Π°ΡΠΈΡ Π°ΠΊΠ°ΡΠ½Ρ Π² AWS. Π ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠΎΡΠΊΠ°ΡΠ°
ΠΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΎΠΏΡΠΈΠΈ Π·Π° GitLab CICD ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΡΠ²Π°Π½Π΅ Π½Π° AWS. ΠΡΡΠ²ΠΈΡΡ Π²Π°ΡΠΈΠ°Π½Ρ Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π²Π³ΡΠ°Π΄Π΅Π½ΠΈΡ AWS_ACCESS_KEY_ID
ΠΈ AWS_SECRET_ACCESS_KEY
.
ΠΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π° Π·Π°Π΅Π΄Π½ΠΎ
Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΡΠ²Π°Π½Π΅ΡΠΎ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ! ΠΠ°ΡΠΈΡΡ ΡΠΈΠ½Π°Π» .gitlab-ci.yml
ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°ΠΊΠ°:
waypoint:
image: docker:latest
stage: build
services:
- docker:dind
# Define environment variables, e.g. `WAYPOINT_VERSION: '0.1.1'`
variables:
WAYPOINT_VERSION: ''
WAYPOINT_SERVER_ADDR: ''
WAYPOINT_SERVER_TOKEN: ''
WAYPOINT_SERVER_TLS: '1'
WAYPOINT_SERVER_TLS_SKIP_VERIFY: '1'
script:
- wget -q -O /tmp/waypoint.zip https://releases.hashicorp.com/waypoint/${WAYPOINT_VERSION}/waypoint_${WAYPOINT_VERSION}_linux_amd64.zip
- unzip -d /usr/local/bin /tmp/waypoint.zip
- rm -rf /tmp/waypoint*
- waypoint init
- waypoint build
- waypoint deploy
- waypoint release
ΠΠΈΠΆΠ΄Π°ΡΠ΅, ΡΠ΅ Π·Π°ΠΏΠΎΡΠ²Π°ΠΌΠ΅ Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ docker:latest
ΠΈ Π·Π°Π΄Π°ΠΉΡΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° ΡΡΠ΅Π΄Π°ΡΠ°, ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½ΠΈ ΠΎΡ Waypoint. Π Π³Π»Π°Π²Π° script
ΠΈΠ·ΡΠ΅Π³Π»ΡΠΌΠ΅ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌ ΡΠ°ΠΉΠ» Π½Π° Waypoint ΠΈ Π³ΠΎ ΠΏΠΎΡΡΠ°Π²ΡΠΌΠ΅ /usr/local/bin
. Π’ΡΠΉ ΠΊΠ°ΡΠΎ Π½Π°ΡΠΈΡΡ Π±Π΅Π³Π°Ρ Π²Π΅ΡΠ΅ Π΅ ΠΎΡΠΎΡΠΈΠ·ΠΈΡΠ°Π½ Π² AWS, Π½ΠΈΠ΅ ΠΏΡΠΎΡΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ waypoint init
, build
, deploy
ΠΈ release
.
Π Π΅Π·ΡΠ»ΡΠ°ΡΡΡ ΠΎΡ Π·Π°Π΄Π°ΡΠ°ΡΠ° Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ ΡΠ΅ Π½ΠΈ ΠΏΠΎΠΊΠ°ΠΆΠ΅ ΠΊΡΠ°ΠΉΠ½Π°ΡΠ° ΡΠΎΡΠΊΠ°, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠΌΠ΅ ΠΏΡΡΠ½Π°Π»ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ:
ΠΡΡΠ½Π° ΡΠΎΡΠΊΠ° Π΅Π΄Π½Π° ΠΎΡ
Π‘ΡΠ²ΠΌΠ΅ΡΡΠ½ΠΈΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ, ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ΅Π½ΠΈ ΠΎΡ HashiCorp ΠΈ GitLab, ΠΏΠΎΠΌΠ°Π³Π°Ρ Π½Π° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΡΡ Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠΈΡ Π½Π°ΡΠΈΠ½ Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΊΠ°ΡΠΎ ΠΎΡΠΈΠ³ΡΡΡΠ²Π°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π²Π΅ΡΠΈΠ³Π°ΡΠ° Π·Π° Π΄ΠΎΡΡΠ°Π²ΠΊΠΈ ΠΈ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°ΡΠ°. Waypoint Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΎΡΠ΅ Π΅Π΄Π½Π° ΡΡΡΠΏΠΊΠ° Π² ΠΏΡΠ°Π²ΠΈΠ»Π½Π°ΡΠ° ΠΏΠΎΡΠΎΠΊΠ° ΠΈ ΠΎΡΠ°ΠΊΠ²Π°ΠΌΠ΅ Ρ Π½Π΅ΡΡΡΠΏΠ΅Π½ΠΈΠ΅ ΠΏΠΎ-Π½Π°ΡΠ°ΡΡΡΠ½ΠΎΡΠΎ ΡΠ°Π·Π²ΠΈΡΠΈΠ΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΡΡΠΈΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ Π·Π° Waypoint
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈΡΠ΅ Π½Π° CI / CD, Π΄Π° ΠΎΠ²Π»Π°Π΄Π΅Π΅ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ ΡΡΠ½ΠΊΠΎΡΡΠΈ Π½Π° ΡΠ°Π±ΠΎΡΠ° Ρ Gitlab CI ΠΈ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅ Π΄Π° ΠΏΡΠΈΠ»Π°Π³Π°ΡΠ΅ Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠΈΡΠ΅ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ, ΠΊΠ°ΡΠΎ Π·Π°Π²ΡΡΡΠΈΡΠ΅ Π²ΠΈΠ΄Π΅ΠΎ ΠΊΡΡΡΠ°
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com