GitLab Shell Runner. ΠšΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½Ρ‹ΠΉ запуск тСстируСмых сСрвисов ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Docker Compose

GitLab Shell Runner. ΠšΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½Ρ‹ΠΉ запуск тСстируСмых сСрвисов ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Docker Compose

Данная ΡΡ‚Π°Ρ‚ΡŒΡ Π±ΡƒΠ΄Π΅Ρ‚ интСрСсна ΠΊΠ°ΠΊ тСстировщикам, Ρ‚Π°ΠΊ ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ, Π½ΠΎ рассчитана Π² большСй стСпСни Π½Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ настройки GitLab CI/CD для провСдСния ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ тСстирования Π² условиях нСдостаточности инфраструктурных рСсурсов ΠΈ/ΠΈΠ»ΠΈ отсутствия ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ оркСстрации ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ². Π― расскаТу, ΠΊΠ°ΠΊ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ тСстируСмых ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ docker compose Π½Π° ΠΎΠ΄Π½ΠΎΠΌ СдинствСнном GitLab shell Ρ€Π°Π½Π½Π΅Ρ€Π΅ ΠΈ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ запускаСмыС сСрвисы Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Ρƒ Π½Π΅ мСшали.


Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

ΠŸΡ€Π΅Π΄ΠΏΠΎΡΡ‹Π»ΠΊΠΈ

  1. Π’ ΠΌΠΎΠ΅ΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Ρ‡Π°ΡΡ‚Π΅Π½ΡŒΠΊΠΎ ΡΠ»ΡƒΡ‡Π°Π»ΠΎΡΡŒ «Π»Π΅Ρ‡ΠΈΡ‚ΡŒ» ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ΅ тСстированиС Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…. И Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΈ самой Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ являСтся CI pipeline, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ΅ тСстированиС Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ сСрвиса(ΠΎΠ²) проводится Π² dev/stage ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ. Π­Ρ‚ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΎ Π½Π΅ ΠΌΠ°Π»ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ:

    • Из-Π·Π° Π΄Π΅Ρ„Π΅ΠΊΡ‚ΠΎΠ² Π² Ρ‚ΠΎΠΌ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΌ сСрвисС Π² процСссС ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ тСстирования тСстовый ΠΊΠΎΠ½Ρ‚ΡƒΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ испорчСн Π±ΠΈΡ‚Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. Π‘Ρ‹Π²Π°Π»ΠΈ случаи, ΠΊΠΎΠ³Π΄Π° ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° запроса с Π±ΠΈΡ‚Ρ‹ΠΌ JSON-Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠΌ вСшал сСрвис, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΎ стСнд ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π² Π½Π΅Ρ€Π°Π±ΠΎΡ‡Π΅Π΅ состояниС.
    • Π—Π°ΠΌΠ΅Π΄Π»Π΅Π½ΠΈΠ΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ тСстового ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π° с ростом тСстовых Π΄Π°Π½Π½Ρ‹Ρ…. Π”ΡƒΠΌΠ°ΡŽ, ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с очисткой/ΠΎΡ‚ΠΊΠ°Ρ‚ΠΎΠΌ Π‘Π” Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ смысла. Π’ своСй ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ я Π½Π΅ встрСчал ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π³Π΄Π΅ эта ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΠ»Π° Π±Ρ‹ Π³Π»Π°Π΄ΠΊΠΎ.
    • Риск Π½Π°Ρ€ΡƒΡˆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚ΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ тСстового ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π° ΠΏΡ€ΠΈ тСстировании ΠΎΠ±Ρ‰ΠΈΡ… настроСк систСмы. НапримСр, user/group/password/application policy.
    • ВСстовыС Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΡ‚ автотСстов ΠΌΠ΅ΡˆΠ°ΡŽΡ‚ ΠΆΠΈΡ‚ΡŒ Ρ€ΡƒΡ‡Π½Ρ‹ΠΌ тСстировщикам.

    ΠšΡ‚ΠΎ-Ρ‚ΠΎ скаТСт, Ρ‡Ρ‚ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠ΅ автотСсты Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ послС сСбя. Π£ мСня Π΅ΡΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΡ€ΠΎΡ‚ΠΈΠ²:

    • ДинамичСскиС стСнды вСсьма ΡƒΠ΄ΠΎΠ±Π½Ρ‹ Π² использовании.
    • НС ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΈΠ· систСмы Ρ‡Π΅Ρ€Π΅Π· API. НапримСр Π²Ρ‹Π·ΠΎΠ² Π½Π° ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡ΠΈΡ‚ бизнСс Π»ΠΎΠ³ΠΈΠΊΠ΅.
    • ΠŸΡ€ΠΈ создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‡Π΅Ρ€Π΅Π· API ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ΅ количСство ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ.
    • Если тСсты ΠΈΠΌΠ΅ΡŽΡ‚ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ собой, Ρ‚ΠΎ процСсс очистки Π΄Π°Π½Π½Ρ‹Ρ… послС выполнСния тСстов прСвращаСтся Π² Π³ΠΎΠ»ΠΎΠ²Π½ΡƒΡŽ боль.
    • Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ (ΠΈ, Π½Π° ΠΌΠΎΠΉ взгляд, Π½Π΅ ΠΎΠΏΡ€Π°Π²Π΄Π°Π½Π½Ρ‹Π΅) Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΊ API.
    • И Π³Π»Π°Π²Π½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚: ΠΊΠΎΠ³Π΄Π° тСстовыС Π΄Π°Π½Π½Ρ‹Π΅ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ Ρ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ прямо ΠΈΠ· Π‘Π”. Π­Ρ‚ΠΎ прСвращаСтся Π² настоящий PK/FK Ρ†ΠΈΡ€ΠΊ! ΠžΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΡΠ»Ρ‹ΡˆΠ½ΠΎ: Β«Π― Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π°Π±Π»ΠΈΡ‡ΠΊΡƒ Π΄ΠΎΠ±Π°Π²ΠΈΠ»/ΡƒΠ΄Π°Π»ΠΈΠ»/ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π», ΠΏΠΎΡ‡Π΅ΠΌΡƒ 100500 ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… тСстов ΠΏΠΎΠΏΠ°Π΄Π°Π»ΠΎ?Β»

    По ΠΌΠΎΠ΅ΠΌΡƒ мнСнию, самоС ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ β€” это динамичСскоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅.

  2. Много ΠΊΡ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ docker-compose для запуска тСстового окруТСния, Π½ΠΎ ΠΌΠ°Π»ΠΎ ΠΊΡ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ docker-compose ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ тСстирования Π² CI/CD. И Ρ‚ΡƒΡ‚ я Π½Π΅ Π±Π΅Ρ€Ρƒ Π² расчСт kubernetes, swarm ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ оркСстрации ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ². НС Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ ΠΎΠ½ΠΈ Π΅ΡΡ‚ΡŒ. Π₯ΠΎΡ€ΠΎΡˆΠΎ Π±Ρ‹ Π±Ρ‹Π»ΠΎ, Ссли Π±Ρ‹ docker-compose.yml Π±Ρ‹Π» ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ.
  3. Если Π΄Π°ΠΆΠ΅ Ρƒ нас Π΅ΡΡ‚ΡŒ свой QA Ρ€Π°Π½Π½Π΅Ρ€, ΠΊΠ°ΠΊ Π½Π°ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ сСрвисы запускаСмыС Ρ‡Π΅Ρ€Π΅Π· docker-compose Π½Π΅ мСшали Π΄Ρ€ΡƒΠ³-Π΄Ρ€ΡƒΠ³Ρƒ?
  4. Как ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈ тСстируСмых сСрвисов?
  5. Как Ρ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ Ρ€Π°Π½Π½Π΅Ρ€?

Π£ мСня Π΅ΡΡ‚ΡŒ собствСнный GitLab Ρ€Π°Π½Π½Π΅Ρ€ для своих ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ с этими вопросами я столкнулся ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Java ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° для TestRail. А Ρ‚ΠΎΡ‡Π½Π΅Π΅ ΠΏΡ€ΠΈ запускС ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… тСстов. Π’ΠΎΡ‚ Π΄Π°Π»Π΅Π΅ ΠΈ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ эти вопросы с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΈΠ· Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

К ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

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 Shell Runner. ΠšΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½Ρ‹ΠΉ запуск тСстируСмых сСрвисов ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Docker Compose

К ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° .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 Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈ сСрвисов ΠΈ тСстов. Π§Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π² случаС возникновСния ошибок. Π£ мСня ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ тСст Π² ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈ ΠΏΠΈΡˆΠ΅Ρ‚ свой Π»ΠΎΠ³, Π½ΠΎ ΠΎΠ± этом я расскаТу ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ.

GitLab Shell Runner. ΠšΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½Ρ‹ΠΉ запуск тСстируСмых сСрвисов ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Docker Compose

К ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° Ρ€Π°Π½Π½Π΅Ρ€Π°

Π—Π°Π΄Π°Ρ‡Π° Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ Ρ€Π°ΡΠΏΠΈΡΠ°Π½ΠΈΡŽ.

stages:
- clean
- build
- test

Clean runner:
  stage: clean
  only:
    - schedules
  tags:
    - my-shell-runner
  script:
    - make docker-clean

Π”Π°Π»Π΅Π΅ ΠΈΠ΄Π΅ΠΌ Π² наш GitLab ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ -> CI/CD -> Schedules -> New Schedule ΠΈ добавляСм Π½ΠΎΠ²ΠΎΠ΅ расписаниС

GitLab Shell Runner. ΠšΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½Ρ‹ΠΉ запуск тСстируСмых сСрвисов ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Docker Compose

К ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚

ЗапускаСм 4 Π·Π°Π΄Π°Ρ‡ΠΈ Π² GitLab CI
GitLab Shell Runner. ΠšΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½Ρ‹ΠΉ запуск тСстируСмых сСрвисов ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Docker Compose

Π’ Π»ΠΎΠ³Π°Ρ… послСднСй Π·Π°Π΄Π°Ρ‡ΠΈ с ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ тСстами Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ ΠΎΡ‚ Ρ€Π°Π·Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡

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

ВсС Π·Π°Π΄Π°Ρ‡ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Ρ‹

АртСфакты Π·Π°Π΄Π°Ρ‡ΠΈ содСрТат Π»ΠΎΠ³ΠΈ сСрвисов ΠΈ тСстов
GitLab Shell Runner. ΠšΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½Ρ‹ΠΉ запуск тСстируСмых сСрвисов ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Docker Compose

GitLab Shell Runner. ΠšΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½Ρ‹ΠΉ запуск тСстируСмых сСрвисов ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Docker Compose

Π’Ρ€ΠΎΠ΄Π΅ всС ΠΏΠΎ красотС, Π½ΠΎ Π΅ΡΡ‚ΡŒ нюанс. Pipeline ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Π½Π΅Π½ Π²ΠΎ врСмя выполнСния ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… тСстов, ΠΈ Π² этом случаС Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Π΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ остановлСны. ВрСмя ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½ΡƒΠΆΠ½ΠΎ Ρ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ Ρ€Π°Π½Π½Π΅Ρ€. К соТалСнию, Π·Π°Π΄Π°Ρ‡Π° Π½Π° Π΄ΠΎΡ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π² GitLab CE всС Π΅Ρ‰Π΅ Π² статусС Open

Но Ρƒ нас Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ запуск Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΠΎ Ρ€Π°ΡΠΏΠΈΡΠ°Π½ΠΈΡŽ, ΠΈ Π½ΠΈΠΊΡ‚ΠΎ Π½Π°ΠΌ Π½Π΅ Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚ Π΅Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ.
ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π² наш ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ -> CI/CD -> Schedules ΠΈ запускаСм Π·Π°Π΄Π°Ρ‡Ρƒ Clean runner

GitLab Shell Runner. ΠšΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½Ρ‹ΠΉ запуск тСстируСмых сСрвисов ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Docker Compose

Π˜Ρ‚ΠΎΠ³ΠΎ:

  • Π£ нас ΠΎΠ΄ΠΈΠ½ shell runner.
  • ΠšΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² ΠΌΠ΅ΠΆΠ΄Ρƒ Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ ΠΈ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π½Π΅Ρ‚.
  • Π£ нас ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ запуск Π·Π°Π΄Π°Ρ‡ с ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ тСстами.
  • МоТно Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ тСсты ΠΊΠ°ΠΊ локально, Ρ‚Π°ΠΊ ΠΈ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅.
  • Π›ΠΎΠ³ΠΈ сСрвисов ΠΈ тСстов ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ΡΡ ΠΈ ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»ΡΡŽΡ‚ΡΡ ΠΊ pipeline-Π·Π°Π΄Π°Ρ‡Π΅.
  • Π•ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ очистки Ρ€Π°Π½Π½Π΅Ρ€Π° ΠΎΡ‚ старых docker-ΠΎΠ±Ρ€Π°Π·ΠΎΠ².

ВрСмя настройки β€” ~2 часа.
Π’ΠΎΡ‚, собствСнно, ΠΈ всС. Π‘ΡƒΠ΄Ρƒ Ρ€Π°Π΄ фидбэку.

К ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com