ΠΠ°Π½Π½Π°Ρ ΡΡΠ°ΡΡΡ Π±ΡΠ΄Π΅Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π° ΠΊΠ°ΠΊ ΡΠ΅ΡΡΠΈΡΠΎΠ²ΡΠΈΠΊΠ°ΠΌ, ΡΠ°ΠΊ ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌ, Π½ΠΎ ΡΠ°ΡΡΡΠΈΡΠ°Π½Π° Π² Π±ΠΎΠ»ΡΡΠ΅ΠΉ ΡΡΠ΅ΠΏΠ΅Π½ΠΈ Π½Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΎΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΠΈΡΡ Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ GitLab CI/CD Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π² ΡΡΠ»ΠΎΠ²ΠΈΡΡ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎΡΡΠΈ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ½ΡΡ ΡΠ΅ΡΡΡΡΠΎΠ² ΠΈ/ΠΈΠ»ΠΈ ΠΎΡΡΡΡΡΡΠ²ΠΈΡ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ ΠΎΡΠΊΠ΅ΡΡΡΠ°ΡΠΈΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ². Π― ΡΠ°ΡΡΠΊΠ°ΠΆΡ, ΠΊΠ°ΠΊ Π½Π°ΡΡΡΠΎΠΈΡΡ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΡΡΠΈΡΡΠ΅ΠΌΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΉ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ docker compose Π½Π° ΠΎΠ΄Π½ΠΎΠΌ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠΌ GitLab shell ΡΠ°Π½Π½Π΅ΡΠ΅ ΠΈ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΠΏΡΠΈ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΉ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌΡΠ΅ ΡΠ΅ΡΠ²ΠΈΡΡ Π΄ΡΡΠ³ Π΄ΡΡΠ³Ρ Π½Π΅ ΠΌΠ΅ΡΠ°Π»ΠΈ.
Π‘ΠΎΠ΄Π΅ΡΠΆΠ°Π½ΠΈΠ΅
ΠΡΠ΅Π΄ΠΏΠΎΡΡΠ»ΠΊΠΈ GitLab Shell Runner ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° docker-compose.yml ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Makefile ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° .gitlab-ci.yml Π Π΅Π·ΡΠ»ΡΡΠ°Ρ
ΠΡΠ΅Π΄ΠΏΠΎΡΡΠ»ΠΊΠΈ
-
Π ΠΌΠΎΠ΅ΠΉ ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ ΡΠ°ΡΡΠ΅Π½ΡΠΊΠΎ ΡΠ»ΡΡΠ°Π»ΠΎΡΡ «Π»Π΅ΡΠΈΡΡ» ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠ΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ . Π Π·Π°ΡΠ°ΡΡΡΡ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΠΈ ΡΠ°ΠΌΠΎΠΉ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ CI pipeline, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠ΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΡΠ΅ΡΠ²ΠΈΡΠ°(ΠΎΠ²) ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡΡΡ Π² dev/stage ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΈ. ΠΡΠΎ Π²ΡΠ·ΡΠ²Π°Π»ΠΎ Π½Π΅ ΠΌΠ°Π»ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌ:
- ΠΠ·-Π·Π° Π΄Π΅ΡΠ΅ΠΊΡΠΎΠ² Π² ΡΠΎΠΌ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΌ ΡΠ΅ΡΠ²ΠΈΡΠ΅ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ΅ΡΡΠΎΠ²ΡΠΉ ΠΊΠΎΠ½ΡΡΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΡΠΏΠΎΡΡΠ΅Π½ Π±ΠΈΡΡΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ. ΠΡΠ²Π°Π»ΠΈ ΡΠ»ΡΡΠ°ΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΎΡΠΏΡΠ°Π²ΠΊΠ° Π·Π°ΠΏΡΠΎΡΠ° Ρ Π±ΠΈΡΡΠΌ JSON-ΡΠΎΡΠΌΠ°ΡΠΎΠΌ Π²Π΅ΡΠ°Π» ΡΠ΅ΡΠ²ΠΈΡ, ΡΡΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΎ ΡΡΠ΅Π½Π΄ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π² Π½Π΅ΡΠ°Π±ΠΎΡΠ΅Π΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅.
- ΠΠ°ΠΌΠ΅Π΄Π»Π΅Π½ΠΈΠ΅ΠΌ ΡΠ°Π±ΠΎΡΡ ΡΠ΅ΡΡΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΡΡΠ° Ρ ΡΠΎΡΡΠΎΠΌ ΡΠ΅ΡΡΠΎΠ²ΡΡ Π΄Π°Π½Π½ΡΡ . ΠΡΠΌΠ°Ρ, ΠΎΠΏΠΈΡΡΠ²Π°ΡΡ ΠΏΡΠΈΠΌΠ΅Ρ Ρ ΠΎΡΠΈΡΡΠΊΠΎΠΉ/ΠΎΡΠΊΠ°ΡΠΎΠΌ ΠΠ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ»Π°. Π ΡΠ²ΠΎΠ΅ΠΉ ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ Ρ Π½Π΅ Π²ΡΡΡΠ΅ΡΠ°Π» ΠΏΡΠΎΠ΅ΠΊΡΠ°, Π³Π΄Π΅ ΡΡΠ° ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΠ»Π° Π±Ρ Π³Π»Π°Π΄ΠΊΠΎ.
- Π ΠΈΡΠΊ Π½Π°ΡΡΡΠΈΡΡ ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡ ΡΠ΅ΡΡΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΡΡΠ° ΠΏΡΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΎΠ±ΡΠΈΡ Π½Π°ΡΡΡΠΎΠ΅ΠΊ ΡΠΈΡΡΠ΅ΠΌΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, user/group/password/application policy.
- Π’Π΅ΡΡΠΎΠ²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΎΡ Π°Π²ΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΌΠ΅ΡΠ°ΡΡ ΠΆΠΈΡΡ ΡΡΡΠ½ΡΠΌ ΡΠ΅ΡΡΠΈΡΠΎΠ²ΡΠΈΠΊΠ°ΠΌ.
ΠΡΠΎ-ΡΠΎ ΡΠΊΠ°ΠΆΠ΅Ρ, ΡΡΠΎ Ρ ΠΎΡΠΎΡΠΈΠ΅ Π°Π²ΡΠΎΡΠ΅ΡΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΈΡΡΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π±Ρ. Π£ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΠΏΡΠΎΡΠΈΠ²:
- ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΡΠ΅Π½Π΄Ρ Π²Π΅ΡΡΠΌΠ° ΡΠ΄ΠΎΠ±Π½Ρ Π² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ.
- ΠΠ΅ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π°Π»ΠΈΡΡ ΠΈΠ· ΡΠΈΡΡΠ΅ΠΌΡ ΡΠ΅ΡΠ΅Π· API. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ Π²ΡΠ·ΠΎΠ² Π½Π° ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π½Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΏΡΠΎΡΠΈΠ²ΠΎΡΠ΅ΡΠΈΡ Π±ΠΈΠ·Π½Π΅Ρ Π»ΠΎΠ³ΠΈΠΊΠ΅.
- ΠΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΠ΅ΡΠ΅Π· API ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡΡΡ ΠΎΠ³ΡΠΎΠΌΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ΄Π°Π»ΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΡΠΈΡΠ½ΠΎ.
- ΠΡΠ»ΠΈ ΡΠ΅ΡΡΡ ΠΈΠΌΠ΅ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΠ±ΠΎΠΉ, ΡΠΎ ΠΏΡΠΎΡΠ΅ΡΡ ΠΎΡΠΈΡΡΠΊΠΈ Π΄Π°Π½Π½ΡΡ ΠΏΠΎΡΠ»Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠ΅ΡΡΠΎΠ² ΠΏΡΠ΅Π²ΡΠ°ΡΠ°Π΅ΡΡΡ Π² Π³ΠΎΠ»ΠΎΠ²Π½ΡΡ Π±ΠΎΠ»Ρ.
- ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ (ΠΈ, Π½Π° ΠΌΠΎΠΉ Π²Π·Π³Π»ΡΠ΄, Π½Π΅ ΠΎΠΏΡΠ°Π²Π΄Π°Π½Π½ΡΠ΅) Π²ΡΠ·ΠΎΠ²Ρ ΠΊ API.
- Π Π³Π»Π°Π²Π½ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ: ΠΊΠΎΠ³Π΄Π° ΡΠ΅ΡΡΠΎΠ²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π½Π°ΡΠΈΠ½Π°ΡΡ ΡΠΈΡΡΠΈΡΡ ΠΏΡΡΠΌΠΎ ΠΈΠ· ΠΠ. ΠΡΠΎ ΠΏΡΠ΅Π²ΡΠ°ΡΠ°Π΅ΡΡΡ Π² Π½Π°ΡΡΠΎΡΡΠΈΠΉ PK/FK ΡΠΈΡΠΊ! ΠΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΡΠ»ΡΡΠ½ΠΎ: Β«Π― ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°Π±Π»ΠΈΡΠΊΡ Π΄ΠΎΠ±Π°Π²ΠΈΠ»/ΡΠ΄Π°Π»ΠΈΠ»/ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π», ΠΏΠΎΡΠ΅ΠΌΡ 100500 ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ ΡΠ΅ΡΡΠΎΠ² ΠΏΠΎΠΏΠ°Π΄Π°Π»ΠΎ?Β»
ΠΠΎ ΠΌΠΎΠ΅ΠΌΡ ΠΌΠ½Π΅Π½ΠΈΡ, ΡΠ°ΠΌΠΎΠ΅ ΠΎΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ β ΡΡΠΎ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅.
- ΠΠ½ΠΎΠ³ΠΎ ΠΊΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ docker-compose Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΡΠ΅ΡΡΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ, Π½ΠΎ ΠΌΠ°Π»ΠΎ ΠΊΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ docker-compose ΠΏΡΠΈ ΠΏΡΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π² CI/CD. Π ΡΡΡ Ρ Π½Π΅ Π±Π΅ΡΡ Π² ΡΠ°ΡΡΠ΅Ρ kubernetes, swarm ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ ΠΎΡΠΊΠ΅ΡΡΡΠ°ΡΠΈΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ². ΠΠ΅ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ ΠΎΠ½ΠΈ Π΅ΡΡΡ. Π₯ΠΎΡΠΎΡΠΎ Π±Ρ Π±ΡΠ»ΠΎ, Π΅ΡΠ»ΠΈ Π±Ρ docker-compose.yml Π±ΡΠ» ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΠΉ.
- ΠΡΠ»ΠΈ Π΄Π°ΠΆΠ΅ Ρ Π½Π°Ρ Π΅ΡΡΡ ΡΠ²ΠΎΠΉ QA ΡΠ°Π½Π½Π΅Ρ, ΠΊΠ°ΠΊ Π½Π°ΠΌ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΡΠ΅ΡΠ²ΠΈΡΡ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌΡΠ΅ ΡΠ΅ΡΠ΅Π· docker-compose Π½Π΅ ΠΌΠ΅ΡΠ°Π»ΠΈ Π΄ΡΡΠ³-Π΄ΡΡΠ³Ρ?
- ΠΠ°ΠΊ ΡΠΎΠ±ΠΈΡΠ°ΡΡ Π»ΠΎΠ³ΠΈ ΡΠ΅ΡΡΠΈΡΡΠ΅ΠΌΡΡ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ²?
- ΠΠ°ΠΊ ΡΠΈΡΡΠΈΡΡ ΡΠ°Π½Π½Π΅Ρ?
Π£ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ GitLab ΡΠ°Π½Π½Π΅Ρ Π΄Π»Ρ ΡΠ²ΠΎΠΈΡ
ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² ΠΈ Ρ ΡΡΠΈΠΌΠΈ Π²ΠΎΠΏΡΠΎΡΠ°ΠΌΠΈ Ρ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ ΠΏΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅
GitLab Shell Runner
ΠΠ»Ρ ΡΠ°Π½Π½Π΅ΡΠ° ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡ Π»ΠΈΠ½ΡΠΊΡΠΎΠ²ΡΡ Π²ΠΈΡΡΡΠ°Π»ΠΊΡ Ρ 4 vCPU, 4 GB RAM, 50 GB HDD.
ΠΠ° ΠΏΡΠΎΡΡΠΎΡΠ°Ρ
ΠΈΠ½ΡΠ΅ΡΠ½Π΅ΡΠ° ΠΎΡΠ΅Π½Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΏΠΎ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ gitlab-runner, ΠΏΠΎΡΡΠΎΠΌΡ ΠΊΠΎΡΠΎΡΠΊΠΎ:
- ΠΠ°Ρ ΠΎΠ΄ΠΈΠΌ Π½Π° ΠΌΠ°ΡΠΈΠ½ΠΊΡ ΠΏΠΎ SSH
-
ΠΡΠ»ΠΈ Ρ Π²Π°Ρ ΠΌΠ΅Π½Π΅Π΅ 8 GB RAM, ΡΠΎ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡ
ΡΠ΄Π΅Π»Π°ΡΡ swap 10 GB , ΡΡΠΎΠ±Ρ Π½Π΅ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΠ» OOM killer ΠΈ Π½Π΅ ΡΠ±ΠΈΠ²Π°Π» Π½Π°ΠΌ Π·Π°Π΄Π°ΡΠΈ ΠΈΠ·-Π·Π° Π½Π΅Ρ Π²Π°ΡΠΊΠΈ RAM. Π’Π°ΠΊΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΡΠ»ΡΡΠΈΡΡΡ, ΠΊΠΎΠ³Π΄Π° Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π±ΠΎΠ»Π΅Π΅ 5 Π·Π°Π΄Π°Ρ. ΠΠ°Π΄Π°ΡΠΈ Π±ΡΠ΄ΡΡ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡΡ ΠΏΠΎΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, Π·Π°ΡΠΎ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎ.ΠΡΠΈΠΌΠ΅Ρ Ρ OOM killer
ΠΡΠ»ΠΈ Π² Π»ΠΎΠ³Π°Ρ Π·Π°Π΄Π°ΡΠΈ Π²Ρ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅
bash: line 82: 26474 Killed
, ΡΠΎ ΠΏΡΠΎΡΡΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ Π½Π° ΡΠ°Π½Π½Π΅ΡΠ΅sudo dmesg | grep 26474
[26474] 1002 26474 1061935 123806 339 0 0 java Out of memory: Kill process 26474 (java) score 127 or sacrifice child Killed process 26474 (java) total-vm:4247740kB, anon-rss:495224kB, file-rss:0kB, shmem-rss:0kB
Π Π΅ΡΠ»ΠΈ ΠΊΠ°ΡΡΠΈΠ½Π° Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊ, ΡΠΎ ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΠΉΡΠ΅ swap, ΠΈΠ»ΠΈ Π΄ΠΎΠΊΠΈΠ΄ΡΠ²Π°ΠΉΡΠ΅ RAM.
- Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ
gitlab-runner ,docker ,docker-compose , make. - ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
gitlab-runner
Π² Π³ΡΡΠΏΠΏΡdocker
sudo groupadd docker sudo usermod -aG docker gitlab-runner
Π Π΅Π³ΠΈΡΡΡΠΈΡΡΠ΅ΠΌ gitlab-runner.-
ΠΡΠΊΡΡΠ²Π°Π΅ΠΌ Π½Π° ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
/etc/gitlab-runner/config.toml
ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌconcurrent=20 [[runners]] request_concurrency = 10
ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΡΠ°Π½Π½Π΅ΡΠ΅. ΠΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΡΠΈΡΠ°ΡΡ
ΡΡΡ .
ΠΡΠ»ΠΈ Ρ Π²Π°Ρ ΠΌΠ°ΡΠΈΠ½ΠΊΠ° ΠΏΠΎΠΌΠΎΡΠ½Π΅Π΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ 8 vCPU, 16 GB RAM, ΡΠΎ ΡΡΠΈ ΡΠΈΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ Π² 2 ΡΠ°Π·Π° Π±ΠΎΠ»ΡΡΠ΅. ΠΠΎ Π²ΡΠ΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΡΡΠΊΠ°ΡΡΡΡ Π½Π° Π΄Π°Π½Π½ΠΎΠΌ ΡΠ°Π½Π½Π΅ΡΠ΅ ΠΈ Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π΅.
ΠΡΠΎΠ³ΠΎ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ.
ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° docker-compose.yml
ΠΡΠ½ΠΎΠ²Π½Π°Ρ Π·Π°Π΄Π°ΡΠ° β ΡΡΠΎ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΠΉ docker-compose.yml, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ/ΡΠ΅ΡΡΠΈΡΠΎΠ²ΡΠΈΠΊΠΈ ΠΌΠΎΠ³ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ, ΡΠ°ΠΊ ΠΈ Π² CI pipeline.
Π ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΌΡ Π΄Π΅Π»Π°Π΅ΠΌ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΡ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² Π΄Π»Ρ CI. ΠΠ΄Π½ΠΎΠΉ ΠΈΠ· ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΡ
ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
Π² GitLab CI ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ CI_JOB_ID
. ΠΡΠ»ΠΈ ΡΠΊΠ°Π·Π°ΡΡ container_name
ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ "service-${CI_JOB_ID:-local}"
, ΡΠΎ Π² ΡΠ»ΡΡΠ°Π΅:
- Π΅ΡΠ»ΠΈ
CI_JOB_ID
Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ,
ΡΠΎ ΠΈΠΌΡ ΡΠ΅ΡΠ²ΠΈΡΠ° Π±ΡΠ΄Π΅Ρservice-local
- Π΅ΡΠ»ΠΈ
CI_JOB_ID
ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ 123),
ΡΠΎ ΠΈΠΌΡ ΡΠ΅ΡΠ²ΠΈΡΠ° Π±ΡΠ΄Π΅Ρservice-123
ΠΠΎ Π²ΡΠΎΡΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΌΡ Π΄Π΅Π»Π°Π΅ΠΌ ΠΎΠ±ΡΡΡ ΡΠ΅ΡΡ Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌΡΡ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ². ΠΡΠΎ Π΄Π°Π΅Ρ Π½Π°ΠΌ ΠΈΠ·ΠΎΠ»ΡΡΠΈΡ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΡΠ΅ΡΠΈ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠ΅ΡΡΠΎΠ²ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΉ.
networks:
default:
external:
name: service-network-${CI_JOB_ID:-local}
Π‘ΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, ΡΡΠΎ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ°Π³ ΠΊ ΡΡΠΏΠ΅Ρ Ρ =)
ΠΡΠΈΠΌΠ΅Ρ ΠΌΠΎΠ΅Π³ΠΎ docker-compose.yml Ρ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠΌΠΈ
version: "3"
# ΠΠ»Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ web (php) ΠΈ fmt Π½ΡΠΆΠ½ΠΎ,
# ΡΡΠΎΠ±Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ ΠΈΠΌΠ΅Π»ΠΈ ΠΎΠ±ΡΠΈΠΉ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΉ ΠΊΠΎΠ½ΡΠ΅Π½Ρ.
# Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅, ΡΡΠΎ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ /var/www/testrail
volumes:
static-content:
# ΠΠ·ΠΎΠ»ΠΈΡΡΠ΅ΠΌ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠ΅ΡΠ΅Π²ΠΎΠΌ ΡΡΠΎΠ²Π½Π΅
networks:
default:
external:
name: testrail-network-${CI_JOB_ID:-local}
services:
db:
image: mysql:5.7.22
# ΠΠ°ΠΆΠ΄ΡΠΉ container_name ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ${CI_JOB_ID:-local}
container_name: "testrail-mysql-${CI_JOB_ID:-local}"
environment:
MYSQL_HOST: db
MYSQL_DATABASE: mydb
MYSQL_ROOT_PASSWORD: 1234
SKIP_GRANT_TABLES: 1
SKIP_NETWORKING: 1
SERVICE_TAGS: dev
SERVICE_NAME: mysql
networks:
- default
migration:
image: registry.gitlab.com/touchbit/image/testrail/migration:latest
container_name: "testrail-migration-${CI_JOB_ID:-local}"
links:
- db
depends_on:
- db
networks:
- default
fpm:
image: registry.gitlab.com/touchbit/image/testrail/fpm:latest
container_name: "testrail-fpm-${CI_JOB_ID:-local}"
volumes:
- static-content:/var/www/testrail
links:
- db
networks:
- default
web:
image: registry.gitlab.com/touchbit/image/testrail/web:latest
container_name: "testrail-web-${CI_JOB_ID:-local}"
# ΠΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ TR_HTTP_PORT ΠΈΠ»ΠΈ TR_HTTPS_PORTS Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ,
# ΡΠΎ ΡΠ΅ΡΠ²ΠΈΡ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Π΅ΡΡΡ Π½Π° 80 ΠΈ 443 ΠΏΠΎΡΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ.
ports:
- ${TR_HTTP_PORT:-80}:80
- ${TR_HTTPS_PORT:-443}:443
volumes:
- static-content:/var/www/testrail
links:
- db
- fpm
networks:
- default
ΠΡΠΈΠΌΠ΅Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π·Π°ΠΏΡΡΠΊΠ°
docker-compose -f docker-compose.yml up -d
Starting testrail-mysql-local ... done
Starting testrail-migration-local ... done
Starting testrail-fpm-local ... done
Recreating testrail-web-local ... done
ΠΠΎ Π½Π΅ Π²ΡΠ΅ ΡΠ°ΠΊ ΠΏΡΠΎΡΡΠΎ Ρ Π·Π°ΠΏΡΡΠΊΠΎΠΌ Π² CI.
ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Makefile
Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Makefile, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΡΠΎ Π²Π΅ΡΡΠΌΠ° ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΊΠ°ΠΊ Π΄Π»Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΡΠ°ΠΊ ΠΈ Π² CI. ΠΠ°Π»Π΅Π΅ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΈΠ½Π»Π°ΠΉΠ½
# Π£ ΠΌΠ΅Π½Ρ Π² ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ
Π²ΡΠ΅ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ Π²Π΅ΡΠΈ Π»Π΅ΠΆΠ°Ρ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ `.indirect`,
# Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΈ `docker-compose.yml`
# ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ bash Ρ ΠΎΠΏΡΠΈΠ΅ΠΉ pipefail
# pipefail - ΡΠ΅ΠΉΠ»ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΉΠΏΠ°, Π΅ΡΠ»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π²ΡΠΏΠΎΠ»Π½ΠΈΠ»Π°ΡΡ Ρ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ
SHELL=/bin/bash -o pipefail
# ΠΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ ΠΈ ΡΠ΄Π°Π»ΡΠ΅ΠΌ ΡΠ΅ΡΡ
docker-kill:
docker-compose -f $${CI_JOB_ID:-.indirect}/docker-compose.yml kill
docker network rm network-$${CI_JOB_ID:-testrail} || true
# ΠΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ docker-kill
docker-up: docker-kill
# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠ΅ΡΡ Π΄Π»Ρ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ
docker network create network-$${CI_JOB_ID:-testrail}
# ΠΠ°Π±ΠΈΡΠ°Π΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ ΠΎΠ±ΡΠ°Π·Ρ ΠΈΠ· docker-registry
docker-compose -f $${CI_JOB_ID:-.indirect}/docker-compose.yml pull
# ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅
# force-recreate - ΠΏΡΠΈΠ½ΡΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΏΠ΅ΡΠ΅ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ²
# renew-anon-volumes - Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ volumes ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ
ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ²
docker-compose -f $${CI_JOB_ID:-.indirect}/docker-compose.yml up --force-recreate --renew-anon-volumes -d
# ΠΡ ΠΈ, Π½Π° Π²ΡΡΠΊΠΈΠΉ ΡΠ»ΡΡΠ°ΠΉ, Π²ΡΠ²Π΅ΡΡΠΈ ΡΡΠΎ ΡΠ°ΠΌ Ρ Π½Π°Ρ Π² ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅ Π·Π°ΠΏΡΡΠ΅Π½ΠΎ Π½Π° ΠΌΠ°ΡΠΈΠ½ΠΊΠ΅
docker ps
# ΠΠΎΠ»Π»Π΅ΠΊΡΠΈΠΌ Π»ΠΎΠ³ΠΈ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ²
docker-logs:
mkdir ./logs || true
docker logs testrail-web-$${CI_JOB_ID:-local} >& logs/testrail-web.log
docker logs testrail-fpm-$${CI_JOB_ID:-local} >& logs/testrail-fpm.log
docker logs testrail-migration-$${CI_JOB_ID:-local} >& logs/testrail-migration.log
docker logs testrail-mysql-$${CI_JOB_ID:-local} >& logs/testrail-mysql.log
# ΠΡΠΈΡΡΠΊΠ° ΡΠ°Π½Π½Π΅ΡΠ°
docker-clean:
@echo ΠΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π²ΡΠ΅ testrail-ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ
docker kill $$(docker ps --filter=name=testrail -q) || true
@echo ΠΡΠΈΡΡΠΊΠ° Π΄ΠΎΠΊΠ΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ²
docker rm -f $$(docker ps -a -f --filter=name=testrail status=exited -q) || true
@echo ΠΡΠΈΡΡΠΊΠ° dangling ΠΎΠ±ΡΠ°Π·ΠΎΠ²
docker rmi -f $$(docker images -f "dangling=true" -q) || true
@echo ΠΡΠΈΡΡΠΊΠ° testrail ΠΎΠ±ΡΠ°Π·ΠΎΠ²
docker rmi -f $$(docker images --filter=reference='registry.gitlab.com/touchbit/image/testrail/*' -q) || true
@echo ΠΡΠΈΡΡΠΊΠ° Π²ΡΠ΅Ρ
Π½Π΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ
volume
docker volume rm -f $$(docker volume ls -q) || true
@echo ΠΡΠΈΡΡΠΊΠ° Π²ΡΠ΅Ρ
testrail ΡΠ΅ΡΠ΅ΠΉ
docker network rm $(docker network ls --filter=name=testrail -q) || true
docker ps
ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ
make docker-up
$ make docker-up
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml kill
Killing testrail-web-local ... done
Killing testrail-fpm-local ... done
Killing testrail-mysql-local ... done
docker network rm network-${CI_JOB_ID:-testrail} || true
network-testrail
docker network create network-${CI_JOB_ID:-testrail}
d2ec063324081c8bbc1b08fd92242c2ea59d70cf4025fab8efcbc5c6360f083f
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml pull
Pulling db ... done
Pulling migration ... done
Pulling fpm ... done
Pulling web ... done
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml up --force-recreate --renew-anon-volumes -d
Recreating testrail-mysql-local ... done
Recreating testrail-fpm-local ... done
Recreating testrail-migration-local ... done
Recreating testrail-web-local ... done
docker ps
CONTAINER ID PORTS NAMES
a845d3cb0e5a 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp testrail-web-local
19d8ef001398 9000/tcp testrail-fpm-local
e28840a2369c 3306/tcp, 33060/tcp testrail-migration-local
0e7900c23f37 3306/tcp testrail-mysql-local
make docker-logs
$ make docker-logs
mkdir ./logs || true
mkdir: cannot create directory β./logsβ: File exists
docker logs testrail-web-${CI_JOB_ID:-local} >& logs/testrail-web.log
docker logs testrail-fpm-${CI_JOB_ID:-local} >& logs/testrail-fpm.log
docker logs testrail-migration-${CI_JOB_ID:-local} >& logs/testrail-migration.log
docker logs testrail-mysql-${CI_JOB_ID:-local} >& logs/testrail-mysql.log
ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° .gitlab-ci.yml
ΠΠ°ΠΏΡΡΠΊ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ ΡΠ΅ΡΡΠΎΠ²
Integration:
stage: test
tags:
- my-shell-runner
before_script:
# ΠΡΡΠ΅Π½ΡΠΈΡΠΈΡΠΈΡΡΠ΅ΠΌΡΡ Π² registry
- docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY}
# ΠΠ΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌ ΠΏΡΠ΅Π²Π΄ΠΎΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠ΅ TR_HTTP_PORT ΠΈ TR_HTTPS_PORT
- export TR_HTTP_PORT=$(shuf -i10000-60000 -n1)
- export TR_HTTPS_PORT=$(shuf -i10000-60000 -n1)
# ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠΌ Π·Π°Π΄Π°ΡΠΈ
- mkdir ${CI_JOB_ID}
# ΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌ Π² ΡΠΎΠ·Π΄Π°Π½Π½ΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Π½Π°Ρ docker-compose.yml
# ΡΡΠΎΠ±Ρ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ Π±ΡΠ» ΡΠ°Π·Π½ΡΠΉ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ
- cp .indirect/docker-compose.yml ${CI_JOB_ID}/docker-compose.yml
script:
# ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Π΅ΠΌ Π½Π°ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅
- make docker-up
# Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΌ jar (Ρ ΠΌΠ΅Π½Ρ ΡΠ°ΠΊ)
- java -jar itest.jar --http-port ${TR_HTTP_PORT} --https-port ${TR_HTTPS_PORT}
# ΠΈΠ»ΠΈ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅
- docker run --network=testrail-network-${CI_JOB_ID:-local} --rm itest
after_script:
# ΡΠΎΠ±ΠΈΡΠ°Π΅ΠΌ Π»ΠΎΠ³ΠΈ
- make docker-logs
# ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅
- make docker-kill
artifacts:
# ΡΠΎΡ
ΡΠ°Π½ΡΠ΅ΠΌ Π»ΠΎΠ³ΠΈ
when: always
paths:
- logs
expire_in: 30 days
Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ Π·Π°ΠΏΡΡΠΊΠ° ΡΠ°ΠΊΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ Π² Π°ΡΡΠ΅ΡΠ°ΠΊΡΠ°Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ logs Π±ΡΠ΄Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ Π»ΠΎΠ³ΠΈ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² ΠΈ ΡΠ΅ΡΡΠΎΠ². Π§ΡΠΎ ΠΎΡΠ΅Π½Ρ ΡΠ΄ΠΎΠ±Π½ΠΎ Π² ΡΠ»ΡΡΠ°Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΎΠΊ. Π£ ΠΌΠ΅Π½Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ΅ΡΡ Π² ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΠΈ ΠΏΠΈΡΠ΅Ρ ΡΠ²ΠΎΠΉ Π»ΠΎΠ³, Π½ΠΎ ΠΎΠ± ΡΡΠΎΠΌ Ρ ΡΠ°ΡΡΠΊΠ°ΠΆΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ.
ΠΡΠΈΡΡΠΊΠ° ΡΠ°Π½Π½Π΅ΡΠ°
ΠΠ°Π΄Π°ΡΠ° Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΡΡΠΊΠ°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎ ΡΠ°ΡΠΏΠΈΡΠ°Π½ΠΈΡ.
stages:
- clean
- build
- test
Clean runner:
stage: clean
only:
- schedules
tags:
- my-shell-runner
script:
- make docker-clean
ΠΠ°Π»Π΅Π΅ ΠΈΠ΄Π΅ΠΌ Π² Π½Π°Ρ GitLab ΠΏΡΠΎΠ΅ΠΊΡ -> CI/CD -> Schedules -> New Schedule ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π½ΠΎΠ²ΠΎΠ΅ ΡΠ°ΡΠΏΠΈΡΠ°Π½ΠΈΠ΅
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ
ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ 4 Π·Π°Π΄Π°ΡΠΈ Π² GitLab CI
Π Π»ΠΎΠ³Π°Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ Π·Π°Π΄Π°ΡΠΈ Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΌΠΈ ΡΠ΅ΡΡΠ°ΠΌΠΈ Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ ΠΎΡ ΡΠ°Π·Π½ΡΡ Π·Π°Π΄Π°Ρ
CONTAINER ID NAMES
c6b76f9135ed testrail-web-204645172
01d303262d8e testrail-fpm-204645172
2cdab1edbf6a testrail-migration-204645172
826aaf7c0a29 testrail-mysql-204645172
6dbb3fae0322 testrail-web-204645084
3540f8d448ce testrail-fpm-204645084
70fea72aa10d testrail-mysql-204645084
d8aa24b2892d testrail-web-204644881
6d4ccd910fad testrail-fpm-204644881
685d8023a3ec testrail-mysql-204644881
1cdfc692003a testrail-web-204644793
6f26dfb2683e testrail-fpm-204644793
029e16b26201 testrail-mysql-204644793
c10443222ac6 testrail-web-204567103
04339229397e testrail-fpm-204567103
6ae0accab28d testrail-mysql-204567103
b66b60d79e43 testrail-web-204553690
033b1f46afa9 testrail-fpm-204553690
a8879c5ef941 testrail-mysql-204553690
069954ba6010 testrail-web-204553539
ed6b17d911a5 testrail-fpm-204553539
1a1eed057ea0 testrail-mysql-204553539
ΠΠΎΠ»Π΅Π΅ Π΄Π΅ΡΠ°Π»ΡΠ½ΡΠΉ Π»ΠΎΠ³
$ docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY}
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /home/gitlab-runner/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
$ export TR_HTTP_PORT=$(shuf -i10000-60000 -n1)
$ export TR_HTTPS_PORT=$(shuf -i10000-60000 -n1)
$ mkdir ${CI_JOB_ID}
$ cp .indirect/docker-compose.yml ${CI_JOB_ID}/docker-compose.yml
$ make docker-up
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml kill
docker network rm testrail-network-${CI_JOB_ID:-local} || true
Error: No such network: testrail-network-204645172
docker network create testrail-network-${CI_JOB_ID:-local}
0a59552b4464b8ab484de6ae5054f3d5752902910bacb0a7b5eca698766d0331
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml pull
Pulling web ... done
Pulling fpm ... done
Pulling migration ... done
Pulling db ... done
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml up --force-recreate --renew-anon-volumes -d
Creating volume "204645172_static-content" with default driver
Creating testrail-mysql-204645172 ...
Creating testrail-mysql-204645172 ... done
Creating testrail-migration-204645172 ... done
Creating testrail-fpm-204645172 ... done
Creating testrail-web-204645172 ... done
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c6b76f9135ed registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon ofβ¦" 13 seconds ago Up 1 second 0.0.0.0:51148->80/tcp, 0.0.0.0:25426->443/tcp testrail-web-204645172
01d303262d8e registry.gitlab.com/touchbit/image/testrail/fpm:latest "docker-php-entrypoiβ¦" 16 seconds ago Up 13 seconds 9000/tcp testrail-fpm-204645172
2cdab1edbf6a registry.gitlab.com/touchbit/image/testrail/migration:latest "docker-entrypoint.sβ¦" 16 seconds ago Up 13 seconds 3306/tcp, 33060/tcp testrail-migration-204645172
826aaf7c0a29 mysql:5.7.22 "docker-entrypoint.sβ¦" 18 seconds ago Up 16 seconds 3306/tcp testrail-mysql-204645172
6dbb3fae0322 registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon ofβ¦" 36 seconds ago Up 22 seconds 0.0.0.0:44202->80/tcp, 0.0.0.0:20151->443/tcp testrail-web-204645084
3540f8d448ce registry.gitlab.com/touchbit/image/testrail/fpm:latest "docker-php-entrypoiβ¦" 38 seconds ago Up 35 seconds 9000/tcp testrail-fpm-204645084
70fea72aa10d mysql:5.7.22 "docker-entrypoint.sβ¦" 40 seconds ago Up 37 seconds 3306/tcp testrail-mysql-204645084
d8aa24b2892d registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon ofβ¦" About a minute ago Up 53 seconds 0.0.0.0:31103->80/tcp, 0.0.0.0:43872->443/tcp testrail-web-204644881
6d4ccd910fad registry.gitlab.com/touchbit/image/testrail/fpm:latest "docker-php-entrypoiβ¦" About a minute ago Up About a minute 9000/tcp testrail-fpm-204644881
685d8023a3ec mysql:5.7.22 "docker-entrypoint.sβ¦" About a minute ago Up About a minute 3306/tcp testrail-mysql-204644881
1cdfc692003a registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon ofβ¦" About a minute ago Up About a minute 0.0.0.0:44752->80/tcp, 0.0.0.0:23540->443/tcp testrail-web-204644793
6f26dfb2683e registry.gitlab.com/touchbit/image/testrail/fpm:latest "docker-php-entrypoiβ¦" About a minute ago Up About a minute 9000/tcp testrail-fpm-204644793
029e16b26201 mysql:5.7.22 "docker-entrypoint.sβ¦" About a minute ago Up About a minute 3306/tcp testrail-mysql-204644793
c10443222ac6 registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon ofβ¦" 5 hours ago Up 5 hours 0.0.0.0:57123->80/tcp, 0.0.0.0:31657->443/tcp testrail-web-204567103
04339229397e registry.gitlab.com/touchbit/image/testrail/fpm:latest "docker-php-entrypoiβ¦" 5 hours ago Up 5 hours 9000/tcp testrail-fpm-204567103
6ae0accab28d mysql:5.7.22 "docker-entrypoint.sβ¦" 5 hours ago Up 5 hours 3306/tcp testrail-mysql-204567103
b66b60d79e43 registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon ofβ¦" 5 hours ago Up 5 hours 0.0.0.0:56321->80/tcp, 0.0.0.0:58749->443/tcp testrail-web-204553690
033b1f46afa9 registry.gitlab.com/touchbit/image/testrail/fpm:latest "docker-php-entrypoiβ¦" 5 hours ago Up 5 hours 9000/tcp testrail-fpm-204553690
a8879c5ef941 mysql:5.7.22 "docker-entrypoint.sβ¦" 5 hours ago Up 5 hours 3306/tcp testrail-mysql-204553690
069954ba6010 registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon ofβ¦" 5 hours ago Up 5 hours 0.0.0.0:32869->80/tcp, 0.0.0.0:16066->443/tcp testrail-web-204553539
ed6b17d911a5 registry.gitlab.com/touchbit/image/testrail/fpm:latest "docker-php-entrypoiβ¦" 5 hours ago Up 5 hours 9000/tcp testrail-fpm-204553539
1a1eed057ea0 mysql:5.7.22 "docker-entrypoint.sβ¦" 5 hours ago Up 5 hours 3306/tcp testrail-mysql-204553539
ΠΡΠ΅ Π·Π°Π΄Π°ΡΠΈ ΡΡΠΏΠ΅ΡΠ½ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½Ρ
ΠΡΡΠ΅ΡΠ°ΠΊΡΡ Π·Π°Π΄Π°ΡΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ Π»ΠΎΠ³ΠΈ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² ΠΈ ΡΠ΅ΡΡΠΎΠ²
ΠΡΠΎΠ΄Π΅ Π²ΡΠ΅ ΠΏΠΎ ΠΊΡΠ°ΡΠΎΡΠ΅, Π½ΠΎ Π΅ΡΡΡ Π½ΡΠ°Π½Ρ. Pipeline ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠΈΠ½ΡΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΎΡΠΌΠ΅Π½Π΅Π½ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ
ΡΠ΅ΡΡΠΎΠ², ΠΈ Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π·Π°ΠΏΡΡΠ΅Π½Π½ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ Π½Π΅ Π±ΡΠ΄ΡΡ ΠΎΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Ρ. ΠΡΠ΅ΠΌΡ ΠΎΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π½ΡΠΆΠ½ΠΎ ΡΠΈΡΡΠΈΡΡ ΡΠ°Π½Π½Π΅Ρ. Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Π·Π°Π΄Π°ΡΠ° Π½Π° Π΄ΠΎΡΠ°Π±ΠΎΡΠΊΡ Π² GitLab CE Π²ΡΠ΅ Π΅ΡΠ΅ Π² ΡΡΠ°ΡΡΡΠ΅
ΠΠΎ Ρ Π½Π°Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π·Π°ΠΏΡΡΠΊ Π·Π°Π΄Π°ΡΠΈ ΠΏΠΎ ΡΠ°ΡΠΏΠΈΡΠ°Π½ΠΈΡ, ΠΈ Π½ΠΈΠΊΡΠΎ Π½Π°ΠΌ Π½Π΅ Π·Π°ΠΏΡΠ΅ΡΠ°Π΅Ρ Π΅Π΅ Π·Π°ΠΏΡΡΡΠΈΡΡ Π²ΡΡΡΠ½ΡΡ.
ΠΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΠΌ Π² Π½Π°Ρ ΠΏΡΠΎΠ΅ΠΊΡ -> CI/CD -> Schedules ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ Π·Π°Π΄Π°ΡΡ Clean runner
ΠΡΠΎΠ³ΠΎ:
- Π£ Π½Π°Ρ ΠΎΠ΄ΠΈΠ½ shell runner.
- ΠΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ² ΠΌΠ΅ΠΆΠ΄Ρ Π·Π°Π΄Π°ΡΠ°ΠΌΠΈ ΠΈ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π½Π΅Ρ.
- Π£ Π½Π°Ρ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΠΉ Π·Π°ΠΏΡΡΠΊ Π·Π°Π΄Π°Ρ Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΌΠΈ ΡΠ΅ΡΡΠ°ΠΌΠΈ.
- ΠΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ, ΡΠ°ΠΊ ΠΈ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅.
- ΠΠΎΠ³ΠΈ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² ΠΈ ΡΠ΅ΡΡΠΎΠ² ΡΠΎΠ±ΠΈΡΠ°ΡΡΡΡ ΠΈ ΠΏΡΠΈΠΊΡΠ΅ΠΏΠ»ΡΡΡΡΡ ΠΊ pipeline-Π·Π°Π΄Π°ΡΠ΅.
- ΠΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΡΠΈΡΡΠΊΠΈ ΡΠ°Π½Π½Π΅ΡΠ° ΠΎΡ ΡΡΠ°ΡΡΡ docker-ΠΎΠ±ΡΠ°Π·ΠΎΠ².
ΠΡΠ΅ΠΌΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ β ~2 ΡΠ°ΡΠ°.
ΠΠΎΡ, ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, ΠΈ Π²ΡΠ΅. ΠΡΠ΄Ρ ΡΠ°Π΄ ΡΠΈΠ΄Π±ΡΠΊΡ.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com