GitLab Shell Runner. ืงืึทืžืคึผืขื˜ื™ื˜ื™ื•ื• ืงืึทื˜ืขืจ ืคื•ืŸ ื˜ืขืกื˜ืขื“ ื‘ืึทื“ื™ื ื•ื ื’ืก ื ื™ืฆืŸ Docker Compose

GitLab Shell Runner. ืงืึทืžืคึผืขื˜ื™ื˜ื™ื•ื• ืงืึทื˜ืขืจ ืคื•ืŸ ื˜ืขืกื˜ืขื“ ื‘ืึทื“ื™ื ื•ื ื’ืก ื ื™ืฆืŸ Docker Compose

ื“ืขืจ ืึทืจื˜ื™ืงืœ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืคื•ืŸ ืื™ื ื˜ืขืจืขืก ืฆื• ื‘ื™ื™ื“ืข ื˜ืขืกื˜ืขืจืก ืื•ืŸ ื“ืขื•ื•ืขืœืึธืคึผืขืจืก, ืึธื‘ืขืจ ืื™ื– ื‘ื“ืขื” ื“ืขืจ ื”ื•ื™ืคึผื˜ ืคึฟืึทืจ ืึธื˜ืึทืžื™ื™ืฉืึทืŸ ืกืคึผืขืฉืึทืœืึทืกืฅ ื•ื•ืึธืก ื–ืขื ืขืŸ ืคื™ื™ืกื˜ ืžื™ื˜ ื“ื™ ืคึผืจืึธื‘ืœืขื ืคื•ืŸ ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ GitLab CI / CD ืคึฟืึทืจ ื™ื ื˜ืึทื’ืจื™ื™ืฉืึทืŸ ื˜ืขืกื˜ื™ื ื’ ืื™ืŸ ื˜ื ืึธื™ื ืคื•ืŸ ื ื™ื˜ ื’ืขื ื•ื’ื™ืง ื™ื ืคืจืึทืกื˜ืจืึทืงื˜ืฉืขืจ ืจืขืกื•ืจืกืŸ ืื•ืŸ / ืึธื“ืขืจ ื“ืขืจ ืึทื•ื•ืขืง ืคื•ืŸ ืึท ืงืึทื ื˜ื™ื™ื ืขืจ ืึธืจืงืขืกื˜ืจืึทื˜ื™ืึธืŸ. ืคึผืœืึทื˜ืคืึธืจืžืข. ืื™ืš ื•ื•ืขืœ ื–ืึธื’ืŸ ืื™ืจ ื•ื•ื™ ืฆื• ืฉื˜ืขืœืŸ ื“ื™ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ืคื•ืŸ ืคึผืจืึธื‘ืข ื™ื ื•ื•ื™ื™ืจืึทื ืžืึทื ืฅ ื ื™ืฆืŸ ื“ืึธืงืงืขืจ ืงืึทืžืคึผืึธื•ื– ืื•ื™ืฃ ืื™ื™ืŸ GitLab ืฉืึธืœ ืจืึทื ืขืจ ืื•ืŸ ืึทื–ื•ื™ ืึทื– ื•ื•ืขืŸ ื“ื™ืคึผืœื•ื™ื™ื ื’ ืขื˜ืœืขื›ืข ื™ื ื•ื•ื™ื™ืจืึทื ืžืึทื ืฅ, ื“ื™ ืœืึธื ื˜ืฉื˜ ื‘ืึทื“ื™ื ื•ื ื’ืก ื˜ืึธืŸ ื ื™ื˜ ืึทืจื™ื™ึทื ืžื™ืฉื  ื–ื™ืš ืžื™ื˜ ื™ืขื“ืขืจ ืื ื“ืขืจืขืจ.


ืฆื•ืคืจื™ื“ืŸ

ื”ื™ื ื˜ืขืจื’ืจื•ื ื˜

  1. ืื™ืŸ ืžื™ื™ืŸ ืคื™ืจ, ืขืก ืึธืคื˜ ื’ืขื˜ืจืืคืŸ ืึทื– ื™ื ื˜ืึทื’ืจื™ื™ืฉืึทืŸ ื˜ืขืกื˜ื™ื ื’ ืื™ื– "ื‘ืื”ืื ื“ืœื˜" ืื•ื™ืฃ ืคึผืจืึทื“ื–ืฉืขืงืก. ืื•ืŸ ืึธืคื˜ ื“ืขืจ ืขืจืฉื˜ืขืจ ืื•ืŸ ืžืขืจืกื˜ ื‘ืึทื˜ื™ื™ึทื˜ื™ืง ืคึผืจืึธื‘ืœืขื ืื™ื– ื“ื™ ืกื™ ืจืขืจื  - ืœื™ื ื™ืข, ืื™ืŸ ื•ื•ืึธืก ื™ื ื˜ืึทื’ืจื™ื™ืฉืึทืŸ ื˜ืขืกื˜ื™ื ื’ ื–ื™ื™ึทืขื ื“ื™ืง ื“ืขื•ื•ืขืœืึธืคึผืขื“ ืกืขืจื•ื•ื™ืก (s) ืื™ื– ื“ื•ืจื›ื’ืขืงืึธื›ื˜ ืื™ืŸ ืึท ื“ืขื•ื• / ื‘ื™ื ืข ืกื•ื•ื™ื•ื•ืข. ื“ืึธืก ื”ืึธื˜ ื’ืขืคึฟื™ืจื˜ ื’ืึทื ืฅ ืขื˜ืœืขื›ืข ืคืจืื‘ืœืขืžืขืŸ:

    • ืจืขื›ื˜ ืฆื• ื—ืกืจื•ื ื•ืช ืื™ืŸ ืึท ื‘ืึทื–ื•ื ื“ืขืจ ื“ื™ื ืกื˜ ื‘ืขืฉืึทืก ื™ื ื˜ืึทื’ืจื™ื™ืฉืึทืŸ ื˜ืขืกื˜ื™ื ื’, ื“ื™ ืคึผืจื•ื‘ื™ืจืŸ ืงืจื™ื™ึทื– ืงืขืŸ ื–ื™ื™ืŸ ื“ืึทืžื™ื“ื–ืฉื“ ื“ื•ืจืš ืฆืขื‘ืจืื›ืŸ ื“ืึทื˜ืŸ. ืขืก ื–ืขื ืขืŸ ืงืึทืกืขืก ื•ื•ืขืŸ ืฉื™ืงืŸ ืึท ื‘ืงืฉื” ืžื™ื˜ ืึท ืฆืขื‘ืจืื›ืŸ JSON ืคึฟืึธืจืžืึทื˜ ืงืจืึทืฉื˜ ื“ื™ ื“ื™ื ืกื˜, ื•ื•ืึธืก ืจืขื ื“ืขืจื“ ื“ื™ ืฉื˜ื™ื™ืŸ ื’ืึธืจ ื™ื ืึทืคึผืขืจืึทื‘ืึทืœ.
    • ืกืœืึธื•ื“ืึทื•ืŸ ืคื•ืŸ ื“ื™ ืคึผืจื•ื‘ื™ืจืŸ ืงืจื™ื™ึทื– ื•ื•ื™ ื“ื™ ืคึผืจืึธื‘ืข ื“ืึทื˜ืŸ ื™ื ืงืจื™ืกื™ื–. ืื™ืš ื˜ืจืึทื›ื˜ืŸ ืขืก ืžืื›ื˜ ืงื™ื™ืŸ ื–ื™ื ืขืŸ ืฆื• ื‘ืึทืฉืจื™ื™ึทื‘ืŸ ืึท ื‘ื™ื™ึทืฉืคึผื™ืœ ืžื™ื˜ ืจื™ื™ื ื™ืงื•ื ื’ / ืจืึธื•ืœื™ื ื’ ืฆื•ืจื™ืง ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก. ืื™ืŸ ืžื™ื™ืŸ ืคื™ืจ, ืื™ืš ื”ืึธื‘ืŸ ื ื™ืฉื˜ ื’ืขืคึผืœืึธื ื˜ืขืจื˜ ืึท ืคึผืจื•ื™ืขืงื˜ ื•ื•ื• ื“ืขื ืคึผืจืึธืฆืขื“ื•ืจ ืื™ื– ืกืžื•ื“ืœื™.
    • ืจื™ื–ื™ืงื™ืจืŸ ืคื•ืŸ ื“ื™ืกืจืึทืคึผื˜ื™ื ื’ ื“ื™ ืคืึทื ื’ืงืฉืึทื ืึทืœื™ื˜ื™ ืคื•ืŸ ื“ื™ ืคึผืจื•ื‘ื™ืจืŸ ืงืจื™ื™ึทื– ื•ื•ืขืŸ ื˜ืขืกื˜ื™ื ื’ ืึทืœื’ืขืžื™ื™ื ืข ืกื™ืกื˜ืขื ืกืขื˜ื˜ื™ื ื’ืก. ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ื‘ืึทื ื™ืฆืขืจ / ื’ืจื•ืคึผืข / ืคึผืึทืจืึธืœ / ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืคึผืึธืœื™ื˜ื™ืง.
    • ื˜ืขืกื˜ ื“ืึทื˜ืŸ ืคื•ืŸ ืึธื˜ืึทืžื™ื™ื˜ื™ื“ ื˜ืขืกืฅ ืžืื›ื˜ ืœืขื‘ืŸ ืฉื•ื•ืขืจ ืคึฟืึทืจ ืžืึทื ื•ืึทืœ ื˜ืขืกื˜ืขืจืก.

    ืขื˜ืœืขื›ืข ื•ื•ืขืœืŸ ื–ืึธื’ืŸ ืึทื– ื’ื•ื˜ ืึทื•ื˜ืึธื˜ืขืกื˜ืก ื–ืึธืœ ืจื™ื™ื ื™ืงืŸ ื“ื™ ื“ืึทื˜ืŸ ื ืึธืš ื–ื™ืš. ืื™ืš ื”ืื‘ ื˜ืขื ื•ืช ืงืขื’ืŸ:

    • ื“ื™ื ืึทืžื™ืฉ ืกื˜ืึทื ื“ื– ื–ืขื ืขืŸ ื–ื™ื™ืขืจ ื‘ืึทืงื•ื•ืขื ืฆื• ื ื•ืฆืŸ.
    • ื ื™ื˜ ื™ืขื“ืขืจ ื›ื™ื™ืคืขืฅ ืงืขื ืขืŸ ื–ื™ื™ืŸ ืึทื•ื•ืขืงื’ืขื ื•ืžืขืŸ ืคื•ืŸ ื“ื™ ืกื™ืกื˜ืขื ื“ื•ืจืš ื“ื™ ืึทืคึผื™. ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ืึท ืจื•ืฃ ืฆื• ื•ื™ืกืžืขืงืŸ ืึท ื›ื™ื™ืคืขืฅ ืื™ื– ื ื™ืฉื˜ ื™ืžืคึผืœืึทืžืขื ืึทื“ ื•ื•ื™ื™ึทืœ ืขืก ืงืึทื ื˜ืจืึทื“ื™ืงืฅ ื’ืขืฉืขืคื˜ ืœืึธื’ื™ืง.
    • ื•ื•ืขืŸ ืงืจื™ื™ื™ื˜ื™ื ื’ ืึท ื›ื™ื™ืคืขืฅ ื“ื•ืจืš ื“ื™ API, ืึท ืจื™ื–ื™ืง ืกื•ืžืข ืคื•ืŸ โ€‹โ€‹ืžืขื˜ืึทื“ืึทื˜ืึท ืงืขื ืขืŸ ื–ื™ื™ืŸ ื‘ืืฉืืคืŸ, ื•ื•ืึธืก ืื™ื– ืคึผืจืึธื‘ืœืขืžืึทื˜ื™ืง ืฆื• ื•ื™ืกืžืขืงืŸ.
    • ืื•ื™ื‘ ื˜ืขืกืฅ ื”ืึธื‘ืŸ ื“ื™ืคึผืขื ื“ืึทื ืกื™ื– ืฆื•ื•ื™ืฉืŸ ื–ื™ืš, ื“ืขืจ ืคึผืจืึธืฆืขืก ืคื•ืŸ ืจื™ื™ื ื™ืงื•ื ื’ ื“ืึทื˜ืŸ ื ืึธืš ืคืœื™ืกื ื“ื™ืง ื˜ืขืกืฅ ื˜ื•ืจื ืก ืื™ืŸ ืึท ืงืึธืคึผื•ื•ื™ื™ื˜ื™ืง.
    • ื ืึธืš (ืื•ืŸ, ืื™ืŸ ืžื™ื™ืŸ ืžื™ื™ื ื•ื ื’, ื ื™ื˜ ื’ืขืจืขื›ื˜ืคืืจื˜ื™ืงื˜) ืจื•ืคื˜ ืฆื• ื“ื™ ืึทืคึผื™.
    • ืื•ืŸ ื“ืขืจ ื”ื•ื™ืคึผื˜ ืึทืจื’ื•ืžืขื ื˜: ื•ื•ืขืŸ ืคึผืจื•ื‘ื™ืจืŸ ื“ืึทื˜ืŸ ืกื˜ืึทืจืฅ ืฆื• ื–ื™ื™ืŸ ืงืœื™ืจื“ ื’ืœื™ื™ึทืš ืคื•ืŸ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก. ื“ืึธืก ืื™ื– ื˜ื•ืจื ื™ื ื’ ืื™ืŸ ืึท ืคืึทืงื˜ื™ืฉ PK / FK ืฆื™ืจืง! ืžื™ืจ ื”ืขืจืŸ ืคื•ืŸ ื“ืขื•ื•ืขืœืึธืคึผืขืจืก: "ืื™ืš ื ืึธืจ ืฆื•ื’ืขื’ืขื‘ืŸ / ืึทื•ื•ืขืงื’ืขื ื•ืžืขืŸ / ืจื™ื ื™ื™ืžื“ ืึท ืฆื™ื™ื›ืŸ, ื•ื•ืึธืก 100500 ื™ื ื˜ืึทื’ืจื™ื™ืฉืึทืŸ ื˜ืขืกืฅ ื–ืขื ืขืŸ ื’ืขื›ืืคื˜?"

    ืื™ืŸ ืžื™ื™ืŸ ืžื™ื™ื ื•ื ื’, ื“ื™ ืžืขืจืกื˜ ืึธืคึผื˜ื™ืžืึทืœ ืœื™ื™ื–ื•ื ื’ ืื™ื– ืึท ื“ื™ื ืึทืžื™ืฉ ืกื•ื•ื™ื•ื•ืข.

  2. ืคื™ืœืข ืžืขื ื˜ืฉืŸ ื ื•ืฆืŸ ื“ืึธืงืขืจ-ืงืึธืžืคึผืึธืกืข ืฆื• ืœื•ื™ืคืŸ ืึท ืคึผืจืึธื‘ืข ืกื•ื•ื™ื•ื•ืข, ืึธื‘ืขืจ ื•ื•ื™ื™ื ื™ืง ืžืขื ื˜ืฉืŸ ื ื•ืฆืŸ ื“ืึธืงืขืจ-ืงืึธืžืคึผืึธืกืข ื•ื•ืขืŸ ืงืึทื ื“ืึทืงื˜ื™ื ื’ ื™ื ืึทื’ืจื™ื™ืฉืึทืŸ ื˜ืขืกื˜ื™ื ื’ ืื™ืŸ ืกื™ / ืกื™. ืื•ืŸ ื“ืึธ ืื™ืš ื˜ืึธืŸ ื ื™ื˜ ื ืขืžืขืŸ ืื™ืŸ ื—ืฉื‘ื•ืŸ ืงื•ื‘ืขืจื ืขื˜ืขืก, ืกื•ื•ืึธืจื ืื•ืŸ ืื ื“ืขืจืข ืงืึทื ื˜ื™ื™ื ืขืจ ืึธืจืงืขืกื˜ืจืึทื˜ื™ืึธืŸ ืคึผืœืึทื˜ืคืึธืจืžืก. ื ื™ื˜ ื™ืขื“ืขืจ ืคื™ืจืžืข ื”ืื˜ ื–ื™ื™. ืขืก ื•ื•ืึธืœื˜ ื–ื™ื™ืŸ ืคื™ื™ึทืŸ ืื•ื™ื‘ docker-compose.yml ืื™ื– ื•ื ื™ื•ื•ืขืจืกืึทืœ.
  3. ืืคื™ืœื• ืื•ื™ื‘ ืžื™ืจ ื”ืึธื‘ืŸ ืื•ื ื“ื–ืขืจ ืื™ื™ื’ืขื ืข QA ืจืึทื ืขืจ, ื•ื•ื™ ืงืขื ืขืŸ ืžื™ืจ ืžืึทื›ืŸ ื–ื™ื›ืขืจ ืึทื– ืกืขืจื•ื•ื™ืกืขืก ืœืึธื ื˜ืฉื˜ ื“ื•ืจืš ื“ืึธืงืขืจ-ืงืึธืžืคึผืึธืกืข ื˜ืึธืŸ ื ื™ื˜ ืึทืจื™ื™ึทื ืžื™ืฉื  ื–ื™ืš ืžื™ื˜ ื™ืขื“ืขืจ ืื ื“ืขืจืขืจ?
  4. ื•ื•ื™ ืฆื• ื–ืึทืžืœืขืŸ ืœืึธื’ืก ืคื•ืŸ ื˜ืขืกื˜ืขื“ ื‘ืึทื“ื™ื ื•ื ื’ืก?
  5. ื•ื•ื™ ืฆื• ืจื™ื™ืŸ ื“ื™ ืจืึทื ืขืจ?

ืื™ืš ื”ืึธื‘ืŸ ืžื™ื™ืŸ ืื™ื™ื’ืขื ืข GitLab ืจืึทื ืขืจ ืคึฟืึทืจ ืžื™ื™ืŸ ืคึผืจืึทื“ื–ืฉืขืงืก ืื•ืŸ ืื™ืš ื’ืขืคึผืœืึธื ื˜ืขืจื˜ ื“ื™ ืคึฟืจืื’ืŸ ื‘ืขืฉืึทืก ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ Java ืงืœื™ืขื ื˜ ืคืึทืจ TestRail. ืžืขืจ ื’ืขื ื•ื™, ื•ื•ืขืŸ ืคืœื™ืกื ื“ื™ืง ื™ื ื˜ืึทื’ืจื™ื™ืฉืึทืŸ ื˜ืขืกืฅ. ื•ื ื˜ืขืจ ืžื™ืจ ื•ื•ืขืœืŸ ืกืึธืœื•ื•ืข ื“ื™ ื™ืฉื•ื– ื ื™ืฆืŸ ื‘ื™ื™ืฉืคื™ืœืŸ ืคื•ืŸ ื“ืขื ืคึผืจื•ื™ืขืงื˜.

ืฆื•ื ืื™ื ื”ืึทืœื˜

GitLab Shell Runner

ืคึฟืึทืจ ืึท ืœื•ื™ืคืขืจ, ืื™ืš ืจืขืงืึธืžืขื ื“ื™ืจืŸ ืึท ืœื™ื ื•ืงืก ื•ื•ื™ืจื˜ื•ืึทืœ ืžืึทืฉื™ืŸ ืžื™ื˜ 4 ื•ื•ืงืคึผื•, 4 ื’ื™ื’ืื‘ื™ื™ื˜ ื‘ืึทืจืึทืŸ, 50 ื’ื™ื’ืื‘ื™ื™ื˜ ื”ื“ื“.
ืขืก ืื™ื– ืึท ืคึผืœืึทืฅ ืคื•ืŸ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ื•ื•ืขื’ืŸ ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ื’ื™ื˜ืœืึทื‘-ืจืึทื ืขืจ ืื•ื™ืฃ ื“ืขืจ ืื™ื ื˜ืขืจื ืขืฅ, ืึทื–ื•ื™ ื‘ืขืงื™ืฆืขืจ:

  • ืœืึธื’ื™ืŸ ืฆื• ื“ื™ ืžืึทืฉื™ืŸ ื“ื•ืจืš SSH
  • ืื•ื™ื‘ ืื™ืจ ื”ืึธื‘ืŸ ื•ื•ื™ื™ื ื™ืงืขืจ ื•ื•ื™ 8 ื’ื™ื’ืื‘ื™ื™ื˜ ื‘ืึทืจืึทืŸ, ืื™ืš ืจืขืงืึธืžืขื ื“ื™ืจืŸ ืžืึทื›ืŸ ื•ื™ืกื‘ื™ื™ึทื˜ืŸ 10 ื’ื™ื’ืื‘ื™ื™ื˜ืึทื–ื•ื™ ืึทื– ื“ื™ OOM ืงื™ืœืœืขืจ ืงืขืŸ ื ื™ืฉื˜ ืงื•ืžืขืŸ ืื•ืŸ ื˜ื™ื™ื˜ืŸ ืื•ื ื“ื–ืขืจ ื˜ืึทืกืงืก ื•ื•ื™ื™ึทืœ ืคื•ืŸ ืคืขืœืŸ ืคื•ืŸ ื‘ืึทืจืึทืŸ. ื“ืึธืก ืงืขืŸ ืคึผืึทืกื™ืจืŸ ื•ื•ืขืŸ ืžืขืจ ื•ื•ื™ 5 ื˜ืึทืกืงืก ื–ืขื ืขืŸ ืœืึธื ื˜ืฉื˜ ืกื™ื™ืžืึทืœื˜ื™ื™ื ื™ืึทืกืœื™. ื“ื™ ื˜ืึทืกืงืก ื•ื•ืขื˜ ืคึผืจืึธื’ืจืขืก ืžืขืจ ืกืœืึธื•ืœื™, ืึธื‘ืขืจ ืกื˜ืขื“ืึทืœื™.

    ื‘ื™ื™ึทืฉืคึผื™ืœ ืžื™ื˜ OOM ืงื™ืœืœืขืจ

    ืื•ื™ื‘ ืื™ืจ ื–ืขืŸ ืื™ืŸ ื“ื™ ืึทืจื‘ืขื˜ ืœืึธื’ืก 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

    ืื•ืŸ ืื•ื™ื‘ ื“ื™ ื‘ื™ืœื“ ืงื•ืงื˜ ืขืคึผืขืก ื•ื•ื™ ื“ืึธืก, ืึธื“ืขืจ ืœื™ื™ื’ืŸ ื•ื™ืกื‘ื™ื™ึทื˜ืŸ ืึธื“ืขืจ ืœื™ื™ื’ืŸ ื‘ืึทืจืึทืŸ.

  • ื™ื ืกื˜ืึทืœื™ืจืŸ ื’ื™ื˜ืœืึทื‘-ืจืึทื ืขืจ, ื“ืึธืงืงืขืจ, ื“ืึธืงืขืจ-ืงืึทืžืคึผืึธื•ื–, ืžืึทื›ืŸ.
  • ืึทื“ื™ื ื’ ืึท ื‘ืึทื ื™ืฆืขืจ gitlab-runner ืฆื• ื“ืขืจ ื’ืจื•ืคึผืข docker
    sudo groupadd docker
    sudo usermod -aG docker gitlab-runner
  • ืจืขื’ื™ืกื˜ืจื™ืจืŸ ื’ื™ื˜ืœืึทื‘-ืจืึทื ืขืจ.
  • ืขืคืขื ืขืŸ ืคึฟืึทืจ ืขื“ื™ื˜ื™ื ื’ /etc/gitlab-runner/config.toml ืื•ืŸ ืœื™ื™ื’ืŸ

    concurrent=20
    [[runners]]
      request_concurrency = 10

    ื“ืึธืก ื•ื•ืขื˜ ืœืึธื–ืŸ ืื™ืจ ืฆื• ืœื•ื™ืคืŸ ืคึผืึทืจืึทืœืขืœ ื˜ืึทืกืงืก ืื•ื™ืฃ ืื™ื™ืŸ ืจืึทื ืขืจ. ืœื™ื™ืขื ืขืŸ ืžืขืจ ื“ืึธ.
    ืื•ื™ื‘ ืื™ืจ ื”ืึธื‘ืŸ ืึท ืžืขืจ ืฉื˜ืึทืจืง ืžืึทืฉื™ืŸ, ืœืžืฉืœ 8 ื•ื•ืงืคึผื•, 16 ื’ื™ื’ืื‘ื™ื™ื˜ ื‘ืึทืจืึทืŸ, ื“ื™ ื ื•ืžืขืจืŸ ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขืžืื›ื˜ ื‘ื™ื™ึท ืžื™ื ื“ืกื˜ืขืจ 2 ืžืืœ ื’ืจืขืกืขืจ. ืื‘ืขืจ ืขืก ืึทืœืข ื“ืขืคึผืขื ื“ืก ืื•ื™ืฃ ื•ื•ืึธืก ืคึผื•ื ืงื˜ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืœืึธื ื˜ืฉื˜ ืื•ื™ืฃ ื“ืขื ืจืึทื ืขืจ ืื•ืŸ ืื™ืŸ ื•ื•ืึธืก ืงื•ื•ืึทื ื˜ื™ื˜ื™.

ืก'ืื™ื– ื’ืขื ื•ื’.

ืฆื•ื ืื™ื ื”ืึทืœื˜

ืคึผืจื™ืคึผืขืจื™ื ื’ docker-compose.yml

ื“ื™ ื”ื•ื™ืคึผื˜ ืึทืจื‘ืขื˜ ืื™ื– ืึท ื•ื ื™ื•ื•ืขืจืกืึทืœ docker-compose.yml, ื•ื•ืึธืก ื“ืขื•ื•ืขืœืึธืคึผืขืจืก / ื˜ืขืกื˜ืขืจืก ืงืขื ืขืŸ ื ื•ืฆืŸ ื‘ื™ื™ื“ืข ืœืึธื•ืงืึทืœื™ ืื•ืŸ ืื™ืŸ ื“ื™ ืกื™ ืจืขืจื  - ืœื™ื ื™ืข.

ืขืจืฉื˜ืขืจ ืคื•ืŸ ืึทืœืข, ืžื™ืจ ืžืึทื›ืŸ ื™ื™ื ืฆื™ืง ื“ื™ื ืกื˜ ื ืขืžืขืŸ ืคึฟืึทืจ ืกื™. ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ื™ื™ื ืฆื™ืง ื•ื•ืขืจื™ืึทื‘ืึทืœื– ืื™ืŸ 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

ืึธื‘ืขืจ ื ื™ื˜ ืึทืœืฅ ืื™ื– ืึทื–ื•ื™ ืคึผืฉื•ื˜ ืžื™ื˜ ืงืึทื˜ืขืจ ืื™ืŸ ืกื™.

ืฆื•ื ืื™ื ื”ืึทืœื˜

ืคึผืจื™ืคึผืขืจื™ื ื’ ื“ื™ Makefile

ืื™ืš ื ื•ืฆืŸ Makefile ื•ื•ื™ื™ึทืœ ืขืก ืื™ื– ื–ื™ื™ืขืจ ื‘ืึทืงื•ื•ืขื ื‘ื™ื™ื“ืข ืคึฟืึทืจ ื”ื™ื’ืข ืกื•ื•ื™ื•ื•ืข ืคืึทืจื•ื•ืึทืœื˜ื•ื ื’ ืื•ืŸ ืื™ืŸ ืกื™. ืžืขืจ ืึธื ืœื™ื™ืŸ ื‘ืึทืžืขืจืงื•ื ื’ืขืŸ

# ะฃ ะผะตะฝั ะฒ ะฟั€ะพะตะบั‚ะฐั… ะฒัะต ะฒัะฟะพะผะพะณะฐั‚ะตะปัŒะฝั‹ะต ะฒะตั‰ะธ ะปะตะถะฐั‚ ะฒ ะดะธั€ะตะบั‚ะพั€ะธะธ `.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 
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
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

ืฆื•ื ืื™ื ื”ืึทืœื˜

ืคึผืจื™ืคึผืขืจื™ื ื’ .ื’ื™ื˜ืœืึทื‘-ืกื™.ื™ืžืœ

ืคืœื™ืกื ื“ื™ืง ื™ื ื˜ืึทื’ืจื™ื™ืฉืึทืŸ ื˜ืขืกืฅ

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

ื•ื•ื™ ืึท ืจืขื–ื•ืœื˜ืึทื˜ ืคื•ืŸ ืคืœื™ืกื ื“ื™ืง ืึทื–ืึท ืึท ืึทืจื‘ืขื˜, ื“ื™ ืœืึธื’ืก ื•ื•ืขื’ื•ื•ื™ื™ึทื–ืขืจ ืื™ืŸ ื“ื™ ืึทืจื˜ืึทืคืึทืงืฅ ื•ื•ืขื˜ ืึทื ื˜ื”ืึทืœื˜ืŸ ืกืขืจื•ื•ื™ืก ืื•ืŸ ืคึผืจื•ื‘ื™ืจืŸ ืœืึธื’ืก. ื•ื•ืึธืก ืื™ื– ื–ื™ื™ืขืจ ื‘ืึทืงื•ื•ืขื ืื™ืŸ ืคืึทืœ ืคื•ืŸ ืขืจืจืึธืจืก. ื™ืขื“ืขืจ ืคึผืจืึธื‘ืข ืื™ืŸ ืคึผืึทืจืึทืœืขืœ ืฉืจื™ื™ื‘ื˜ ื–ื™ื™ึทืŸ ืื™ื™ื’ืŸ ืงืœืึธืฅ, ืึธื‘ืขืจ ืื™ืš ื•ื•ืขืœ ืจืขื“ืŸ ื•ื•ืขื’ืŸ ื“ืขื ืกืขืคึผืขืจืึทื˜ืœื™.

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 -> ืกื˜ืฉืขื“ื•ืœืขืก -> ื ื™ื• ืคึผืœืึทืŸ ืื•ืŸ ืœื™ื™ื’ืŸ ืึท ื ื™ื™ึทืข ืคึผืœืึทืŸ

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

ืึทืœืฅ ืžื™ื™ื ื˜ ืฆื• ื–ื™ื™ืŸ ืฉื™ื™ืŸ, ืึธื‘ืขืจ ืขืก ืื™ื– ืึท ื ื•ืึทื ืก. ืจืขืจื  - ืœื™ื ื™ืข ืงืขื ืขืŸ ื–ื™ื™ืŸ ืงืจืึทืคื˜-ืงืึทื ืกืึทืœื“ ื‘ืฉืขืช ื™ื ื˜ืึทื’ืจื™ื™ืฉืึทืŸ ื˜ืขืกืฅ ื–ืขื ืขืŸ ืคืœื™ืกื ื“ื™ืง, ืื™ืŸ ื•ื•ืึธืก ืคืึทืœ ืคืœื™ืกื ื“ื™ืง ืงืึทื ื˜ื™ื™ื ืขืจื– ื•ื•ืขื˜ ื ื™ืฉื˜ ื–ื™ื™ืŸ ืกื˜ืึทืคึผื˜. ืคื•ืŸ ืฆื™ื™ื˜ ืฆื• ืฆื™ื™ื˜ ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืจื™ื™ืŸ ื“ื™ ืจืึทื ืขืจ. ืฆื•ื ื‘ืึทื“ื•ื™ืขืจืŸ, ื“ื™ ืึทืจื‘ืขื˜ ืคึฟืึทืจ ืคึฟืึทืจื‘ืขืกืขืจื•ื ื’ ืื™ืŸ GitLab CE ืื™ื– ื ืึธืš ืื™ืŸ ืกื˜ืึทื˜ื•ืก ืขืคืขื ืขืŸ

ืึธื‘ืขืจ ืžื™ืจ ื”ืึธื‘ืŸ ืฆื•ื’ืขืœื™ื™ื’ื˜ ื“ื™ ืงืึทื˜ืขืจ ืคื•ืŸ ืึท ืึทืจื‘ืขื˜ ืœื•ื™ื˜ ืึท ืคึผืœืึทืŸ, ืื•ืŸ ืงื™ื™ืŸ ืื™ื™ื ืขืจ ืคืึทืจื•ื•ืขืจืŸ ืื•ื ื“ื– ืฆื• ืœื•ื™ืคืŸ ืขืก ืžืึทื ื™ื•ืึทืœื™.
ื’ื™ื™ืŸ ืฆื• ืื•ื ื“ื–ืขืจ ืคึผืจื•ื™ืขืงื˜ -> ืกื™ / ืกื™ -> ืกืงืขื“ื–ืฉื•ืœื– ืื•ืŸ ืœื•ื™ืคืŸ ื“ื™ ืึทืจื‘ืขื˜ Clean runner

GitLab Shell Runner. ืงืึทืžืคึผืขื˜ื™ื˜ื™ื•ื• ืงืึทื˜ืขืจ ืคื•ืŸ ื˜ืขืกื˜ืขื“ ื‘ืึทื“ื™ื ื•ื ื’ืก ื ื™ืฆืŸ Docker Compose

ื’ืึทื ืฅ:

  • ืžื™ืจ ื”ืึธื‘ืŸ ืื™ื™ืŸ ืฉืึธืœ ืจืึทื ืขืจ.
  • ืขืก ื–ืขื ืขืŸ ืงื™ื™ืŸ ืงืึธื ืคืœื™ืงื˜ ืฆื•ื•ื™ืฉืŸ ื˜ืึทืกืงืก ืื•ืŸ ื“ื™ ืกื•ื•ื™ื•ื•ืข.
  • ืžื™ืจ ืœื•ื™ืคืŸ ื˜ืึทืกืงืก ืžื™ื˜ ื™ื ื˜ืึทื’ืจื™ื™ืฉืึทืŸ ื˜ืขืกืฅ ืื™ืŸ ืคึผืึทืจืึทืœืขืœ.
  • ืื™ืจ ืงืขื ืขืŸ ืœื•ื™ืคืŸ ื™ื ื˜ืึทื’ืจื™ื™ืฉืึทืŸ ื˜ืขืกืฅ ืึธื“ืขืจ ืœืึธื•ืงืึทืœื™ ืึธื“ืขืจ ืื™ืŸ ืึท ืงืึทื ื˜ื™ื™ื ืขืจ.
  • ืกืขืจื•ื•ื™ืก ืื•ืŸ ืคึผืจื•ื‘ื™ืจืŸ ืœืึธื’ืก ื–ืขื ืขืŸ ื’ืขื–ืืžืœื˜ ืื•ืŸ ืึทื˜ืึทื˜ืฉื˜ ืฆื• ื“ื™ ืจืขืจื  - ืœื™ื ื™ืข ืึทืจื‘ืขื˜.
  • ืขืก ืื™ื– ืžืขื’ืœืขืš ืฆื• ืจื™ื™ืŸ ื“ื™ ืจืึทื ืขืจ ืคึฟื•ืŸ ืึทืœื˜ ื“ืึธืงืงืขืจ ื‘ื™ืœื“ืขืจ.

ืกืขื˜ืึทืคึผ ืฆื™ื™ื˜ ืื™ื– ~ 2 ืฉืขื”.
ืึทื– ืก ืึทืœืข, ืคืืงื˜ื™ืฉ. ืื™ืš ื•ื•ืขืœ ื–ื™ื™ืŸ ืฆื•ืคืจื™ื“ืŸ ืฆื• ื‘ืึทืงื•ืžืขืŸ ื‘ืึทืžืขืจืงื•ื ื’ืขืŸ.

ืฆื•ื ืื™ื ื”ืึทืœื˜

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’