ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅: Π·Π°ΡΠ΅ΠΌ Flask-ΠΏΡΠΎΠ΅ΠΊΡΡ CI/CD?
Flask β ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠΉ Python-ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π§ΡΠΎΠ±Ρ Π²Π°ΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π±ΡΠ»ΠΈ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΡΠΌΠΈ, Π±ΡΡΡΡΠΎ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ»ΠΈΡΡ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ ΡΠ°Π·Π²ΡΡΡΡΠ²Π°Π»ΠΈΡΡ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° Π³ΡΠ°ΠΌΠΎΡΠ½Π°Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° CI/CD (Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½Π°Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ ΠΈ Π΄ΠΎΡΡΠ°Π²ΠΊΠ°). Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠΏΠΎΡΠΎΠ±Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² Π΄Π»Ρ Flask-ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ GitLab CI, GitHub Actions ΠΈ Jenkins. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΡΡΠΊΠΎΡΠΈΡΡ ΡΠ΅Π»ΠΈΠ·Ρ, ΡΠΏΡΠΎΡΡΠΈΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ.
ΠΠΎΡΠ΅ΠΌΡ Π±ΠΈΠ·Π½Π΅ΡΡ Π²Π°ΠΆΠ½ΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π΄Π΅ΠΏΠ»ΠΎΠΉ Flask?
- Π‘ΠΎΠΊΡΠ°ΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²ΡΠ²ΠΎΠ΄Π° Π½ΠΎΠ²ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ.
- ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄Π»Ρ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΡΡΠΈ.
- Π‘Π½ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π²Π»ΠΈΡΠ½ΠΈΡ ΡΠ΅Π»ΠΎΠ²Π΅ΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠ°ΠΊΡΠΎΡΠ° Π½Π° ΡΠ±ΠΎΡΠΊΡ ΠΈ ΡΠ°Π·Π²ΡΡΡΡΠ²Π°Π½ΠΈΠ΅.
- ΠΡΠ³ΠΊΠΎΠ΅ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΉ.
GitLab CI Π΄Π»Ρ Flask: Π±ΡΡΡΡΠΎ ΠΈ Π³ΠΈΠ±ΠΊΠΎ
GitLab CI ΠΈΠ΄Π΅Π°Π»ΡΠ½ΠΎ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈΡ Π΄Π»Ρ ΠΊΠΎΠΌΠ°Π½Π΄, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΡ
ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ GitLab. ΠΡΠ½ΠΎΠ²ΠΎΠΉ ΡΠ»ΡΠΆΠΈΡ ΡΠ°ΠΉΠ» .gitlab-ci.yml
Π² ΠΊΠΎΡΠ½Π΅ ΠΏΡΠΎΠ΅ΠΊΡΠ°. Π Π½ΡΠΌ ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΡΡ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Ρ: ΡΡΠ°ΠΏΡ ΡΠ±ΠΎΡΠΊΠΈ, ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ Π΄Π΅ΠΏΠ»ΠΎΡ.
ΠΡΠΈΠΌΠ΅Ρ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π°:
stages:
- test
- deploy
test:
stage: test
image: python:3.10
script:
- pip install -r requirements.txt
- pytest
deploy:
stage: deploy
script:
- ./deploy.sh
only:
- master
ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° GitLab CI:
- ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠ΅ΠΌ ΠΈ issue-ΡΡΠ΅ΠΊΠ΅ΡΠΎΠΌ.
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Docker ΠΈ Kubernetes.
- ΠΠΈΠ±ΠΊΠ°Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ.
GitHub Actions Π΄Π»Ρ Flask: Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ Π² ΠΎΠ±Π»Π°ΠΊΠ΅
GitHub Actions β ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ Π²ΡΠ΅Ρ
ΡΡΠ°ΠΏΠΎΠ² CI/CD Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π² GitHub. ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΡΠ΅ΡΠ΅Π· YAML-ΡΠ°ΠΉΠ»Ρ Π² ΠΏΠ°ΠΏΠΊΠ΅ .github/workflows
.
ΠΡΠΈΠΌΠ΅Ρ workflow:
name: CI
on:
push:
branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.10'
- run: pip install -r requirements.txt
- run: pytest
ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° GitHub Actions:
- ΠΠ΅ΡΠΏΠ»Π°ΡΠ½ΡΠ΅ ΠΌΠΈΠ½ΡΡΡ Π΄Π»Ρ ΠΏΡΠ±Π»ΠΈΡΠ½ΡΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠ΅Π².
- ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ Ρ ΠΎΠ±Π»Π°ΡΠ½ΡΠΌΠΈ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌΠΈ.
- ΠΠΎΠ³Π°ΡΠ°Ρ ΡΠΊΠΎΡΠΈΡΡΠ΅ΠΌΠ° Π³ΠΎΡΠΎΠ²ΡΡ ActionβΠΎΠ².
Jenkins Π΄Π»Ρ Flask: ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΠ΅ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Ρ Π»ΡΠ±ΠΎΠΉ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ
Jenkins β ΠΏΡΠΈΠ·Π½Π°Π½Π½ΡΠΉ Π»ΠΈΠ΄Π΅Ρ Π² ΠΎΠ±Π»Π°ΡΡΠΈ CI/CD Ρ ΠΎΡΠΊΡΡΡΡΠΌ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΌ ΠΊΠΎΠ΄ΠΎΠΌ. ΠΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ ΡΠ»ΠΎΠΆΠ½ΡΡ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ², ΡΡΠ΅Π±ΡΡΡΠΈΡ ΠΎΡΠΎΠ±ΡΡ ΡΡΠ΅Π½Π°ΡΠΈΠ΅Π² ΡΠ±ΠΎΡΠΊΠΈ ΠΈ Π΄Π΅ΠΏΠ»ΠΎΡ.
ΠΡΠ°ΡΠΊΠ°Ρ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ ΠΏΠΎ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ:
- Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ Jenkins Π½Π° ΡΠ΅ΡΠ²Π΅Ρ ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΎΠ±Π»Π°ΡΠ½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ.
- Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ Jenkins Pipeline (Jenkinsfile) Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ Flask-ΠΏΡΠΎΠ΅ΠΊΡΠ°.
- ΠΠ°ΡΡΡΠΎΠΉΡΠ΅ ΡΡΠ°ΠΏΡ: ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ, Π·Π°ΠΏΡΡΠΊ ΡΠ΅ΡΡΠΎΠ², Π΄Π΅ΠΏΠ»ΠΎΠΉ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΡΠΈΠΌΠ΅Ρ Jenkinsfile:
pipeline {
agent any
stages {
stage('Install') {
steps {
sh 'pip install -r requirements.txt'
}
}
stage('Test') {
steps {
sh 'pytest'
}
}
stage('Deploy') {
steps {
sh './deploy.sh'
}
}
}
}
ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° Jenkins:
- ΠΠΈΠ±ΠΊΠΎΡΡΡ Π² ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡΡ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ .
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΎΠ³ΡΠΎΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ².
- ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ»ΠΎΠΆΠ½ΡΡ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ΠΎΠ².
Π‘ΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ²: ΡΡΠΎ Π²ΡΠ±ΡΠ°ΡΡ Π΄Π»Ρ Π²Π°ΡΠ΅Π³ΠΎ Flask-ΠΏΡΠΎΠ΅ΠΊΡΠ°?
ΠΠ»Π°ΡΡΠΎΡΠΌΠ° | Π£ΡΠΎΠ²Π΅Π½Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ | Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ | Π‘ΡΠΎΠΈΠΌΠΎΡΡΡ |
---|---|---|---|
GitLab CI | ΠΡΡΠΎΠΊΠΈΠΉ | Π‘ΡΠ΅Π΄Π½ΡΡ | ΠΠ΅ΡΠΏΠ»Π°ΡΠ½ΠΎ Π΄Π»Ρ ΠΏΡΠ±Π»ΠΈΡΠ½ΡΡ /ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΠΎ Π΄Π»Ρ ΠΏΡΠΈΠ²Π°ΡΠ½ΡΡ |
GitHub Actions | ΠΡΡΠΎΠΊΠΈΠΉ | ΠΠΈΠ·ΠΊΠ°Ρ | ΠΠ΅ΡΠΏΠ»Π°ΡΠ½ΠΎ Π΄Π»Ρ ΠΏΡΠ±Π»ΠΈΡΠ½ΡΡ /Π»ΠΈΠΌΠΈΡΡ Π΄Π»Ρ ΠΏΡΠΈΠ²Π°ΡΠ½ΡΡ |
Jenkins | ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ | ΠΡΡΠΎΠΊΠ°Ρ | ΠΠ΅ΡΠΏΠ»Π°ΡΠ½ΠΎ, Π½ΠΎ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΠ΅ΡΠ²Π΅Ρ |
ΠΡΠ±ΠΎΡ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΡ, ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΊ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ, ΠΌΠ°ΡΡΡΠ°Π±Π° ΠΈ Π±ΡΠ΄ΠΆΠ΅ΡΠ° ΠΏΡΠΎΠ΅ΠΊΡΠ°.
Π Π°ΡΡΠΈΡΠ΅Π½Π½ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ: ΡΠ΅ΡΡΡ, Docker, Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ
- ΠΠΎΠ±Π°Π²ΡΡΠ΅ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ· ΠΊΠΎΠ΄Π° (flake8, mypy) Π² ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Ρ.
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Docker-ΠΎΠ±ΡΠ°Π·Ρ Π΄Π»Ρ ΠΏΠΎΠ²ΡΠΎΡΡΠ΅ΠΌΠΎΡΡΠΈ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ.
- ΠΠ½ΡΠ΅Π³ΡΠΈΡΡΠΉΡΠ΅ Π΄Π΅ΠΏΠ»ΠΎΠΉ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΡ, Π² ΠΎΠ±Π»Π°ΠΊΠ° ΠΈΠ»ΠΈ Kubernetes.
- ΠΠ°ΡΡΡΠΎΠΉΡΠ΅ ΡΠ΅ΠΊΡΠ΅ΡΡ ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ Π΄Π»Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠΎΠΊΠ΅Π½Π°ΠΌΠΈ ΠΈ ΠΊΠ»ΡΡΠ°ΠΌΠΈ.
Π’ΠΈΠΏΠΎΠ²ΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΏΡΠΈ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎΠΉ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ CI/CD
- ΠΡΡΡΡΡΡΠ²ΠΈΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠ΅ΡΡΠΎΠ².
- ΠΠ΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ΅ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΡΠ°ΠΏΠΎΠ² ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π°.
- ΠΠ΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½Π°Ρ Π·Π°ΡΠΈΡΠ° ΡΠ΅ΠΊΡΠ΅ΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ .
- ΠΠ΅ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Docker-ΠΎΠ±ΡΠ°Π·Ρ, ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°ΡΡΠΈΠ΅ Π²ΡΠ΅ΠΌΡ ΡΠ±ΠΎΡΠΊΠΈ.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅: ΠΊΠΎΠΌΡ Π΄ΠΎΠ²Π΅ΡΠΈΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΡ CI/CD Π΄Π»Ρ Flask?
ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ CI/CD β Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠΉ ΡΠ°Π³ Π΄Π»Ρ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Flask-ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ². ΠΡΠ±ΠΎΡ ΠΌΠ΅ΠΆΠ΄Ρ GitLab CI, GitHub Actions ΠΈ Jenkins Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ Π²Π°ΡΠΈΡ Π·Π°Π΄Π°Ρ. ΠΡΠ°ΠΌΠΎΡΠ½Π°Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΡΠΊΠΎΡΠΈΡΡ ΡΠ°Π·Π²ΠΈΡΠΈΠ΅ ΠΏΡΠΎΠ΄ΡΠΊΡΠ° ΠΈ ΠΏΠΎΠ²ΡΡΠΈΡΡ Π΅Π³ΠΎ ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ.
Π₯ΠΎΡΠΈΡΠ΅ ΡΠ·Π½Π°ΡΡ, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΉ CI/CD Π΄Π»Ρ Π²Π°ΡΠ΅Π³ΠΎ Flask-ΠΏΡΠΎΠ΅ΠΊΡΠ°? ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΌΠΎΡΡ β ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ Π·Π΄Π΅ΡΡ!
Raman Sapezhka
CEO Plantago/CTO