ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² CI/CD Π΄Π»Ρ Symfony-ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ²
Π‘ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π²Π΅Π±-ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΡΡΠ΅Π±ΡΠ΅Ρ Π²ΡΡΠΎΠΊΠΎΠΉ ΡΠΊΠΎΡΠΎΡΡΠΈ ΠΏΠΎΡΡΠ°Π²ΠΊΠΈ ΠΏΡΠΎΠ΄ΡΠΊΡΠ°, ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΡΡΠΈ ΡΠ΅Π»ΠΈΠ·ΠΎΠ² ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΡΡΡΠ½ΠΎΠ³ΠΎ ΡΡΡΠ΄Π°. ΠΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΡΡΠΎΠΌΡ Continuous Integration ΠΈ Continuous Deployment (CI/CD) ΡΡΠ°Π½ΠΎΠ²ΡΡΡΡ Π½Π΅ΠΎΡΡΠ΅ΠΌΠ»Π΅ΠΌΠΎΠΉ ΡΠ°ΡΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Π½Π° Symfony. ΠΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΉ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄, ΡΠΎΠ±ΠΈΡΠ°ΡΡ Π°ΡΡΠ΅ΡΠ°ΠΊΡΡ, Π΄Π΅ΠΏΠ»ΠΎΠΈΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ Π±ΡΡΡΡΠΎ ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ. Π‘Π΅Π³ΠΎΠ΄Π½Ρ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Ρ ΠΊ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ CI/CD ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ΠΎΠ² Π΄Π»Ρ Symfony-ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² Π½Π° Π±Π°Π·Π΅ GitLab CI, Jenkins ΠΈ GitHub Actions.
ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ CI/CD Π΄Π»Ρ Symfony
- Π‘Π½ΠΈΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΎΡΠΈΠ±ΠΎΠΊ. ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ Π²ΡΠ΅Ρ ΡΡΠ°ΠΏΠΎΠ² ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ½ΠΈΠ·ΠΈΡΡ ΡΠ΅Π»ΠΎΠ²Π΅ΡΠ΅ΡΠΊΠΈΠΉ ΡΠ°ΠΊΡΠΎΡ ΠΈ ΠΏΠΎΠ²ΡΡΠΈΡΡ ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ ΠΏΡΠΎΠ΄ΡΠΊΡΠ°.
- ΠΡΡΡΡΠ°Ρ ΠΎΠ±ΡΠ°ΡΠ½Π°Ρ ΡΠ²ΡΠ·Ρ. ΠΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°Ρ Π² ΠΊΠΎΠ΄Π΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠ΅ΡΡΠΎΠ².
- ΠΠΎΠ²ΡΡΠ΅Π½ΠΈΠ΅ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΡΡΠΈ ΡΠ΅Π»ΠΈΠ·ΠΎΠ². Π Π΅Π³ΡΠ»ΡΡΠ½ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠ°Π·Π²ΡΡΡΡΠ²Π°Π½ΠΈΠ΅ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΡΡΡ ΡΠΈΡΠΊΠΈ ΠΏΡΠΈ Π²ΡΠΊΠ»Π°Π΄ΠΊΠ΅ Π½ΠΎΠ²ΡΡ Π²Π΅ΡΡΠΈΠΉ.
- ΠΠΊΠΎΠ½ΠΎΠΌΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΡΠΎΠΊΡΡΠΈΡΡΡΡΡΡ Π½Π° ΡΠ΅ΡΠ΅Π½ΠΈΠΈ Π±ΠΈΠ·Π½Π΅Ρ-Π·Π°Π΄Π°Ρ, Π° Π½Π΅ Π½Π° ΡΡΡΠΈΠ½Π½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΡ ΠΏΠΎ Π΄Π΅ΠΏΠ»ΠΎΡ.
GitLab CI Π΄Π»Ρ Symfony: Π±ΡΡΡΡΠΎ ΠΈ ΡΠ΄ΠΎΠ±Π½ΠΎ
GitLab CI ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ CI/CD, Π³Π»ΡΠ±ΠΎΠΊΠΎ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Ρ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡΠΌΠΈ. ΠΠ»Ρ Symfony-ΠΏΡΠΎΠ΅ΠΊΡΠ° Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² ΠΊΠΎΡΠ΅Π½Ρ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ ΡΠ°ΠΉΠ» .gitlab-ci.yml
Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ ΡΡΠ°ΠΏΠΎΠ² ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π°. ΠΡΠΈΠΌΠ΅Ρ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π°:
stages:
- install
- test
- deploy
install:
stage: install
image: php:8.2
script:
- apt-get update && apt-get install -y git unzip
- composer install --no-interaction --prefer-dist
test:
stage: test
image: php:8.2
script:
- php bin/phpunit
deploy:
stage: deploy
image: alpine:latest
script:
- echo "Deploy to production server"
only:
- main
ΠΡΠΎΡ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ, Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΡΠ΅ΡΡΡ ΠΈ Π΄Π΅ΠΏΠ»ΠΎΠΈΡΡ ΠΏΡΠΎΠ΅ΠΊΡ ΠΏΠΎΡΠ»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΌΠΈΡΠ° Π² Π²Π΅ΡΠΊΡ main
. GitLab CI ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠ΅ΠΊΡΠ΅ΡΡ, ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ, Π°ΡΡΠ΅ΡΠ°ΠΊΡΡ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π΄Π»Ρ ΠΌΠ°ΡΡΡΠ°Π±Π½ΡΡ
ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ².
Jenkins: Π³ΠΈΠ±ΠΊΠ°Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ΠΎΠ²
Jenkins β ΠΏΡΠΈΠ·Π½Π°Π½Π½ΡΠΉ Π»ΠΈΠ΄Π΅Ρ ΡΡΠ΅Π΄ΠΈ CI/CD-ΡΠΈΡΡΠ΅ΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠ»ΠΈΡΠ½ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΡ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ΠΎΠ², Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ Π΄Π»Ρ Symfony. ΠΠ»Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π½Π°ΡΡΡΠΎΠΈΡΡ Jenkinsfile Π² ΠΊΠΎΡΠ½Π΅ ΠΏΡΠΎΠ΅ΠΊΡΠ°:
pipeline {
agent any
stages {
stage('Install') {
steps {
sh 'composer install --no-interaction --prefer-dist'
}
}
stage('Test') {
steps {
sh 'php bin/phpunit'
}
}
stage('Deploy') {
when {
branch 'main'
}
steps {
sh './deploy.sh'
}
}
}
}
Jenkins ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½Ρ, ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Docker, ΡΡΡΠΎΠΈΡΡ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Ρ Ρ ΡΡΠ»ΠΎΠ²Π½ΡΠΌΠΈ ΡΡΠ°ΠΏΠ°ΠΌΠΈ, ΡΡΠΈΠ³Π³Π΅ΡΠ°ΠΌΠΈ ΠΈ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡΠΌΠΈ. Π’Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ ΡΠΈΡΡΠ΅ΠΌΠ°ΠΌΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π²Π΅ΡΡΠΈΠΉ, Π°ΡΡΠ΅ΡΠ°ΠΊΡΠ°ΠΌΠΈ ΠΈ ΠΎΠ±Π»Π°ΡΠ½ΡΠΌΠΈ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌΠΈ.
GitHub Actions: CI/CD ΠΏΡΡΠΌΠΎ Π² Π²Π°ΡΠ΅ΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ
GitHub Actions β ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ° Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΏΡΡΠΌΠΎ ΠΈΠ· ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Π½Π° GitHub. ΠΠ»Ρ Symfony-ΠΏΡΠΎΠ΅ΠΊΡΠ° ΡΠΎΠ·Π΄Π°ΡΠΌ ΡΠ°ΠΉΠ» .github/workflows/ci.yml
:
name: CI
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.2'
- name: Install dependencies
run: composer install --no-interaction --prefer-dist
- name: Run tests
run: php bin/phpunit
- name: Deploy
if: github.ref == 'refs/heads/main'
run: ./deploy.sh
ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° GitHub Actions β Π³Π»ΡΠ±ΠΎΠΊΠ°Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ ΡΠΊΠΎΡΠΈΡΡΠ΅ΠΌΠΎΠΉ GitHub, Π½Π°Π»ΠΈΡΠΈΠ΅ Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° Π³ΠΎΡΠΎΠ²ΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΠ΅ΠΊΡΠ΅ΡΠΎΠ² ΠΈ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅ΠΌΠΎΡΡΡ. ΠΠ»Ρ Symfony-ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² Π»Π΅Π³ΠΊΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΊΠΎΠ΄Π°, Π»ΠΈΠ½ΡΠΈΠ½Π³, Π΄Π΅ΠΏΠ»ΠΎΠΉ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΡ ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ Docker-ΠΎΠ±ΡΠ°Π·ΠΎΠ².
ΠΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ CI/CD Π΄Π»Ρ Symfony
- ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Composer. ΠΠ°ΠΆΠ½ΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΊΡΡΠΈΡΠΎΠ²Π°ΡΡ
vendor
Π΄Π»Ρ ΡΡΠΊΠΎΡΠ΅Π½ΠΈΡ ΡΠ±ΠΎΡΠΊΠΈ. - ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΠ΅ΠΊΡΠ΅ΡΡ Π΄Π»Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΊΠ»ΡΡΠ΅ΠΉ ΠΈ ΠΏΠ°ΡΠΎΠ»Π΅ΠΉ.
- ΠΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π°ΡΡΠ΅ΡΠ°ΠΊΡΡ. ΠΠΊΠΎΠ½ΠΎΠΌΡΡΠ΅ Π²ΡΠ΅ΠΌΡ Π½Π° ΡΠ±ΠΎΡΠΊΠ΅, ΠΊΡΡΠΈΡΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΡΠ΅ΡΡΠΎΠ².
- ΠΠΈΠ³ΡΠ°ΡΠΈΠΈ ΠΈ Π΄ΠΎΠΊΠ΅ΡΠΈΠ·Π°ΡΠΈΡ. ΠΠΎΠΆΠ½ΠΎ Π²ΠΊΠ»ΡΡΠΈΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΉ, ΡΠ±ΠΎΡΠΊΡ Docker-ΠΎΠ±ΡΠ°Π·ΠΎΠ² ΠΈ Π΄Π΅ΠΏΠ»ΠΎΠΉ Π² Kubernetes.
Π‘ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Ρ ΠΈ best practices
- Π Π°Π·Π΄Π΅Π»ΡΠΉΡΠ΅ ΡΡΠ°ΠΏΡ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π°: install, test, build, deploy.
- ΠΠΎΠ±Π°Π²Π»ΡΠΉΡΠ΅ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ· ΠΊΠΎΠ΄Π° (PHPStan, Psalm).
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ Π΄Π»Ρ ΡΡΠΊΠΎΡΠ΅Π½ΠΈΡ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π°.
- ΠΡΠΎΠ²Π΅ΡΡΠΉΡΠ΅ ΠΊΠΎΠ΄ Π½Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Ρ ΠΏΠΎΠΌΠΎΡΡΡ SensioLabs Security Checker).
- ΠΠ°ΡΡΡΠ°ΠΈΠ²Π°ΠΉΡΠ΅ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΠΎ ΡΡΠ°ΡΡΡΠ΅ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π° Π² Slack, Telegram ΠΈΠ»ΠΈ ΠΏΠΎΡΡΡ.
- ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΡΠΉΡΠ΅ Π²ΡΠΊΠ»Π°Π΄ΠΊΡ Π½Π° staging ΠΈ production.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° CI/CD ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ΠΎΠ² Π΄Π»Ρ Symfony-ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² Ρ ΠΏΠΎΠΌΠΎΡΡΡ GitLab CI, Jenkins ΠΈΠ»ΠΈ GitHub Actions β ΡΡΠΎ Π³Π°ΡΠ°Π½ΡΠΈΡ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΠΉ, Π±ΡΡΡΡΠΎΠΉ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠΉ Π΄ΠΎΡΡΠ°Π²ΠΊΠΈ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΄ΡΠΊΡΠ°. ΠΠ½Π΅Π΄ΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΏΡΠ°ΠΊΡΠΈΠΊ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡΡ ΡΠ΅ΡΡΡΡΡ, ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΎ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ Π½ΠΎΠ²ΡΠ΅ ΡΠΈΡΠΈ Π½Π° ΡΡΠ½ΠΎΠΊ. Π₯ΠΎΡΠΈΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΡ CI/CD ΠΏΠΎΠ΄ Π²Π°ΡΠΈ Π·Π°Π΄Π°ΡΠΈ? ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΌΠΎΡΡ β ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ Π·Π΄Π΅ΡΡ.
Raman Sapezhka
CEO Plantago/CTO