GitLab Shell Runner. เบเบฒเบ™เปเบ‚เปˆเบ‡เบ‚เบฑเบ™เป€เบ›เบตเบ”เบ•เบปเบงเบšเปเบฅเบดเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเป‚เบ”เบเปƒเบŠเป‰ Docker Compose

GitLab Shell Runner. เบเบฒเบ™เปเบ‚เปˆเบ‡เบ‚เบฑเบ™เป€เบ›เบตเบ”เบ•เบปเบงเบšเปเบฅเบดเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเป‚เบ”เบเปƒเบŠเป‰ Docker Compose

เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบˆเบฐเบกเบตเบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเบชเปเบฒเบฅเบฑเบšเบ—เบฑเบ‡เบœเบนเป‰เบ—เบปเบ”เบชเบญเบšเปเบฅเบฐเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ, เปเบ•เปˆเบกเบตเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ•เบปเป‰เบ™เบ•เปเบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เบŠเปˆเบฝเบงเบŠเบฒเบ™เบ”เป‰เบฒเบ™เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ—เบตเปˆเบ›เบฐเป€เบŠเบตเบ™เบเบฑเบšเบšเบฑเบ™เบซเบฒเบ‚เบญเบ‡เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ GitLab CI / CD เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เปƒเบ™เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ‚เบญเบ‡เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™เป‚เบ„เบ‡เบฅเปˆเบฒเบ‡เบ—เบตเปˆเบšเปเปˆเบžเบฝเบ‡เบžเปเปเบฅเบฐ / เบซเบผเบทเบเบฒเบ™เบ‚เบฒเบ”เบ–เบฑเบ‡. เป€เบงเบ—เบต orchestration. เบ‚เป‰เบญเบเบˆเบฐเบšเบญเบเบ—เปˆเบฒเบ™เบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเป‚เบ”เบเปƒเบŠเป‰ docker compose เปƒเบ™เบ•เบปเบงเปเบฅเปˆเบ™ Shell GitLab เบ”เบฝเบงเปเบฅเบฐเป€เบžเบทเปˆเบญเบงเปˆเบฒเป€เบกเบทเปˆเบญเบ™เปเบฒเปƒเบŠเป‰เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบซเบผเบฒเบ, เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ—เบตเปˆเป€เบ›เบตเบ”เบ•เบปเบงเบšเปเปˆเปเบŠเบเปเบŠเบ‡เบเบฑเบ™เปเบฅเบฐเบเบฑเบ™.


เป€เบ™เบทเป‰เบญเปƒเบ™

เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™

  1. เปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบ‚เป‰เบญเบ, เบกเบฑเบ™เบกเบฑเบเบˆเบฐเป€เบเบตเบ”เบ‚เบทเป‰เบ™เบงเปˆเบฒเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡เป„เบ”เป‰เบ–เบทเบ "เบ›เบฐเบ•เบดเบšเบฑเบ”" เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™. เปเบฅเบฐเป€เบฅเบทเป‰เบญเบเป†เบšเบฑเบ™เบซเบฒเบ—เปเบฒเบญเบดเบ”เปเบฅเบฐเบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบชเบธเบ”เปเบกเปˆเบ™เบ—เปเปˆ CI, เปƒเบ™เบ™เบฑเป‰เบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡ เบเปเบฒเบฅเบฑเบ‡เบžเบฑเบ”เบ—เบฐเบ™เบฒ เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เปเบกเปˆเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบขเบนเปˆเปƒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก dev/stage. เบ™เบตเป‰เป€เบฎเบฑเบ”เปƒเบซเป‰เป€เบเบตเบ”เบšเบฑเบ™เบซเบฒเป€เบฅเบฑเบเบ™เป‰เบญเบ:

    • เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบ‚เปเป‰เบšเบปเบเบžเปˆเบญเบ‡เปƒเบ™เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบชเบฐเป€เบžเบฒเบฐเปƒเบ”เบซเบ™เบถเปˆเบ‡เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡, เบงเบปเบ‡เบˆเบญเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบญเบฒเบ”เบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบ„เบงเบฒเบกเป€เบชเบเบซเบฒเบเบˆเบฒเบเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเปเบ•เบเบซเบฑเบ. เบกเบตเบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ—เบตเปˆเบกเบตเบฎเบนเบšเปเบšเบš JSON เบ—เบตเปˆเปเบ•เบเบซเบฑเบเป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ‚เบฑเบ”เบ‚เป‰เบญเบ‡, เป€เบŠเบดเปˆเบ‡เป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เบขเบทเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เบ‡เบฒเบ™เป„เบ”เป‰เบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™.
    • เบเบฒเบ™เบŠเป‰เบฒเบฅเบปเบ‡เบ‚เบญเบ‡เบงเบปเบ‡เบˆเบญเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบเป‰เบญเบ™เบงเปˆเบฒเบ‚เปเป‰เบกเบนเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™. เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบ„เบดเบ”โ€‹เบงเปˆเบฒโ€‹เบกเบฑเบ™โ€‹เบšเปเปˆโ€‹เบกเบตโ€‹เบ„เบงเบฒเบกโ€‹เบฎเบนเป‰โ€‹เบชเบถเบโ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เบญเบฐโ€‹เบ—เบดโ€‹เบšเบฒเบโ€‹เบ•เบปเบงโ€‹เบขเปˆเบฒเบ‡โ€‹เบ—เบตเปˆโ€‹เบกเบตโ€‹เบเบฒเบ™โ€‹เบ—เปเบฒโ€‹เบ„เบงเบฒเบกโ€‹เบชเบฐโ€‹เบญเบฒเบ” / rolling เบเบฑเบšโ€‹เบ„เบทเบ™โ€‹เป„เบ›โ€‹เบšเปˆเบญเบ™โ€‹เบ–เบฒเบ™โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™. เปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบ‚เป‰เบญเบ, เบ‚เป‰เบญเบเบšเปเปˆเป„เบ”เป‰เบžเบปเบšเบเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ™เบตเป‰เบ”เปเบฒเป€เบ™เบตเบ™เป„เบ›เบขเปˆเบฒเบ‡เบชเบฐเบšเบฒเบ.
    • เบ„เบงเบฒเบกเบชเปˆเบฝเบ‡เบ•เปเปˆเบเบฒเบ™เบ‚เบฑเบ”เบ‚เบงเบฒเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เบงเบปเบ‡เบˆเบญเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบฅเบฐเบšเบปเบšเบ—เบปเปˆเบงเป„เบ›. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ™เบฐเป‚เบเบšเบฒเบเบœเบนเป‰เปƒเบŠเป‰/เบเบธเปˆเบก/เบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™/เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™.
    • เบ‚เปเป‰เบกเบนเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบˆเบฒเบเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เป€เบฎเบฑเบ”เปƒเบซเป‰เบŠเบตเบงเบดเบ”เบกเบตเบ„เบงเบฒเบกเบซเบเบธเป‰เบ‡เบเบฒเบเบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เบ—เบปเบ”เบชเบญเบšเบ„เบนเปˆเบกเบท.

    เบšเบฒเบ‡เบ„เบปเบ™เบˆเบฐเป€เบงเบปเป‰เบฒเบงเปˆเบฒ autotests เบ—เบตเปˆเบ”เบตเบ„เบงเบ™เป€เบฎเบฑเบ”เบ„เบงเบฒเบกเบชเบฐเบญเบฒเบ”เบ‚เปเป‰เบกเบนเบ™เบซเบผเบฑเบ‡เบˆเบฒเบเบ•เบปเบงเป€เบญเบ‡. เบ‚เป‰เบญเบเบกเบตเบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡เบเบฑเบ™:

    • เบ‚เบฒเบ•เบฑเป‰เบ‡เปเบšเบšเป„เบ”เบ™เบฒเบกเบดเบเปเบกเปˆเบ™เบชเบฐเบ”เบงเบเบซเบผเบฒเบเบ—เบตเปˆเบˆเบฐเบ™เปเบฒเปƒเบŠเป‰.
    • เบšเปเปˆเปเบกเปˆเบ™เบ—เบธเบเป†เบงเบฑเบ”เบ–เบธเบชเบฒเบกเบฒเบ”เบ–เบทเบเป‚เบเบเบเป‰เบฒเบเบญเบญเบเบˆเบฒเบเบฅเบฐเบšเบปเบšเบœเปˆเบฒเบ™ API. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบเบฒเบ™เป‚เบ—เบซเบฒเป€เบžเบทเปˆเบญเบฅเบถเบšเบงเบฑเบ”เบ–เบธเบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบžเบฒเบฐเบงเปˆเบฒเบกเบฑเบ™เบ‚เบฑเบ”เบเบฑเบšเป€เบซเบ”เบœเบปเบ™เบ—เบฒเบ‡เบ—เบธเบฅเบฐเบเบดเบ”.
    • เป€เบกเบทเปˆเบญเบชเป‰เบฒเบ‡เบงเบฑเบ”เบ–เบธเบœเปˆเบฒเบ™ API, เบˆเปเบฒเบ™เบงเบ™ metadata เบชเบฒเบกเบฒเบ”เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™, เป€เบŠเบดเปˆเบ‡เป€เบ›เบฑเบ™เบšเบฑเบ™เบซเบฒเบ—เบตเปˆเบˆเบฐเบฅเบถเบš.
    • เบ–เป‰เบฒเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบกเบตเบ„เบงเบฒเบกเป€เบžเบดเปˆเบ‡เบžเบฒเบญเบฒเป„เบชเบฅเบฐเบซเบงเปˆเบฒเบ‡เบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡, เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ—เปเบฒเบ„เบงเบฒเบกเบชเบฐเบญเบฒเบ”เบ‚เปเป‰เบกเบนเบ™เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเปเบฅเปˆเบ™เบเบฒเบเป€เบ›เบฑเบ™เบญเบฒเบเบฒเบ™เป€เบˆเบฑเบšเบซเบปเบง.
    • เป€เบžเบตเปˆเบกเป€เบ•เบตเบก (เปเบฅเบฐ, เปƒเบ™เบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™เบ‚เบญเบ‡เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒ, เบšเปเปˆเบชเบปเบกเป€เบซเบ”เบชเบปเบกเบœเบปเบ™) เป‚เบ—เบซเบฒ API.
    • เปเบฅเบฐเบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡เบ•เบปเป‰เบ™เบ•เป: เป€เบกเบทเปˆเบญเบ‚เปเป‰เบกเบนเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเป€เบฅเบตเปˆเบกเบ–เบทเบเบฅเบถเบšเบฅเป‰เบฒเบ‡เป‚เบ”เบเบเบปเบ‡เบˆเบฒเบเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™. เบญเบฑเบ™เบ™เบตเป‰เบเบณเบฅเบฑเบ‡เบ›เปˆเบฝเบ™เป€เบ›เบฑเบ™เบงเบปเบ‡เบงเบฝเบ™ PK/FK เปเบ—เป‰เป†! เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบเบดเบ™เบˆเบฒเบเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ: "เบ‚เป‰เบญเบเบซเบฒเบเปเปˆเป€เบžเบตเปˆเบก / เป€เบญเบปเบฒเบญเบญเบ / เบ›เปˆเบฝเบ™เบŠเบทเปˆเบ›เป‰เบฒเบ, เป€เบ›เบฑเบ™เบซเบเบฑเบ‡ 100500 เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡เบ–เบทเบเบˆเบฑเบš?"

    เปƒเบ™เบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบ, เบเบฒเบ™เปเบเป‰เป„เบ‚เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”เปเบกเปˆเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเปเบšเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบง.

  2. เบซเบผเบฒเบเบ„เบปเบ™เปƒเบŠเป‰ docker-compose เป€เบžเบทเปˆเบญเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบเบฒเบ™เบ—เบปเบ”เบชเบญเบš, เปเบ•เปˆเบกเบตเบˆเปเบฒเบ™เบงเบ™เบซเบ™เป‰เบญเบเบ„เบปเบ™เปƒเบŠเป‰ docker-compose เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡เปƒเบ™ CI / CD. เปเบฅเบฐเปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบšเปเปˆเป„เบ”เป‰เบ„เปเบฒเบ™เบถเบ‡เป€เบ–เบดเบ‡ kubernetes, swarm เปเบฅเบฐเป€เบงเบ—เบต orchestration เบšเบฑเบ™เบˆเบธเบญเบทเปˆเบ™เป†. เบšเปเปˆเปเบกเปˆเบ™เบ—เบธเบเป†เบšเปเบฅเบดเบชเบฑเบ”เบกเบตเบžเบงเบเบกเบฑเบ™. เบกเบฑเบ™เบˆเบฐเบ”เบตเบ–เป‰เบฒ docker-compose.yml เปเบกเปˆเบ™เบ—เบปเปˆเบงเป„เบ›.
  3. เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบกเบตเบ•เบปเบงเปเบฅเปˆเบ™ QA เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบญเบ‡, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เปเบ™เบงเปƒเบ”เปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ—เบตเปˆเป€เบ›เบตเบ”เบ•เบปเบงเบœเปˆเบฒเบ™ docker-compose เบšเปเปˆเปเบŠเบเปเบŠเบ‡เป€เบŠเบดเปˆเบ‡เบเบฑเบ™เปเบฅเบฐเบเบฑเบ™?
  4. เบงเบดเบ—เบตเบเบฒเบ™เป€เบเบฑเบšเบเปเบฒเบ‚เปเป‰เบกเบนเบ™เบšเบฑเบ™เบ—เบถเบเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ—เบปเบ”เบชเบญเบš?
  5. เบงเบดเบ—เบตเบเบฒเบ™เป€เบฎเบฑเบ”เบ„เบงเบฒเบกเบชเบฐเบญเบฒเบ”เบ™เบฑเบเปเบฅเปˆเบ™?

เบ‚เป‰เบญเบเบกเบตเบ™เบฑเบเปเบฅเปˆเบ™ GitLab เบ‚เบญเบ‡เบ‚เป‰เบญเบเป€เบญเบ‡เบชเปเบฒเบฅเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบเปเบฅเบฐเบ‚เป‰เบญเบเป„เบ”เป‰เบžเบปเบšเบเบฑเบšเบ„เปเบฒเบ–เบฒเบกเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ เบฅเบนเบเบ„เป‰เบฒ Java เบเบฒเบ™ TestRail. เบซเบผเบฒเบเบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™, เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเปเบฅเปˆเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡. เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เป‚เบ”เบเปƒเบŠเป‰เบ•เบปเบงเบขเปˆเบฒเบ‡เบˆเบฒเบเป‚เบ„เบ‡เบเบฒเบ™เบ™เบตเป‰.

เป€เบ–เบดเบ‡เป€เบ™เบทเป‰เบญเปƒเบ™

GitLab Shell Runner

เบชเปเบฒเบฅเบฑเบšเบ™เบฑเบเปเบฅเปˆเบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ‚เปเปเบ™เบฐเบ™เปเบฒเป€เบ„เบทเปˆเบญเบ‡ virtual Linux เบ—เบตเปˆเบกเบต 4 vCPU, 4 GB RAM, 50 GB HDD.
เบกเบตเบ‚เปเป‰เบกเบนเบ™เบซเบผเบฒเบเบขเปˆเบฒเบ‡เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ gitlab-runner เปƒเบ™เบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ”, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เป‚เบ”เบเบซเบเปเป‰:

  • เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเป€เบ„เบทเปˆเบญเบ‡เบœเปˆเบฒเบ™ SSH
  • เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบกเบต RAM เบซเบ™เป‰เบญเบเบเบงเปˆเบฒ 8 GB, เบ‚เป‰เบญเบเบ‚เปเปเบ™เบฐเบ™เปเบฒ เป€เบฎเบฑเบ”เปƒเบซเป‰ swap 10 GBเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบœเบนเป‰เบ‚เป‰เบฒ OOM เบšเปเปˆเป„เบ”เป‰เบกเบฒเปเบฅเบฐเบ‚เป‰เบฒเบงเบฝเบเบ‡เบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบ‚เบฒเบ” RAM. เบชเบดเปˆเบ‡เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป€เบเบตเบ”เบ‚เบถเป‰เบ™เป„เบ”เป‰เป€เบกเบทเปˆเบญเบกเบตเบซเบผเบฒเบเบเบงเปˆเบฒ 5 เบงเบฝเบเบ–เบทเบเป€เบ›เบตเบ”เบ•เบปเบงเบžเป‰เบญเบกเป†เบเบฑเบ™. เบงเบฝเบโ€‹เบ‡เบฒเบ™โ€‹เบˆเบฐโ€‹เบเป‰เบฒเบงโ€‹เป„เบ›โ€‹เปœเป‰เบฒโ€‹เบŠเป‰เบฒโ€‹เบเบงเปˆเบฒโ€‹เป€เบเบปเปˆเบฒ, โ€‹เปเบ•เปˆโ€‹เปเบฑเป‰เบ™โ€‹เบ—เปˆเบฝเบ‡.

    เบ•เบปเบงเบขเปˆเบฒเบ‡เบเบฑเบš killer OOM

    เบ–เป‰เบฒเป€เบˆเบปเป‰เบฒเป€เบซเบฑเบ™เปƒเบ™เบšเบฑเบ™เบ—เบถเบเปœเป‰เบฒเบงเบฝเบ bash: line 82: 26474 Killed, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบžเบฝเบ‡เปเบ•เปˆเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบเปˆเบฝเบงเบเบฑเบš runner เป„เบ”เป‰ 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, เป€เบฎเบฑเบ”เปƒเบซเป‰.
  • เป€เบžเบตเปˆเบกเบœเบนเป‰เปƒเบŠเป‰ 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

    เบ™เบตเป‰เบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ”เปเบฒเป€เบ™เบตเบ™เบงเบฝเบเบ‡เบฒเบ™เบ‚เบฐเบซเบ™เบฒเบ™เปƒเบ™เบซเบ™เบถเปˆเบ‡ runner. เบญเปˆเบฒเบ™โ€‹เบ•เบทเปˆเบก เบ—เบตเปˆเบ™เบตเป‰.
    เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบกเบตเป€เบ„เบทเปˆเบญเบ‡เบ—เบตเปˆเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบซเบผเบฒเบ, เบ•เบปเบงเบขเปˆเบฒเบ‡ 8 vCPU, 16 GB RAM, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ•เบปเบงเป€เบฅเบเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบ 2 เป€เบ—เบปเปˆเบฒ. เปเบ•เปˆเบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เบ‚เบถเป‰เบ™เบเบฑเบšเบชเบดเปˆเบ‡เบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™เบˆเบฐเป€เบ›เบตเบ”เบ•เบปเบงเปƒเบ™เบ™เบฑเบเปเบฅเปˆเบ™เบ™เบตเป‰เปเบฅเบฐเปƒเบ™เบ›เบฐเบฅเบดเบกเบฒเบ™เปƒเบ”.

เบกเบฑเบ™เบžเบฝเบ‡เบžเป.

เป€เบ–เบดเบ‡เป€เบ™เบทเป‰เบญเปƒเบ™

เบเบณเบฅเบฑเบ‡เบเบฐเบเบฝเบก docker-compose.yml

เบงเบฝเบเบ‡เบฒเบ™เบ•เบปเป‰เบ™เบ•เปเปเบกเปˆเบ™ docker-compose.yml เบ—เบปเปˆเบงเป„เบ›, เป€เบŠเบดเปˆเบ‡เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ / เบœเบนเป‰เบ—เบปเบ”เบชเบญเบšเบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เป„เบ”เป‰เบ—เบฑเบ‡เบžเบฒเบเปƒเบ™เปเบฅเบฐเปƒเบ™เบ—เปเปˆ CI.

เบเปˆเบญเบ™เบญเบทเปˆเบ™ เปเบปเบ”, เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เบŠเบทเปˆเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ—เบตเปˆเป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฑเบเบชเปเบฒเบฅเบฑเบš 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

เบเบฒเบ™เบเบงเบ”เบเบฒ

เป€เบฎเบฑเบ”เปƒเบซเป‰ 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

เป€เบฎเบฑเบ”เบšเบฑเบ™เบ—เบถเบ docker

$ 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

เป€เบ›เบฑเบ™เบœเบปเบ™เบกเบฒเบˆเบฒเบเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ”เบฑเปˆเบ‡เบเปˆเบฒเบง, เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบšเบฑเบ™เบ—เบถเบเปƒเบ™เบชเบดเปˆเบ‡เบ›เบญเบกเบˆเบฐเบกเบตเบšเบฑเบ™เบ—เบถเบเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เปเบฅเบฐเบเบฒเบ™เบ—เบปเบ”เบชเบญเบš. เป€เบŠเบดเปˆเบ‡เบชเบฐเบ”เบงเบเบซเบผเบฒเบเปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”. เปเบ•เปˆเบฅเบฐเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ‚เบฐเบซเบ™เบฒเบ™เบ‚เบฝเบ™เบšเบฑเบ™เบ—เบถเบเบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡, เปเบ•เปˆเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ.

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 เบเบฑเบ‡เบขเบนเปˆเปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐ เป€เบ›เบตเบ”

เปเบ•เปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เป€เบžเบตเปˆเบกเบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเบ‚เบญเบ‡เบงเบฝเบเบ‡เบฒเบ™เบ•เบฒเบกเบ•เบฒเบ•เบฐเบฅเบฒเบ‡, เปเบฅเบฐเบšเปเปˆเบกเบตเปƒเบœเบซเป‰เบฒเบกเบžเบงเบเป€เบฎเบปเบฒเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡.
เป„เบ›เบ—เบตเปˆเป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ -> CI / CD -> เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบงเบฝเบเบ‡เบฒเบ™ Clean runner

GitLab Shell Runner. เบเบฒเบ™เปเบ‚เปˆเบ‡เบ‚เบฑเบ™เป€เบ›เบตเบ”เบ•เบปเบงเบšเปเบฅเบดเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเป‚เบ”เบเปƒเบŠเป‰ Docker Compose

เบฅเบงเบก:

  • เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบ™เบฑเบเปเบฅเปˆเบ™เปเบเบฐเบซเบ™เบถเปˆเบ‡.
  • เบšเปเปˆเบกเบตเบ‚เปเป‰เบ‚เบฑเบ”เปเบเปˆเบ‡เบฅเบฐเบซเบงเปˆเบฒเบ‡เบงเบฝเบเบ‡เบฒเบ™ เปเบฅเบฐ เบชเบดเปˆเบ‡เปเบงเบ”เบฅเป‰เบญเบก.
  • เบžเบงเบเป€เบฎเบปเบฒเบ”เปเบฒเป€เบ™เบตเบ™เบงเบฝเบเบ‡เบฒเบ™เบ—เบตเปˆเบกเบตเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡เปƒเบ™เบ‚เบฐเบซเบ™เบฒเบ™.
  • เบ—เปˆเบฒเบ™โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบ”เปเบฒโ€‹เป€เบ™เบตเบ™โ€‹เบเบฒเบ™โ€‹เบ—เบปเบ”โ€‹เบชเบญเบšโ€‹เบเบฒเบ™โ€‹เป€เบŠเบทเปˆเบญเบกโ€‹เป‚เบเบ‡โ€‹เบ—เบฑเบ‡โ€‹เปƒเบ™โ€‹เบ—เป‰เบญเบ‡โ€‹เบ–เบดเปˆเบ™โ€‹เบซเบผเบทโ€‹เปƒเบ™โ€‹เบžเบฒโ€‹เบŠเบฐโ€‹เบ™เบฐโ€‹.
  • เบšเบฑเบ™เบ—เบถเบเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เปเบฅเบฐเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ–เบทเบเป€เบเบฑเบšเบเปเบฒเปเบฅเบฐเบ•เบดเบ”เบเบฑเบšเบงเบฝเบเบ‡เบฒเบ™เบ—เปเปˆ.
  • เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เบ„เบงเบฒเบกเบชเบฐเบญเบฒเบ” runner เบˆเบฒเบเบฎเบนเบšเบžเบฒเบš Docker เป€เบเบปเปˆเบฒ.

เป€เบงเบฅเบฒเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเปเบกเปˆเบ™ ~2 เบŠเบปเปˆเบงเป‚เบกเบ‡.
เบ™เบฑเป‰เบ™เปเบกเปˆเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”, เบ•เบปเบงเบˆเบดเบ‡เปเบฅเป‰เบง. เบ‚เป‰เบญเบเบˆเบฐเบ”เบตเปƒเบˆเบ—เบตเปˆเบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ•เบดเบŠเบปเบก.

เป€เบ–เบดเบ‡เป€เบ™เบทเป‰เบญเปƒเบ™

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™