GitLab เดทเต†เตฝ เดฑเดฃเตเดฃเตผ. เดกเต‹เด•เตเด•เตผ เด•เดฎเตเดชเต‹เดธเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเดฐเต€เด•เตเดทเดฟเดšเตเดš เดธเต‡เดตเดจเด™เตเด™เดณเตเดŸเต† เดฎเดคเตเดธเดฐ เดธเดฎเดพเดฐเด‚เดญเด‚

GitLab เดทเต†เตฝ เดฑเดฃเตเดฃเตผ. เดกเต‹เด•เตเด•เตผ เด•เดฎเตเดชเต‹เดธเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเดฐเต€เด•เตเดทเดฟเดšเตเดš เดธเต‡เดตเดจเด™เตเด™เดณเตเดŸเต† เดฎเดคเตเดธเดฐ เดธเดฎเดพเดฐเด‚เดญเด‚

เดˆ เดฒเต‡เด–เดจเด‚ เดŸเต†เดธเตเดฑเตเดฑเตผเดฎเดพเตผเด•เตเด•เตเด‚ เดกเดตเดฒเดชเตเดชเตผเดฎเดพเตผเด•เตเด•เตเด‚ เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดฎเตเดณเตเดณเดคเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚, เดชเด•เตเดทเต‡ เด…เดŸเดฟเดธเตเดฅเดพเดจ เดธเต—เด•เดฐเตเดฏเด™เตเด™เดณเตเดŸเต† เด…เดชเดฐเตเดฏเดพเดชเตเดคเดค เด•เต‚เดŸเดพเดคเต†/เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด’เดฐเต เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเดฟเดจเตเดฑเต† เด…เดญเดพเดตเดคเตเดคเดฟเตฝ เด‡เดจเตเดฑเด—เตเดฐเต‡เดทเตป เดŸเต†เดธเตเดฑเตเดฑเดฟเด‚เด—เดฟเดจเดพเดฏเดฟ GitLab CI/CD เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเตฝ เดชเตเดฐเดถเตเดจเด‚ เดจเต‡เดฐเดฟเดŸเตเดจเตเดจ เด“เดŸเตเดŸเต‹เดฎเต‡เดทเตป เดธเตเดชเต†เดทเตเดฏเดฒเดฟเดธเตเดฑเตเดฑเตเด•เดณเต† เด‰เดฆเตเดฆเต‡เดถเดฟเดšเตเดšเตเดณเตเดณเดคเดพเดฃเต. เด“เตผเด•เตเด•เดธเตเดŸเตเดฐเต‡เดทเตป เดชเตเดฒเดพเดฑเตเดฑเตเดซเต‹เด‚. เด’เดฐเตŠเดฑเตเดฑ GitLab เดทเต†เตฝ เดฑเดฃเตเดฃเดฑเดฟเตฝ เดกเต‹เด•เตเด•เตผ เด•เดฎเตเดชเต‹เดธเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดŸเต†เดธเตเดฑเตเดฑเต เดŽเตปเดตเดฏเต‹เตบเดฎเต†เดจเตเดฑเตเด•เดณเตเดŸเต† เดตเดฟเดจเตเดฏเดพเดธเด‚ เดŽเด™เตเด™เดจเต† เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เดพเดฎเต†เดจเตเดจเต เดžเดพเตป เดจเดฟเด™เตเด™เดณเต‹เดŸเต เดชเดฑเดฏเตเด‚, เด…เด™เตเด™เดจเต† เดจเดฟเดฐเดตเดงเดฟ เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเด•เตพ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, เดธเดฎเดพเดฐเด‚เดญเดฟเดšเตเดš เดธเต‡เดตเดจเด™เตเด™เตพ เดชเดฐเดธเตเดชเดฐเด‚ เด‡เดŸเดชเต†เดŸเตเดจเตเดจเดฟเดฒเตเดฒ.


เด‰เดณเตเดณเดŸเด•เตเด•เด‚

เดชเดถเตเดšเดพเดคเตเดคเดฒเด‚

  1. เดŽเดจเตเดฑเต† เดชเตเดฐเดฏเต‹เด—เดคเตเดคเดฟเตฝ, เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเตเด•เดณเดฟเตฝ เด‡เดจเตเดฑเด—เตเดฐเต‡เดทเตป เดŸเต†เดธเตเดฑเตเดฑเดฟเด‚เด—เต "เดšเดฟเด•เดฟเดคเตเดธ" เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต เดชเดฒเดชเตเดชเต‹เดดเตเด‚ เดธเด‚เดญเดตเดฟเดšเตเดšเต. เดชเดฒเดชเตเดชเต‹เดดเตเด‚ เด†เดฆเตเดฏเดคเตเดคเต‡เดคเตเด‚ เดเดฑเตเดฑเดตเตเด‚ เดชเตเดฐเดงเดพเดจเดชเตเดชเต†เดŸเตเดŸเดคเตเดฎเดพเดฏ เดชเตเดฐเดถเตเดจเด‚ เดธเดฟเด เดชเตˆเดชเตเดชเตโ€Œเดฒเตˆเดจเดพเดฃเต, เด…เดคเดฟเตฝ เดธเด‚เดฏเต‹เดœเดจ เดชเดฐเดฟเดถเต‹เดงเดจเดฏเดพเดฃเต เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต เด’เดฐเต dev/stage เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเดฏเดฟเดฒเดพเดฃเต เดธเต‡เดตเดจเด‚(เด•เตพ) เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเต. เด‡เดคเต เด•เตเดฑเดšเตเดšเต เดชเตเดฐเดถเตเดจเด™เตเด™เตพ เดธเตƒเดทเตเดŸเดฟเดšเตเดšเต:

    • เด‡เดจเตเดฑเด—เตเดฐเต‡เดทเตป เดŸเต†เดธเตเดฑเตเดฑเดฟเด‚เด—เต เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเดฟเตฝ เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดธเต‡เดตเดจเดคเตเดคเดฟเดฒเต† เดคเด•เดฐเดพเดฑเตเด•เตพ เด•เดพเดฐเดฃเด‚, เดคเด•เตผเดจเตเดจ เดกเดพเดฑเตเดฑเดฏเดพเตฝ เดŸเต†เดธเตเดฑเตเดฑเต เดธเตผเด•เตเดฏเต‚เดŸเตเดŸเต เด•เต‡เดŸเดพเดฏเต‡เด•เตเด•เดพเด‚. เดคเด•เตผเดจเตเดจ JSON เดซเต‹เตผเดฎเดพเดฑเตเดฑเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เด…เดญเตเดฏเตผเดคเตเดฅเดจ เด…เดฏเดฏเตโ€Œเด•เตเด•เตเดฎเตเดชเต‹เตพ เดธเต‡เดตเดจเด‚ เดคเด•เดฐเดพเดฑเดฟเดฒเดพเดฏ เดธเดพเดนเดšเดฐเตเดฏเด™เตเด™เดณเตเดฃเตเดŸเต, เด‡เดคเต เดธเตเดฑเตเดฑเดพเตปเดกเต เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเด•เตเด•เดฟ.
    • เดŸเต†เดธเตเดฑเตเดฑเต เดกเดพเดฑเตเดฑ เดตเตผเดฆเตเดงเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดจเตเดธเดฐเดฟเดšเตเดšเต เดŸเต†เดธเตเดฑเตเดฑเต เดธเตผเด•เตเดฏเต‚เดŸเตเดŸเดฟเดจเตเดฑเต† เดตเต‡เด—เดค เด•เตเดฑเดฏเตเดจเตเดจเต. เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เด•เตเดฒเต€เดจเดฟเด‚เด—เต/เดฑเต‹เตพ เดฌเดพเด•เตเด•เต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเด‚ เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเตฝ เด…เตผเดคเตเดฅเดฎเดฟเดฒเตเดฒเต†เดจเตเดจเต เดžเดพเตป เด•เดฐเตเดคเตเดจเตเดจเต. เดŽเดจเตเดฑเต† เดชเดฐเดฟเดถเต€เดฒเดจเดคเตเดคเดฟเตฝ, เดˆ เดจเดŸเดชเดŸเดฟเด•เตเดฐเดฎเด‚ เดธเตเด—เดฎเดฎเดพเดฏเดฟ เดจเดŸเดจเตเดจ เด’เดฐเต เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดžเดพเตป เดจเต‡เดฐเดฟเดŸเตเดŸเดฟเดŸเตเดŸเดฟเดฒเตเดฒ.
    • เดชเตŠเดคเตเดตเดพเดฏ เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เดŸเต†เดธเตเดฑเตเดฑเต เดธเตผเด•เตเดฏเต‚เดŸเตเดŸเดฟเดจเตเดฑเต† เดชเตเดฐเดตเตผเดคเตเดคเดจเดคเตเดคเต† เดคเดŸเดธเตเดธเดชเตเดชเต†เดŸเตเดคเตเดคเดพเดจเตเดณเตเดณ เดธเดพเดงเตเดฏเดค. เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเต/เด—เตเดฐเต‚เดชเตเดชเต/เดชเดพเดธเตโ€Œเดตเต‡เดกเต/เด…เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดจเดฏเด‚.
    • เดธเตเดตเดฏเดฎเต‡เดตเดฏเตเดณเตเดณ เดŸเต†เดธเตเดฑเตเดฑเตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดŸเต†เดธเตเดฑเตเดฑเต เดกเดพเดฑเตเดฑ เดฎเดพเดจเตเดตเตฝ เดŸเต†เดธเตเดฑเตเดฑเตผเดฎเดพเตผเด•เตเด•เต เดœเต€เดตเดฟเดคเด‚ เดฌเตเดฆเตเดงเดฟเดฎเตเดŸเตเดŸเดพเด•เตเด•เตเดจเตเดจเต.

    เดจเดฒเตเดฒ เด“เดŸเตเดŸเต‹เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพเด•เตเด•เต เดถเต‡เดทเด‚ เดกเดพเดฑเตเดฑ เดตเตƒเดคเตเดคเดฟเดฏเดพเด•เตเด•เดฃเดฎเต†เดจเตเดจเต เดšเดฟเดฒเตผ เดชเดฑเดฏเตเด‚. เดŽเดจเดฟเด•เตเด•เต เดŽเดคเดฟเดฐเดพเดฏเดฟ เดตเดพเดฆเด™เตเด™เดณเตเดฃเตเดŸเต:

    • เดกเตˆเดจเดพเดฎเดฟเด•เต เดธเตเดฑเตเดฑเดพเตปเดกเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เดตเดณเดฐเต† เดธเต—เด•เดฐเตเดฏเดชเตเดฐเดฆเดฎเดพเดฃเต.
    • API เดตเดดเดฟ เดŽเดฒเตเดฒเดพ เด’เดฌเตเดœเด•เตเดฑเตเดฑเตเด‚ เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดจเต€เด•เตเด•เด‚ เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ. เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เด’เดฐเต เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเต เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เดพเดจเตเดณเตเดณ เด’เดฐเต เด•เต‹เตพ เด…เดคเต เดฌเดฟเดธเดฟเดจเดธเตเดธเต เดฒเต‹เดœเดฟเด•เตเด•เดฟเดจเต เดตเดฟเดฐเตเดฆเตเดงเดฎเดพเดฏเดคเดฟเดจเดพเตฝ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดฟเดฏเดฟเดฒเตเดฒ.
    • API เดตเดดเดฟ เด’เดฐเต เด’เดฌเตโ€Œเดœเด•เตโ€Œเดฑเตเดฑเต เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, เด’เดฐเต เดตเดฒเดฟเดฏ เด…เดณเดตเดฟเดฒเตเดณเตเดณ เดฎเต†เดฑเตเดฑเดพเดกเดพเดฑเตเดฑ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚, เด…เดคเต เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเดจเตเดจเดคเต เดชเตเดฐเดถเตโ€Œเดจเด•เดฐเดฎเดพเดฃเต.
    • เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพเด•เตเด•เต เดชเดฐเดธเตเดชเดฐเด‚ เดกเดฟเดชเตปเดกเตปเดธเดฟเด•เตพ เด‰เดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดšเตเดšเดคเดฟเดจเต เดถเต‡เดทเด‚ เดกเดพเดฑเตเดฑ เดตเตƒเดคเตเดคเดฟเดฏเดพเด•เตเด•เตเดจเตเดจ เดชเตเดฐเด•เตเดฐเดฟเดฏ เด’เดฐเต เดคเดฒเดตเต‡เดฆเดจเดฏเดพเดฏเดฟ เดฎเดพเดฑเตเดจเตเดจเต.
    • API-เดฏเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เด…เดงเดฟเด• (เด•เต‚เดŸเดพเดคเต†, เดŽเดจเตเดฑเต† เด…เดญเดฟเดชเตเดฐเดพเดฏเดคเตเดคเดฟเตฝ, เดจเตเดฏเดพเดฏเต€เด•เดฐเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดจเตเดจเดฟเดฒเตเดฒ) เด•เต‹เดณเตเด•เตพ.
    • เดชเตเดฐเดงเดพเดจ เดตเดพเดฆเด‚: เดŸเต†เดธเตเดฑเตเดฑเต เดกเดพเดฑเตเดฑ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเตฝ เดจเดฟเดจเตเดจเต เดจเต‡เดฐเดฟเดŸเตเดŸเต เดฎเดพเดฏเตโ€Œเด•เตเด•เดพเตป เดคเตเดŸเด™เตเด™เตเดฎเตเดชเต‹เตพ. เด‡เดคเตŠเดฐเต เดฏเดฅเดพเตผเดคเตเดฅ PK/FK เดธเตผเด•เตเด•เดธเดพเดฏเดฟ เดฎเดพเดฑเตเด•เดฏเดพเดฃเต! เดกเต†เดตเดฒเดชเตเดชเตผเดฎเดพเดฐเดฟเตฝ เดจเดฟเดจเตเดจเต เดžเด™เตเด™เตพ เด•เต‡เตพเด•เตเด•เตเดจเตเดจเต: "เดžเดพเตป เด’เดฐเต เดšเดฟเดนเตเดจเด‚ เดšเต‡เตผเดคเตเดคเต/เดจเต€เด•เตเด•เด‚ เดšเต†เดฏเตเดคเต/เดชเต‡เดฐเตเดฎเดพเดฑเตเดฑเดฟ, เดŽเดจเตเดคเตเด•เตŠเดฃเตเดŸเดพเดฃเต 100500 เด‡เดจเตเดฑเด—เตเดฐเต‡เดทเตป เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เดชเดฟเดŸเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดŸเดคเต?"

    เดŽเดจเตเดฑเต† เด…เดญเดฟเดชเตเดฐเดพเดฏเดคเตเดคเดฟเตฝ, เดเดฑเตเดฑเดตเตเด‚ เด’เดชเตเดฑเตเดฑเดฟเดฎเตฝ เดชเดฐเดฟเดนเดพเดฐเด‚ เด’เดฐเต เดšเดฒเดจเดพเดคเตเดฎเด• เด…เดจเตเดคเดฐเต€เด•เตเดทเดฎเดพเดฃเต.

  2. เด’เดฐเต เดŸเต†เดธเตเดฑเตเดฑเต เดŽเตปเดตเดฏเต‹เตบเดฎเต†เดจเตเดฑเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เดชเดฒเดฐเตเด‚ เดกเต‹เด•เตเด•เตผ-เด•เดฎเตเดชเต‹เดธเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต, เดŽเดจเตเดจเดพเตฝ เดธเดฟเด/เดธเดฟเดกเดฟเดฏเดฟเตฝ เด‡เดจเตเดฑเด—เตเดฐเต‡เดทเตป เดŸเต†เดธเตเดฑเตเดฑเดฟเด‚เด—เต เดจเดŸเดคเตเดคเตเดฎเตเดชเต‹เตพ เด•เตเดฑเดšเตเดšเต เด†เดณเตเด•เตพ เดกเต‹เด•เตเด•เตผ-เด•เดฎเตเดชเต‹เดธเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต. เด‡เดตเดฟเดŸเต† เดžเดพเตป kubernetes, swarm, เดฎเดฑเตเดฑเต เด•เดฃเตเดŸเต†เดฏเตเดจเตผ เด“เตผเด•เตเด•เดธเตเดŸเตเดฐเต‡เดทเตป เดชเตเดฒเดพเดฑเตเดฑเตเดซเต‹เดฎเตเด•เตพ เดŽเดจเตเดจเดฟเดต เด•เดฃเด•เตเด•เดฟเดฒเต†เดŸเตเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ. เดŽเดฒเตเดฒเดพ เด•เดฎเตเดชเดจเดฟเด•เตพเด•เตเด•เตเด‚ เด…เดต เด‡เดฒเตเดฒ. docker-compose.yml เดธเดพเตผเดตเดคเตเดฐเดฟเด•เดฎเดพเดฃเต†เด™เตเด•เดฟเตฝ เด…เดคเต เดจเดจเตเดจเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚.
  3. เดžเด™เตเด™เตพเด•เตเด•เต เดธเตเดตเดจเตเดคเดฎเดพเดฏเดฟ QA เดฑเดฃเตเดฃเตผ เด‰เดฃเตเดŸเต†เด™เตเด•เดฟเตฝเดชเตเดชเต‹เดฒเตเด‚, เดกเต‹เด•เตเด•เตผ-เด•เดฎเตเดชเต‹เดธเต เดตเดดเดฟ เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจ เดธเต‡เดตเดจเด™เตเด™เตพ เดชเดฐเดธเตเดชเดฐเด‚ เด‡เดŸเดชเต†เดŸเตเดจเตเดจเดฟเดฒเตเดฒเต†เดจเตเดจเต เดŽเด™เตเด™เดจเต† เด‰เดฑเดชเตเดชเดพเด•เตเด•เดพเดจเดพเด•เตเด‚?
  4. เดชเดฐเต€เด•เตเดทเดฟเดšเตเดš เดธเต‡เดตเดจเด™เตเด™เดณเตเดŸเต† เดฒเต‹เด—เตเด•เตพ เดŽเด™เตเด™เดจเต† เดถเต‡เด–เดฐเดฟเด•เตเด•เดพเด‚?
  5. เด“เดŸเตเดŸเด•เตเด•เดพเดฐเดจเต† เดŽเด™เตเด™เดจเต† เดตเตƒเดคเตเดคเดฟเดฏเดพเด•เตเด•เดพเด‚?

เดŽเดจเตเดฑเต† เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเตเด•เตพเด•เตเด•เดพเดฏเดฟ เดŽเดจเดฟเด•เตเด•เต เดธเตเดตเดจเตเดคเดฎเดพเดฏเดฟ GitLab เดฑเดฃเตเดฃเตผ เด‰เดฃเตเดŸเต, เดตเดฟเด•เดธเดจ เดธเดฎเดฏเดคเตเดคเต เดžเดพเตป เดˆ เดšเต‹เดฆเตเดฏเด™เตเด™เตพ เดจเต‡เดฐเดฟเดŸเตเดŸเต เดœเดพเดต เด•เตเดฒเดฏเดจเตเดฑเต เดตเต‡เดฃเตเดŸเดฟ เดŸเต†เดธเตเดฑเตเดฑเต เดฑเต†เดฏเดฟเตฝ. เด•เต‚เดŸเตเดคเตฝ เด•เตƒเดคเตเดฏเดฎเดพเดฏเดฟ เดชเดฑเดžเตเดžเดพเตฝ, เด‡เดจเตเดฑเด—เตเดฐเต‡เดทเตป เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เดจเดŸเดคเตเดคเตเดฎเตเดชเต‹เตพ. เดˆ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดžเด™เตเด™เตพ เดˆ เดชเตเดฐเดถเตเดจเด™เตเด™เตพ เดšเตเดตเดŸเต† เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เตเด‚.

เด‰เดณเตเดณเดŸเด•เตเด•เดคเตเดคเดฟเดฒเต‡เด•เตเด•เต

GitLab เดทเต†เตฝ เดฑเดฃเตเดฃเตผ

เด’เดฐเต เด“เดŸเตเดŸเด•เตเด•เดพเดฐเดจเต, 4 vCPU, 4 GB RAM, 50 GB HDD เดŽเดจเตเดจเดฟเดตเดฏเตเดณเตเดณ เด’เดฐเต Linux เดตเต†เตผเดšเตเดตเตฝ เดฎเต†เดทเต€เตป เดžเดพเตป เดถเตเดชเดพเตผเดถ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.
เด‡เตปเดฑเตผเดจเต†เดฑเตเดฑเดฟเตฝ เด—เดฟเดฑเตเดฑเตเดฒเดพเดฌเต-เดฑเดฃเตเดฃเตผ เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดงเดพเดฐเดพเดณเด‚ เดตเดฟเดตเดฐเด™เตเด™เตพ เด‰เดฃเตเดŸเต, เดšเตเดฐเตเด•เตเด•เดคเตเดคเดฟเตฝ:

  • SSH เดตเดดเดฟ เดฎเต†เดทเต€เดจเดฟเดฒเต‡เด•เตเด•เต เดฒเต‹เด—เดฟเตป เดšเต†เดฏเตเดฏเตเด•
  • เดจเดฟเด™เตเด™เตพเด•เตเด•เต 8 เดœเดฟเดฌเดฟ เดฑเดพเดฎเดฟเตฝ เด•เตเดฑเดตเตเดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, เดžเดพเตป เดถเตเดชเดพเตผเดถ เดšเต†เดฏเตเดฏเตเดจเตเดจเต 10 GB เดธเตเดตเดพเดชเตเดชเต เดšเต†เดฏเตเดฏเตเด•เดฑเดพเดฎเดฟเดจเตเดฑเต† เด…เดญเดพเดตเด‚ เด•เดพเดฐเดฃเด‚ 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 vCPU, 16 GB เดฑเดพเด‚, เดˆ เดจเดฎเตเดชเดฑเตเด•เตพ เด•เตเดฑเดžเตเดžเดคเต 2 เดฎเดŸเด™เตเด™เต เดตเดฒเตเดคเดพเด•เตเด•เดพเด‚. เดŽเดจเตเดจเดพเตฝ เด‡เดคเต†เดฒเตเดฒเดพเด‚ เดˆ เดฑเดฃเตเดฃเดฑเดฟเตฝ เด•เตƒเดคเตเดฏเดฎเดพเดฏเดฟ เดŽเดจเตเดคเต เดตเดฟเด•เตเดทเต‡เดชเดฟเด•เตเด•เตเด‚ เดŽเดจเตเดจเดคเดฟเดจเต† เด†เดถเตเดฐเดฏเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต, เดเดคเต เด…เดณเดตเดฟเดฒเดพเดฃเต.

เด…เดคเต เดฎเดคเดฟ.

เด‰เดณเตเดณเดŸเด•เตเด•เดคเตเดคเดฟเดฒเต‡เด•เตเด•เต

docker-compose.yml เดคเดฏเตเดฏเดพเดฑเดพเด•เตเด•เตเดจเตเดจเต

เดกเต†เดตเดฒเดชเตเดชเตผเดฎเดพเตผเด•เตเด•เตเด‚/เดŸเต†เดธเตเดฑเตเดฑเตผเดฎเดพเตผเด•เตเด•เตเด‚ เดชเตเดฐเดพเดฆเต‡เดถเดฟเด•เดฎเดพเดฏเตเด‚ CI เดชเตˆเดชเตเดชเตเดฒเตˆเดจเดฟเดฒเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเดจเตเดจ เด’เดฐเต เดธเดพเตผเดตเดคเตเดฐเดฟเด• เดกเต‹เด•เตเด•เตผ-compose.yml เด†เดฃเต เดชเตเดฐเดงเดพเดจ เดšเตเดฎเดคเดฒ.

เด’เดจเตเดจเดพเดฎเดคเดพเดฏเดฟ, เดžเด™เตเด™เตพ 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}

เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ, เด‡เดคเต เดตเดฟเดœเดฏเดคเตเดคเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เด†เดฆเตเดฏเดชเดŸเดฟเดฏเดพเดฃเต =)

เด…เดญเดฟเดชเตเดฐเดพเดฏเด™เตเด™เดณเตเดณเตเดณ เดŽเดจเตเดฑเต† เดกเต‹เด•เตเด•เตผ-เด•เดฎเตเดชเต‹เดธเต.เดเดŽเด‚เดŽเตฝ เด‰เดฆเดพเดนเดฐเดฃเด‚

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 เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต, เด•เดพเดฐเดฃเด‚ เด‡เดคเต เดชเตเดฐเดพเดฆเต‡เดถเดฟเด• เดชเดฐเดฟเดธเตเดฅเดฟเดคเดฟ เดฎเดพเดจเต‡เดœเตเดฎเต†เดจเตเดฑเดฟเดจเตเด‚ 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 
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 เดทเต†เตฝ เดฑเดฃเตเดฃเตผ. เดกเต‹เด•เตเด•เตผ เด•เดฎเตเดชเต‹เดธเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเดฐเต€เด•เตเดทเดฟเดšเตเดš เดธเต‡เดตเดจเด™เตเด™เดณเตเดŸเต† เดฎเดคเตเดธเดฐ เดธเดฎเดพเดฐเด‚เดญเด‚

เด‰เดณเตเดณเดŸเด•เตเด•เดคเตเดคเดฟเดฒเต‡เด•เตเด•เต

.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 เดทเต†เตฝ เดฑเดฃเตเดฃเตผ. เดกเต‹เด•เตเด•เตผ เด•เดฎเตเดชเต‹เดธเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเดฐเต€เด•เตเดทเดฟเดšเตเดš เดธเต‡เดตเดจเด™เตเด™เดณเตเดŸเต† เดฎเดคเตเดธเดฐ เดธเดฎเดพเดฐเด‚เดญเด‚

เด‰เดณเตเดณเดŸเด•เตเด•เดคเตเดคเดฟเดฒเต‡เด•เตเด•เต

เด“เดŸเตเดŸเด•เตเด•เดพเดฐเดจเต† เดตเตƒเดคเตเดคเดฟเดฏเดพเด•เตเด•เตเดจเตเดจเต

เด’เดฐเต เดทเต†เดกเตเดฏเต‚เตพ เด…เดจเตเดธเดฐเดฟเดšเตเดšเต เดฎเดพเดคเตเดฐเดฎเต‡ เดŸเดพเดธเตเด•เต เด†เดฐเด‚เดญเดฟเด•เตเด•เตเด•เดฏเตเดณเตเดณเต‚.

stages:
- clean
- build
- test

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

เด…เดŸเตเดคเตเดคเดคเดพเดฏเดฟ, เดžเด™เตเด™เดณเตเดŸเต† GitLab เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต -> CI/CD -> เดทเต†เดกเตเดฏเต‚เดณเตเด•เตพ -> เดชเตเดคเดฟเดฏ เดทเต†เดกเตเดฏเต‚เตพ เดŽเดจเตเดจเดคเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เดฏเดฟ เด’เดฐเต เดชเตเดคเดฟเดฏ เดทเต†เดกเตเดฏเต‚เตพ เดšเต‡เตผเด•เตเด•เตเด•

GitLab เดทเต†เตฝ เดฑเดฃเตเดฃเตผ. เดกเต‹เด•เตเด•เตผ เด•เดฎเตเดชเต‹เดธเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเดฐเต€เด•เตเดทเดฟเดšเตเดš เดธเต‡เดตเดจเด™เตเด™เดณเตเดŸเต† เดฎเดคเตเดธเดฐ เดธเดฎเดพเดฐเด‚เดญเด‚

เด‰เดณเตเดณเดŸเด•เตเด•เดคเตเดคเดฟเดฒเต‡เด•เตเด•เต

เดซเดฒเด‚

GitLab CI-เตฝ 4 เดŸเดพเดธเตโ€Œเด•เตเด•เตเด•เตพ เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเต
GitLab เดทเต†เตฝ เดฑเดฃเตเดฃเตผ. เดกเต‹เด•เตเด•เตผ เด•เดฎเตเดชเต‹เดธเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเดฐเต€เด•เตเดทเดฟเดšเตเดš เดธเต‡เดตเดจเด™เตเด™เดณเตเดŸเต† เดฎเดคเตเดธเดฐ เดธเดฎเดพเดฐเด‚เดญเด‚

เด‡เดจเตเดฑเด—เตเดฐเต‡เดทเตป เดŸเต†เดธเตเดฑเตเดฑเตเด•เดณเตเดณเตเดณ เด…เดตเดธเดพเดจ เดŸเดพเดธเตเด•เตเด•เดฟเดจเตเดฑเต† เดฒเต‹เด—เตเด•เดณเดฟเตฝ เดตเตเดฏเดคเตเดฏเดธเตเดค เดŸเดพเดธเตเด•เตเด•เตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เด•เดฃเตเดŸเต†เดฏเตเดจเดฑเตเด•เตพ เดžเด™เตเด™เตพ เด•เดพเดฃเตเดจเตเดจเต

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 เดทเต†เตฝ เดฑเดฃเตเดฃเตผ. เดกเต‹เด•เตเด•เตผ เด•เดฎเตเดชเต‹เดธเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเดฐเต€เด•เตเดทเดฟเดšเตเดš เดธเต‡เดตเดจเด™เตเด™เดณเตเดŸเต† เดฎเดคเตเดธเดฐ เดธเดฎเดพเดฐเด‚เดญเด‚

GitLab เดทเต†เตฝ เดฑเดฃเตเดฃเตผ. เดกเต‹เด•เตเด•เตผ เด•เดฎเตเดชเต‹เดธเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเดฐเต€เด•เตเดทเดฟเดšเตเดš เดธเต‡เดตเดจเด™เตเด™เดณเตเดŸเต† เดฎเดคเตเดธเดฐ เดธเดฎเดพเดฐเด‚เดญเด‚

เดŽเดฒเตเดฒเดพเด‚ เดฎเดจเต‹เดนเดฐเดฎเดพเดฃเต†เดจเตเดจเต เดคเต‹เดจเตเดจเตเดจเตเดจเต, เดชเด•เตเดทเต‡ เด’เดฐเต เดจเตเดฏเต‚เดจเตปเดธเต เด‰เดฃเตเดŸเต. เด‡เดจเตเดฑเด—เตเดฐเต‡เดทเตป เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เดชเตˆเดชเตเดชเตเดฒเตˆเตป เดจเดฟเตผเดฌเดจเตเดงเดฟเดคเดฎเดพเดฏเดฟ เดฑเดฆเตเดฆเดพเด•เตเด•เดพเด‚, เดˆ เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจ เด•เดฃเตเดŸเต†เดฏเตเดจเดฑเตเด•เตพ เดจเดฟเตผเดคเตเดคเดฟเดฒเตเดฒ. เด•เดพเดฒเดพเด•เดพเดฒเด™เตเด™เดณเดฟเตฝ เดจเดฟเด™เตเด™เตพ เดฑเดฃเตเดฃเตผ เดตเตƒเดคเตเดคเดฟเดฏเดพเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เดจเดฟเตผเดญเดพเด—เตเดฏเดตเดถเดพเตฝ, GitLab CE เดฎเต†เดšเตเดšเดชเตเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดšเตเดฎเดคเดฒ เด‡เดชเตเดชเต‹เดดเตเด‚ เดจเดฟเดฒเดฏเดฟเดฒเดพเดฃเต เดคเตเดฑเด•เตเด•เตเด•

เดŽเดจเตเดจเดพเตฝ เดžเด™เตเด™เตพ เด’เดฐเต เดทเต†เดกเตเดฏเต‚เตพ เด…เดจเตเดธเดฐเดฟเดšเตเดšเต เด’เดฐเต เดŸเดพเดธเตโ€Œเด•เตเด•เดฟเดจเตเดฑเต† เดธเดฎเดพเดฐเด‚เดญเด‚ เดšเต‡เตผเดคเตเดคเต, เด…เดคเต เดธเตเดตเดฎเต‡เดงเดฏเดพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เด†เดฐเตเด‚ เดžเด™เตเด™เดณเต† เดตเดฟเดฒเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ.
เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต -> CI/CD -> เดทเต†เดกเตเดฏเต‚เดณเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เดฏเดฟ เดŸเดพเดธเตเด•เต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเด• Clean runner

GitLab เดทเต†เตฝ เดฑเดฃเตเดฃเตผ. เดกเต‹เด•เตเด•เตผ เด•เดฎเตเดชเต‹เดธเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเดฐเต€เด•เตเดทเดฟเดšเตเดš เดธเต‡เดตเดจเด™เตเด™เดณเตเดŸเต† เดฎเดคเตเดธเดฐ เดธเดฎเดพเดฐเด‚เดญเด‚

เด†เด•เต†:

  • เดžเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เดทเต†เตฝ เดฑเดฃเตเดฃเตผ เด‰เดฃเตเดŸเต.
  • เดœเต‹เดฒเดฟเด•เดณเตเด‚ เดชเดฐเดฟเดธเตเดฅเดฟเดคเดฟเดฏเตเด‚ เดคเดฎเตเดฎเดฟเตฝ เดตเตˆเดฐเตเดฆเตเดงเตเดฏเด™เตเด™เดณเดฟเดฒเตเดฒ.
  • เดžเด™เตเด™เตพ เดธเดฎเดพเดจเตเดคเดฐเดฎเดพเดฏเดฟ เด‡เดจเตเดฑเด—เตเดฐเต‡เดทเตป เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดŸเดพเดธเตโ€Œเด•เตเด•เตเด•เตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต.
  • เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดชเตเดฐเดพเดฆเต‡เดถเดฟเด•เดฎเดพเดฏเต‹ เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเดฟเดฒเต‹ เด‡เดจเตเดฑเด—เตเดฐเต‡เดทเตป เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เดจเดŸเดคเตเดคเดพเด‚.
  • เดธเตผเดตเต€เดธเต, เดŸเต†เดธเตเดฑเตเดฑเต เดฒเต‹เด—เตเด•เตพ เดถเต‡เด–เดฐเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดชเตˆเดชเตเดชเต เดฒเตˆเตป เดŸเดพเดธเตเด•เตเด•เดฟเตฝ เด˜เดŸเดฟเดชเตเดชเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.
  • เดชเดดเดฏ เดกเต‹เด•เตเด•เตผ เดšเดฟเดคเตเดฐเด™เตเด™เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดฑเดฃเตเดฃเดฑเต† เดตเตƒเดคเตเดคเดฟเดฏเดพเด•เตเด•เดพเตป เดธเดพเดงเดฟเด•เตเด•เตเด‚.

เดธเดœเตเดœเต€เด•เดฐเดฃ เดธเดฎเดฏเด‚ ~2 เดฎเดฃเดฟเด•เตเด•เต‚เดฑเดพเดฃเต.
เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ เด…เดคเตเดฐเดฎเดพเดคเตเดฐเด‚. เดซเต€เดกเตโ€Œเดฌเดพเด•เตเด•เต เดฒเดญเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเตฝ เดžเดพเตป เดธเดจเตเดคเตเดทเตเดŸเดจเดพเด•เตเด‚.

เด‰เดณเตเดณเดŸเด•เตเด•เดคเตเดคเดฟเดฒเต‡เด•เตเด•เต

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•