GitLab เจธเจผเฉˆเฉฑเจฒ เจฐเจจเจฐเฅค เจกเฉŒเจ•เจฐ เจ•เฉฐเจชเฉ‹เจœเจผ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจŸเฉˆเจธเจŸ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจธเฉ‡เจตเจพเจตเจพเจ‚ เจฆเฉ€ เจชเฉเจฐเจคเฉ€เจฏเฉ‹เจ—เฉ€ เจธเจผเฉเจฐเฉ‚เจ†เจค

GitLab เจธเจผเฉˆเฉฑเจฒ เจฐเจจเจฐเฅค เจกเฉŒเจ•เจฐ เจ•เฉฐเจชเฉ‹เจœเจผ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจŸเฉˆเจธเจŸ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจธเฉ‡เจตเจพเจตเจพเจ‚ เจฆเฉ€ เจชเฉเจฐเจคเฉ€เจฏเฉ‹เจ—เฉ€ เจธเจผเฉเจฐเฉ‚เจ†เจค

เจ‡เจน เจฒเฉ‡เจ– เจŸเฉˆเจธเจŸเจฐเจพเจ‚ เจ…เจคเฉ‡ เจกเจฟเจตเฉˆเจฒเจชเจฐเจพเจ‚ เจฆเฉ‹เจตเจพเจ‚ เจฒเจˆ เจฆเจฟเจฒเจšเจธเจชเฉ€ เจตเจพเจฒเจพ เจนเฉ‹เจตเฉ‡เจ—เจพ, เจชเจฐ เจ‡เจน เจฎเฉเฉฑเจ– เจคเฉŒเจฐ 'เจคเฉ‡ เจ†เจŸเฉ‹เจฎเฉ‡เจธเจผเจจ เจฎเจพเจนเจฟเจฐเจพเจ‚ เจฒเจˆ เจนเฉˆ เจœเฉ‹ เจจเจพเจ•เจพเจซเจผเฉ€ เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจขเจพเจ‚เจšเฉ‡ เจฆเฉ‡ เจธเจฐเฉ‹เจคเจพเจ‚ เจ…เจคเฉ‡/เจœเจพเจ‚ เจ•เฉฐเจŸเฉ‡เจจเจฐ เจ†เจฐเจ•เฉˆเจธเจŸเจฐเฉ‡เจธเจผเจจ เจฆเฉ€ เจ…เจฃเจนเฉ‹เจ‚เจฆ เจฆเฉ€เจ†เจ‚ เจธเจฅเจฟเจคเฉ€เจ†เจ‚ เจตเจฟเฉฑเจš เจเจ•เฉ€เจ•เจฐเจฃ เจŸเฉˆเจธเจŸเจฟเฉฐเจ— เจฒเจˆ GitLab CI/CD เจธเจฅเจพเจชเจค เจ•เจฐเจจ เจฆเฉ€ เจธเจฎเฉฑเจธเจฟเจ† เจฆเจพ เจธเจพเจนเจฎเจฃเจพ เจ•เจฐ เจฐเจนเฉ‡ เจนเจจเฅค เจชเจฒเฉ‡เจŸเจซเจพเจฐเจฎ. เจฎเฉˆเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฆเฉฑเจธเจพเจ‚เจ—เจพ เจ•เจฟ เจ‡เฉฑเจ• เจธเจฟเฉฐเจ—เจฒ GitLab เจธเจผเฉˆเฉฑเจฒ เจฐเจจเจฐ 'เจคเฉ‡ เจกเฉŒเจ•เจฐ เจ•เฉฐเจชเฉ‹เจœเจผ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจŸเฉˆเจธเจŸ เจตเจพเจคเจพเจตเจฐเจฃเจพเจ‚ เจฆเฉ€ เจคเฉˆเจจเจพเจคเฉ€ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจธเฉˆเฉฑเจŸ เจ•เจฐเจจเจพ เจนเฉˆ เจ…เจคเฉ‡ เจคเจพเจ‚ เจœเฉ‹ เจ•เจˆ เจตเจพเจคเจพเจตเจฐเจฃเจพเจ‚ เจจเฉ‚เฉฐ เจคเฉˆเจจเจพเจค เจ•เจฐเจฆเฉ‡ เจธเจฎเฉ‡เจ‚, เจฒเจพเจ‚เจš เจ•เฉ€เจคเฉ€เจ†เจ‚ เจธเฉ‡เจตเจพเจตเจพเจ‚ เจ‡เฉฑเจ• เจฆเฉ‚เจœเฉ‡ เจจเจพเจฒ เจฆเจ–เจฒ เจจเจพ เจฆเฉ‡เจฃเฅค


เจธเจฎเฉฑเจ—เจฐเฉ€

เจชเฉ‚เจฐเจ• เจฒเฉ‹เฉœเจพเจ‚

  1. เจฎเฉ‡เจฐเฉ‡ เจ…เจญเจฟเจ†เจธ เจตเจฟเฉฑเจš, เจ‡เจน เจ…เจ•เจธเจฐ เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจ•เจฟ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸเจพเจ‚ 'เจคเฉ‡ เจเจ•เฉ€เจ•เจฐเจฃ เจŸเฉˆเจธเจŸเจฟเฉฐเจ— เจฆเจพ "เจ‡เจฒเจพเจœ" เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจธเฉ€เฅค เจ…เจคเฉ‡ เจ…เจ•เจธเจฐ เจชเจนเจฟเจฒเฉ€ เจ…เจคเฉ‡ เจธเจญ เจคเฉ‹เจ‚ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจธเจฎเฉฑเจธเจฟเจ† เจธเฉ€เจ†เจˆ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจนเฉˆ, เจœเจฟเจธ เจตเจฟเฉฑเจš เจเจ•เฉ€เจ•เจฐเจฃ เจŸเฉˆเจธเจŸเจฟเฉฐเจ— เจตเจฟเจ•เจธเจค เจ•เฉ€เจคเจพ เจœเจพ เจฐเจฟเจนเจพ เจนเฉˆ เจธเฉ‡เจตเจพ (เจธเฉ‡เจตเจพเจตเจพเจ‚) เจจเฉ‚เฉฐ เจ‡เฉฑเจ• dev/เจธเจŸเฉ‡เจœ เจตเจพเจคเจพเจตเจฐเจจ เจตเจฟเฉฑเจš เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจ‡เจธ เจจเจพเจฒ เจฌเจนเฉเจค เจธเจพเจฐเฉ€เจ†เจ‚ เจธเจฎเฉฑเจธเจฟเจ†เจตเจพเจ‚ เจชเฉˆเจฆเจพ เจนเฉ‹เจˆเจ†เจ‚:

    • เจเจ•เฉ€เจ•เจฐเจฃ เจŸเฉˆเจธเจŸเจฟเฉฐเจ— เจฆเฉŒเจฐเจพเจจ เจ•เจฟเจธเฉ‡ เจ–เจพเจธ เจธเฉ‡เจตเจพ เจตเจฟเฉฑเจš เจจเฉเจ•เจธ เจฆเฉ‡ เจ•เจพเจฐเจจ, เจŸเฉเฉฑเจŸเฉ‡ เจนเฉ‹เจ เจกเฉ‡เจŸเจพ เจฆเฉเจ†เจฐเจพ เจŸเฉˆเจธเจŸ เจธเจฐเจ•เจŸ เจจเฉ‚เฉฐ เจจเฉเจ•เจธเจพเจจ เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจ…เจœเจฟเจนเฉ‡ เจ•เฉ‡เจธ เจธเจจ เจœเจฆเฉ‹เจ‚ เจ‡เฉฑเจ• เจŸเฉเฉฑเจŸเฉ‡ JSON เจซเจพเจฐเจฎเฉˆเจŸ เจจเจพเจฒ เจฌเฉ‡เจจเจคเฉ€ เจญเฉ‡เจœเจฃ เจจเจพเจฒ เจธเฉ‡เจตเจพ เจ•เฉเจฐเฉˆเจธเจผ เจนเฉ‹ เจ—เจˆ, เจœเจฟเจธ เจจเฉ‡ เจธเจŸเฉˆเจ‚เจก เจจเฉ‚เฉฐ เจชเฉ‚เจฐเฉ€ เจคเจฐเฉเจนเจพเจ‚ เจ…เจฏเฉ‹เจ— เจฌเจฃเจพ เจฆเจฟเฉฑเจคเจพเฅค
    • เจŸเฉˆเจธเจŸ เจธเจฐเจ•เจŸ เจฆเฉ€ เจธเฉเจธเจคเฉ€ เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจŸเฉˆเจธเจŸ เจกเฉ‡เจŸเจพ เจตเจงเจฆเจพ เจนเฉˆเฅค เจฎเฉˆเจจเฉ‚เฉฐ เจฒเจ—เจฆเจพ เจนเฉˆ เจ•เจฟ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจจเฉ‚เฉฐ เจธเจพเจซเจผ เจ•เจฐเจจ/เจฐเฉ‹เจฒ เจฌเฉˆเจ• เจ•เจฐเจจ เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจฃ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจจเจพ เจ•เฉ‹เจˆ เจ…เจฐเจฅ เจจเจนเฉ€เจ‚ เจฐเฉฑเจ–เจฆเจพ. เจฎเฉ‡เจฐเฉ‡ เจ…เจญเจฟเจ†เจธ เจตเจฟเฉฑเจš, เจฎเฉˆเจ‚ เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเจพ เจธเจพเจนเจฎเจฃเจพ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเจพ เจนเฉˆ เจœเจฟเฉฑเจฅเฉ‡ เจ‡เจน เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจธเฉเจšเจพเจฐเฉ‚ เจขเฉฐเจ— เจจเจพเจฒ เจšเจฒเฉ€ เจ—เจˆ เจธเฉ€.
    • เจ†เจฎ เจธเจฟเจธเจŸเจฎ เจธเฉˆเจŸเจฟเฉฐเจ—เจพเจ‚ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจฆเฉ‡ เจธเจฎเฉ‡เจ‚ เจŸเฉˆเจธเจŸ เจธเจฐเจ•เจŸ เจฆเฉ€ เจ•เจพเจฐเจœเจ•เฉเจธเจผเจฒเจคเจพ เจตเจฟเฉฑเจš เจตเจฟเจ˜เจจ เจชเจพเจ‰เจฃ เจฆเจพ เจœเฉ‹เจ–เจฎเฅค เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ‰เจชเจญเฉ‹เจ—เจคเจพ/เจธเจฎเฉ‚เจน/เจชเจพเจธเจตเจฐเจก/เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ€เจคเฉ€เฅค
    • เจธเจตเฉˆเจšเจฒเจฟเจค เจŸเฉˆเจธเจŸเจพเจ‚ เจคเฉ‹เจ‚ เจŸเฉˆเจธเจŸ เจกเฉ‡เจŸเจพ เจฎเฉˆเจจเฉ‚เจ…เจฒ เจŸเฉˆเจธเจŸเจฐเจพเจ‚ เจฒเจˆ เจœเฉ€เจตเจจ เจฎเฉเจธเจผเจ•เจฒ เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆเฅค

    เจ•เฉเจ เจ•เจนเจฟเจฃเจ—เฉ‡ เจ•เจฟ เจšเฉฐเจ—เฉ‡ เจ†เจŸเฉ‹เจŸเฉˆเจธเจŸเจพเจ‚ เจจเฉ‚เฉฐ เจ†เจชเจฃเฉ‡ เจ†เจช เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจกเฉ‡เจŸเจพ เจจเฉ‚เฉฐ เจธเจพเจซเจผ เจ•เจฐเจจเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ. เจฎเฉ‡เจฐเฉ‡ เจ•เฉ‹เจฒ เจ‡เจธ เจฆเฉ‡ เจตเจฟเจฐเฉเฉฑเจง เจฆเจฒเฉ€เจฒเจพเจ‚ เจนเจจ:

    • เจกเจพเจ‡เจจเจพเจฎเจฟเจ• เจธเจŸเฉˆเจ‚เจก เจตเจฐเจคเจฃ เจฒเจˆ เจฌเจนเฉเจค เจธเฉเจตเจฟเจงเจพเจœเจจเจ• เจนเจจเฅค
    • เจนเจฐเฉ‡เจ• เจตเจธเจคเฉ‚ เจจเฉ‚เฉฐ API เจฐเจพเจนเฉ€เจ‚ เจธเจฟเจธเจŸเจฎ เจคเฉ‹เจ‚ เจนเจŸเจพเจ‡เจ† เจจเจนเฉ€เจ‚ เจœเจพ เจธเจ•เจฆเจพเฅค เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ•เจฟเจธเฉ‡ เจตเจธเจคเฉ‚ เจจเฉ‚เฉฐ เจฎเจฟเจŸเจพเจ‰เจฃ เจฒเจˆ เจ‡เฉฑเจ• เจ•เจพเจฒ เจฒเจพเจ—เฉ‚ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ€ เจ—เจˆ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‡เจน เจตเจชเจพเจฐเจ• เจคเจฐเจ• เจฆเฉ‡ เจ‰เจฒเจŸ เจนเฉˆเฅค
    • API เจฆเฉเจ†เจฐเจพ เจ‡เฉฑเจ• เจ†เจฌเจœเฉˆเจ•เจŸ เจฌเจฃเจพเจ‰เจ‚เจฆเฉ‡ เจธเจฎเฉ‡เจ‚, เจฎเฉˆเจŸเจพเจกเฉ‡เจŸเจพ เจฆเฉ€ เจ‡เฉฑเจ• เจตเฉฑเจกเฉ€ เจฎเจพเจคเจฐเจพ เจฌเจฃเจพเจˆ เจœเจพ เจธเจ•เจฆเฉ€ เจนเฉˆ, เจœเจฟเจธ เจจเฉ‚เฉฐ เจฎเจฟเจŸเจพเจ‰เจฃเจพ เจฎเฉเจธเจผเจ•เจฒ เจนเฉˆ.
    • เจœเฉ‡เจ•เจฐ เจŸเฉˆเจธเจŸเจพเจ‚ เจตเจฟเฉฑเจš เจ†เจชเจธ เจตเจฟเฉฑเจš เจจเจฟเจฐเจญเจฐเจคเจพ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ, เจคเจพเจ‚ เจŸเฉˆเจธเจŸเจพเจ‚ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจกเจพเจŸเจพ เจธเจพเจซเจผ เจ•เจฐเจจ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจธเจฟเจฐเจฆเจฐเจฆ เจตเจฟเฉฑเจš เจฌเจฆเจฒ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค
    • API เจจเฉ‚เฉฐ เจตเจงเฉ€เจ• (เจ…เจคเฉ‡, เจฎเฉ‡เจฐเฉ€ เจฐเจพเจ เจตเจฟเฉฑเจš, เจœเจพเจ‡เจœเจผ เจจเจนเฉ€เจ‚) เจ•เจพเจฒเจพเจ‚.
    • เจ…เจคเฉ‡ เจฎเฉเฉฑเจ– เจฆเจฒเฉ€เจฒ: เจœเจฆเฉ‹เจ‚ เจŸเฉˆเจธเจŸ เจกเฉ‡เจŸเจพ เจจเฉ‚เฉฐ เจธเจฟเฉฑเจงเฉ‡ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจคเฉ‹เจ‚ เจธเจพเจซเจผ เจ•เจฐเจจเจพ เจธเจผเฉเจฐเฉ‚ เจนเฉเฉฐเจฆเจพ เจนเฉˆ. เจ‡เจน เจ‡เฉฑเจ• เจ…เจธเจฒเฉ€ PK/FK เจธเจฐเจ•เจธ เจตเจฟเฉฑเจš เจฌเจฆเจฒ เจฐเจฟเจนเจพ เจนเฉˆ! เจ…เจธเฉ€เจ‚ เจกเจฟเจตเฉˆเจฒเจชเจฐเจพเจ‚ เจคเฉ‹เจ‚ เจธเฉเจฃเจฆเฉ‡ เจนเจพเจ‚: "เจฎเฉˆเจ‚ เจนเฉเจฃเฉ‡ เจ‡เฉฑเจ• เจšเจฟเฉฐเจจเฉเจน เจœเฉ‹เฉœเจฟเจ†/เจนเจŸเจพ เจฆเจฟเฉฑเจคเจพ/เจฌเจฆเจฒเจฟเจ† เจนเฉˆ, 100500 เจเจ•เฉ€เจ•เจฐเจฃ เจŸเฉˆเจธเจŸ เจ•เจฟเจ‰เจ‚ เจซเฉœเฉ‡ เจ—เจ?"

    เจฎเฉ‡เจฐเฉ€ เจฐเจพเจ เจตเจฟเฉฑเจš, เจธเจญ เจคเฉ‹เจ‚ เจ…เจจเฉเจ•เฉ‚เจฒ เจนเฉฑเจฒ เจ‡เฉฑเจ• เจ—เจคเฉ€เจธเจผเฉ€เจฒ เจตเจพเจคเจพเจตเจฐเจฃ เจนเฉˆ.

  2. เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจฒเฉ‹เจ• เจ‡เฉฑเจ• เจŸเฉˆเจธเจŸ เจตเจพเจคเจพเจตเจฐเจฃ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจฒเจˆ เจกเฉŒเจ•เจฐ-เจ•เฉฐเจชเฉ‹เจœเจผ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจจ, เจชเจฐ เจ•เฉเจ เจฒเฉ‹เจ• CI/CD เจตเจฟเฉฑเจš เจเจ•เฉ€เจ•เจฐเจฃ เจŸเฉˆเจธเจŸเจฟเฉฐเจ— เจ•เจฐเจฆเฉ‡ เจธเจฎเฉ‡เจ‚ เจกเฉŒเจ•เจฐ-เจ•เฉฐเจชเฉ‹เจœเจผ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจจเฅค เจ…เจคเฉ‡ เจ‡เฉฑเจฅเฉ‡ เจฎเฉˆเจ‚ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ, เจเฉเฉฐเจก เจ…เจคเฉ‡ เจนเฉ‹เจฐ เจ•เฉฐเจŸเฉ‡เจจเจฐ เจ†เจฐเจ•เฉˆเจธเจŸเฉเจฐเฉ‡เจธเจผเจจ เจชเจฒเฉ‡เจŸเจซเจพเจฐเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจงเจฟเจ†เจจ เจตเจฟเฉฑเจš เจจเจนเฉ€เจ‚ เจฐเฉฑเจ– เจฐเจฟเจนเจพ เจนเจพเจ‚เฅค เจนเจฐ เจ•เฉฐเจชเจจเฉ€ เจ•เฉ‹เจฒ เจ‰เจน เจจเจนเฉ€เจ‚ เจนเจจเฅค เจ‡เจน เจšเฉฐเจ—เจพ เจนเฉ‹เจตเฉ‡เจ—เจพ เจœเฉ‡เจ•เจฐ docker-compose.yml เจฏเฉ‚เจจเฉ€เจตเจฐเจธเจฒ เจนเฉ‹เจตเฉ‡เฅค
  3. เจญเจพเจตเฉ‡เจ‚ เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจธเจพเจกเฉ‡ เจ†เจชเจฃเฉ‡ QA เจฆเฉŒเฉœเจพเจ• เจนเจจ, เจ…เจธเฉ€เจ‚ เจ‡เจน เจ•เจฟเจตเฉ‡เจ‚ เจฏเจ•เฉ€เจจเฉ€ เจฌเจฃเจพ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจกเฉŒเจ•เจฐ-เจ•เฉฐเจชเฉ‹เจœเจผ เจฐเจพเจนเฉ€เจ‚ เจธเจผเฉเจฐเฉ‚ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจธเฉ‡เจตเจพเจตเจพเจ‚ เจ‡เฉฑเจ• เจฆเฉ‚เจœเฉ‡ เจจเจพเจฒ เจฆเจ–เจฒ เจจเจพ เจฆเฉ‡เจฃ?
  4. เจŸเฉˆเจธเจŸ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจธเฉ‡เจตเจพเจตเจพเจ‚ เจฆเฉ‡ เจฒเฉŒเจ—เจธ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจ‡เจ•เฉฑเจ เจพ เจ•เจฐเจจเจพ เจนเฉˆ?
  5. เจฆเฉŒเฉœเจพเจ• เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจธเจพเจซเจผ เจ•เจฐเจจเจพ เจนเฉˆ?

เจฎเฉ‡เจฐเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸเจพเจ‚ เจฒเจˆ เจฎเฉ‡เจฐเฉ‡ เจ•เฉ‹เจฒ เจ†เจชเจฃเจพ GitLab เจฆเฉŒเฉœเจพเจ• เจนเฉˆ เจ…เจคเฉ‡ เจฎเฉˆเจจเฉ‚เฉฐ เจตเจฟเจ•เจพเจธ เจฆเฉ‡ เจฆเฉŒเจฐเจพเจจ เจ‡เจนเจจเจพเจ‚ เจชเฉเจฐเจธเจผเจจเจพเจ‚ เจฆเจพ เจธเจพเจนเจฎเจฃเจพ เจ•เจฐเจจเจพ เจชเจฟเจ† เจœเจพเจตเจพ เจ•เจฒเจพเจ‡เฉฐเจŸ เจจเฉ‚เฉฐ เจŸเฉˆเจธเจŸเจฐเฉ‡เจฒ. เจตเจงเฉ‡เจฐเฉ‡ เจธเจชเจธเจผเจŸ เจคเฉŒเจฐ 'เจคเฉ‡, เจœเจฆเฉ‹เจ‚ เจเจ•เฉ€เจ•เจฐเจฃ เจŸเฉˆเจธเจŸ เจšเจฒเจพเจ‰เจ‚เจฆเฉ‡ เจนเฉ‹เฅค เจนเฉ‡เจ เจพเจ‚ เจ…เจธเฉ€เจ‚ เจ‡เจธ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเฉ€เจ†เจ‚ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ‡เจนเจจเจพเจ‚ เจฎเฉเฉฑเจฆเจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจนเฉฑเจฒ เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค

เจธเจฎเฉฑเจ—เจฐเฉ€ เจจเฉ‚เฉฐ

GitLab เจธเจผเฉˆเฉฑเจฒ เจฐเจจเจฐ

เจ‡เฉฑเจ• เจฆเฉŒเฉœเจพเจ• เจฒเจˆ, เจฎเฉˆเจ‚ 4 vCPU, 4 GB RAM, 50 GB HDD เจตเจพเจฒเฉ€ เจ‡เฉฑเจ• เจฒเฉ€เจจเจ•เจธ เจตเจฐเจšเฉเจ…เจฒ เจฎเจธเจผเฉ€เจจ เจฆเฉ€ เจธเจฟเจซเจผเจพเจฐเจธเจผ เจ•เจฐเจฆเจพ เจนเจพเจ‚เฅค
เจ‡เฉฐเจŸเจฐเจจเฉˆเฉฑเจŸ 'เจคเฉ‡ เจ—เจฟเจŸเจฒเฉˆเจฌ-เจฐเจจเจฐ เจธเจฅเจพเจชเจค เจ•เจฐเจจ เจฌเจพเจฐเฉ‡ เจฌเจนเฉเจค เจธเจพเจฐเฉ€ เจœเจพเจฃเจ•เจพเจฐเฉ€ เจนเฉˆ, เจ‡เจธ เจฒเจˆ เจธเฉฐเจ–เฉ‡เจช เจตเจฟเฉฑเจš:

  • SSH เจฐเจพเจนเฉ€เจ‚ เจฎเจธเจผเฉ€เจจ เจคเฉ‡ เจฒเฉŒเจ—เจ‡เจจ เจ•เจฐเฉ‹
  • เจœเฉ‡ เจคเฉเจนเจพเจกเฉ‡ เจ•เฉ‹เจฒ 8 เจœเฉ€เจฌเฉ€ เจฐเฉˆเจฎ เจคเฉ‹เจ‚ เจ˜เฉฑเจŸ เจนเฉˆ, เจคเจพเจ‚ เจฎเฉˆเจ‚ เจธเจฟเจซเจพเจฐเจธเจผ เจ•เจฐเจฆเจพ เจนเจพเจ‚ เจธเจตเฉˆเจช 10 GB เจฌเจฃเจพเจ“เจคเจพเจ‚ เจ•เจฟ เจ“เจ“เจเจฎ เจ•เจฟเจฒเจฐ เจ† เจ•เฉ‡ เจฐเฉˆเจฎ เจฆเฉ€ เจ˜เจพเจŸ เจ•เจพเจฐเจจ เจธเจพเจกเฉ‡ เจ•เฉฐเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจ–เจคเจฎ เจจเจพ เจ•เจฐเฉ‡เฅค เจ‡เจน เจ‰เจฆเฉ‹เจ‚ เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆ เจœเจฆเฉ‹เจ‚ 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

    เจ…เจคเฉ‡ เจœเฉ‡เจ•เจฐ เจคเจธเจตเฉ€เจฐ เจ•เฉเจ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเฉ€ เจนเฉˆ, เจคเจพเจ‚ เจœเจพเจ‚ เจคเจพเจ‚ เจธเจตเฉˆเจช เจœเฉ‹เฉœเฉ‹ เจœเจพเจ‚ RAM เจœเฉ‹เฉœเฉ‹เฅค

  • เจธเจฅเจพเจชเจฟเจค เจ•เจฐเฉ‹ gitlab-เจฆเฉŒเฉœเจพเจ•, เจกเฉŒเจ•เจฐ, เจกเฉŒเจ•เจฐ-เจ•เฉฐเจชเฉ‹เจœเจผ, เจฌเจฃเจพเจ‰.
  • เจ‡เฉฑเจ• เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจจเฉ‚เฉฐ เจธเจผเจพเจฎเจฒ เจ•เจฐเจจเจพ gitlab-runner เจ—เจฐเฉเฉฑเจช เจจเฉ‚เฉฐ docker
    sudo groupadd docker
    sudo usermod -aG docker gitlab-runner
  • เจฐเจœเจฟเจธเจŸเจฐ gitlab-เจฆเฉŒเฉœเจพเจ•.
  • เจธเฉฐเจชเจพเจฆเจจ เจฒเจˆ เจ–เฉ‹เจฒเฉเจนเฉ‹ /etc/gitlab-runner/config.toml เจ…เจคเฉ‡ เจธเจผเจพเจฎเจฟเจฒ เจ•เจฐเฉ‹

    concurrent=20
    [[runners]]
      request_concurrency = 10

    เจ‡เจน เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจฆเฉŒเฉœเจพเจ• 'เจคเฉ‡ เจธเจฎเจพเจจเจพเจ‚เจคเจฐ เจ•เจพเจฐเจœเจพเจ‚ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเฉ‡เจตเฉ‡เจ—เจพ. เจนเฉ‹เจฐ เจชเฉœเฉเจนเฉ‹ เจ‡เฉฑเจฅเฉ‡.
    เจœเฉ‡เจ•เจฐ เจคเฉเจนเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจตเจงเฉ‡เจฐเฉ‡ เจคเจพเจ•เจคเจตเจฐ เจฎเจธเจผเฉ€เจจ เจนเฉˆ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ 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 เจตเจฟเฉฑเจš เจฒเจพเจ‚เจš เจ•เจฐเจจ เจจเจพเจฒ เจธเจญ เจ•เฉเจ เจ‡เฉฐเจจเจพ เจธเฉŒเจ–เจพ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค

เจธเจฎเฉฑเจ—เจฐเฉ€ เจจเฉ‚เฉฐ

เจฎเฉ‡เจ•เจซเจพเจˆเจฒ เจฆเฉ€ เจคเจฟเจ†เจฐเฉ€

เจฎเฉˆเจ‚ เจฎเฉ‡เจ•เจซเจพเจˆเจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเจพ เจนเจพเจ‚ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‡เจน เจธเจฅเจพเจจเจ• เจตเจพเจคเจพเจตเจฐเจฃ เจชเฉเจฐเจฌเฉฐเจงเจจ เจ…เจคเฉ‡ เจธเฉ€เจ†เจˆ เจฆเฉ‹เจตเจพเจ‚ เจฒเจˆ เจฌเจนเฉเจค เจธเฉเจตเจฟเจงเจพเจœเจจเจ• เจนเฉˆ. เจนเฉ‹เจฐ เจ”เจจเจฒเจพเจˆเจจ เจŸเจฟเฉฑเจชเจฃเฉ€เจ†เจ‚

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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹