แƒ™แƒแƒ“แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒ˜แƒšแƒ•แƒ Gitlab CE-แƒจแƒ˜: แƒ—แƒฃ แƒแƒ  แƒแƒ แƒ˜แƒก แƒจแƒ”แƒ แƒฌแƒงแƒ›แƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒก แƒ“แƒแƒ›แƒขแƒ™แƒ˜แƒชแƒ”แƒ‘แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒ” แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒšแƒแƒ“ แƒ›แƒ˜แƒœแƒ“แƒ

แƒ™แƒแƒ“แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒ˜แƒšแƒ•แƒ Gitlab CE-แƒจแƒ˜: แƒ—แƒฃ แƒแƒ  แƒแƒ แƒ˜แƒก แƒจแƒ”แƒ แƒฌแƒงแƒ›แƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒก แƒ“แƒแƒ›แƒขแƒ™แƒ˜แƒชแƒ”แƒ‘แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒ” แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒšแƒแƒ“ แƒ›แƒ˜แƒœแƒ“แƒ

แƒ”แƒ แƒ—-แƒ”แƒ แƒ—แƒ˜ แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒแƒฃแƒชแƒ˜แƒšแƒ”แƒ‘แƒ”แƒšแƒ˜ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ  แƒแƒ แƒ˜แƒก GitLab-แƒ˜แƒก แƒฃแƒคแƒแƒกแƒ แƒ•แƒ”แƒ แƒกแƒ˜แƒแƒจแƒ˜, แƒแƒ แƒ˜แƒก แƒกแƒแƒชแƒแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒฃแƒฅแƒ›แƒ”แƒ‘แƒ˜แƒก แƒฌแƒ˜แƒœแƒแƒแƒฆแƒ›แƒ“แƒ”แƒ’ แƒฎแƒ›แƒ˜แƒก แƒ›แƒ˜แƒชแƒ”แƒ›แƒ˜แƒก แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒšแƒแƒ‘แƒ แƒ“แƒ แƒจแƒ”แƒ แƒฌแƒงแƒ›แƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒก (MR) แƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ˜, แƒ™แƒแƒ“แƒ˜แƒก แƒกแƒแƒ•แƒแƒšแƒ“แƒ”แƒ‘แƒฃแƒšแƒ แƒ’แƒแƒœแƒฎแƒ˜แƒšแƒ•แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—.

แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ•แƒแƒ™แƒ”แƒ—แƒแƒ— แƒ›แƒ˜แƒœแƒ˜แƒ›แƒแƒšแƒฃแƒ แƒ˜ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒœแƒ˜แƒ แƒ”แƒ‘แƒ แƒฉแƒ•แƒ”แƒœ แƒ—แƒ•แƒ˜แƒ—แƒแƒœ - แƒฉแƒ•แƒ”แƒœ แƒแƒ•แƒ™แƒ แƒซแƒแƒšแƒแƒ•แƒ— Merge-แƒก แƒ›แƒแƒœแƒแƒ›, แƒกแƒแƒœแƒแƒ› แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ“แƒ”แƒ•แƒ”แƒšแƒแƒžแƒ”แƒ แƒ˜ MR-แƒก แƒแƒ  แƒ“แƒแƒ”แƒ—แƒแƒœแƒฎแƒ›แƒ”แƒ‘แƒ.

แƒ แƒแƒขแƒแƒ› แƒแƒ แƒ˜แƒก แƒ”แƒก แƒกแƒแƒ”แƒ แƒ—แƒแƒ“ แƒกแƒแƒญแƒ˜แƒ แƒ?

แƒฉแƒ•แƒ”แƒœแƒก แƒแƒ แƒ’แƒแƒœแƒ˜แƒ–แƒแƒชแƒ˜แƒแƒก แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒแƒ“แƒ•แƒ˜แƒšแƒแƒ“ แƒจแƒ”แƒ˜แƒซแƒ˜แƒœแƒแƒก GitLab แƒšแƒ˜แƒชแƒ”แƒœแƒ–แƒ˜แƒ. แƒ›แƒแƒ’แƒ แƒแƒ›, แƒ แƒแƒ“แƒ’แƒแƒœ แƒ’แƒแƒœแƒ•แƒ˜แƒ—แƒแƒ แƒ”แƒ‘แƒ แƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ“แƒ”แƒ‘แƒ แƒ“แƒแƒฎแƒฃแƒ แƒฃแƒš แƒ›แƒแƒ แƒงแƒฃแƒŸแƒจแƒ˜ แƒ˜แƒœแƒขแƒ”แƒ แƒœแƒ”แƒขแƒ˜แƒ— แƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ” แƒ“แƒ แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒ›แƒ™แƒแƒชแƒ แƒ˜ แƒ‘แƒ˜แƒฃแƒฏแƒ”แƒขแƒ˜แƒก แƒ“แƒแƒ’แƒ”แƒ’แƒ›แƒ•แƒ, แƒกแƒแƒญแƒ˜แƒ แƒ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒœแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒ— แƒ—แƒ•แƒ˜แƒ—แƒ›แƒแƒ แƒ—แƒ•แƒแƒ“แƒ˜ แƒšแƒ˜แƒชแƒ”แƒœแƒ–แƒ˜แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒซแƒ”แƒœแƒ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ›แƒ แƒแƒ•แƒแƒšแƒ˜ แƒ—แƒ•แƒ˜แƒก แƒ’แƒแƒœแƒ›แƒแƒ•แƒšแƒแƒ‘แƒแƒจแƒ˜ แƒ’แƒแƒ’แƒ แƒซแƒ”แƒšแƒ“แƒ”แƒก, แƒ›แƒแƒ’แƒ แƒแƒ› แƒกแƒแƒ›แƒฃแƒจแƒแƒ แƒแƒฎแƒšแƒ แƒฃแƒœแƒ“แƒ แƒ’แƒแƒ™แƒ”แƒ—แƒ“แƒ”แƒก.

แƒจแƒ”แƒ“แƒ”แƒ’แƒแƒ“ แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ:

  • แƒแƒœ แƒ›แƒ—แƒšแƒ˜แƒแƒœแƒแƒ“ แƒแƒ™แƒ แƒซแƒแƒšแƒแƒก แƒจแƒ”แƒ แƒฌแƒงแƒ›แƒ แƒ“แƒแƒชแƒฃแƒš แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒ”แƒ‘แƒจแƒ˜ แƒ–แƒแƒ’แƒ˜แƒ”แƒ แƒ—แƒ˜ แƒ“แƒ”แƒ•แƒ”แƒšแƒแƒžแƒ”แƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ›แƒแƒ’แƒ แƒแƒ› แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ“แƒ”แƒ•แƒ”แƒšแƒแƒžแƒ”แƒ แƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒกแƒแƒช แƒแƒฅแƒ•แƒ— แƒจแƒ”แƒ แƒฌแƒงแƒ›แƒ˜แƒก แƒฃแƒคแƒšแƒ”แƒ‘แƒ, แƒ˜แƒฆแƒ”แƒ‘แƒ”แƒœ แƒ™แƒแƒœแƒคแƒšแƒ˜แƒฅแƒขแƒ”แƒ‘แƒก แƒกแƒฎแƒ•แƒ แƒแƒ“แƒแƒ›แƒ˜แƒแƒœแƒ”แƒ‘แƒ˜แƒก MR-แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ”แƒ แƒ—แƒ˜แƒแƒœแƒ”แƒ‘แƒ˜แƒกแƒแƒก แƒ‘แƒแƒœแƒฃแƒกแƒแƒ“;
  • แƒแƒœ แƒ›แƒ˜แƒ”แƒชแƒ˜แƒ— แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒšแƒแƒ‘แƒ, แƒ’แƒแƒœแƒแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒแƒ— แƒฃแƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ แƒจแƒ”แƒ แƒฌแƒงแƒ›แƒ แƒ—แƒฅแƒ•แƒ”แƒœแƒก แƒ›แƒ—แƒแƒ•แƒแƒ  แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒ—แƒแƒœ แƒ™แƒแƒ“แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒ˜แƒšแƒ•แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”, แƒ—แƒฃแƒœแƒ“แƒแƒช แƒ”แƒก แƒ˜แƒงแƒแƒก แƒฃแƒ›แƒชแƒ แƒแƒกแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒฃแƒจแƒ˜แƒœ แƒ“แƒแƒฅแƒ˜แƒ แƒแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ˜แƒงแƒ.

แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜, แƒ แƒแƒช แƒ’แƒแƒ•แƒแƒ™แƒ”แƒ—แƒ”, แƒ˜แƒงแƒ Google, แƒ›แƒฏแƒ”แƒ แƒ, แƒ แƒแƒ› แƒ•แƒ˜แƒฆแƒแƒชแƒแƒก แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒšแƒแƒ“ แƒฐแƒฅแƒแƒœแƒ“แƒ แƒ›แƒกแƒ’แƒแƒ•แƒกแƒ˜ แƒ แƒแƒ› (แƒ™แƒแƒ“แƒ˜แƒก แƒจแƒ”แƒชแƒ•แƒšแƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”), แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒฆแƒ›แƒแƒฉแƒœแƒ“แƒ, แƒ แƒแƒ› แƒกแƒแƒ–แƒแƒ’แƒแƒ“แƒแƒ”แƒ‘แƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒแƒจแƒ˜ แƒแƒกแƒ”แƒ—แƒ˜ แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ แƒฏแƒ”แƒ  แƒแƒ  แƒงแƒแƒคแƒ˜แƒšแƒ.

แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒก แƒ–แƒแƒ’แƒแƒ“แƒ˜ แƒกแƒฅแƒ”แƒ›แƒ

แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ›แƒแƒ“แƒ˜แƒ— แƒ“แƒแƒ•แƒแƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒ˜แƒ แƒแƒ— Merge-แƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒก แƒ“แƒแƒ›แƒขแƒ™แƒ˜แƒชแƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒกแƒแƒขแƒ”แƒกแƒขแƒ แƒกแƒแƒชแƒแƒ•แƒ–แƒ” myapp:

  1. แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒฅแƒ›แƒœแƒแƒ— แƒŸแƒ”แƒขแƒแƒœแƒ˜ GitLab API-แƒ–แƒ” แƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก (แƒ›แƒ˜แƒกแƒ˜ แƒ›แƒ”แƒจแƒ•แƒ”แƒแƒ‘แƒ˜แƒ— แƒ›แƒ˜แƒ•แƒ˜แƒฆแƒ”แƒ‘แƒ— แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒแƒก โ€žแƒ›แƒแƒ›แƒฎแƒ แƒ”โ€œ แƒ“แƒ โ€žแƒฌแƒ˜แƒœแƒแƒแƒฆแƒ›แƒ“แƒ”แƒ’โ€œ แƒฎแƒ›แƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘)
  2. แƒ›แƒแƒ“แƒ˜แƒ— แƒ“แƒแƒ•แƒแƒ›แƒแƒขแƒแƒ— แƒŸแƒ”แƒขแƒแƒœแƒ˜ GitLab แƒชแƒ•แƒšแƒแƒ“แƒ”แƒ‘แƒก
  3. แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ›แƒแƒ แƒ—แƒแƒ— แƒจแƒ”แƒ แƒฌแƒงแƒ›แƒ แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒจแƒ˜ แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ (แƒ—แƒฃ แƒกแƒแƒ™แƒ›แƒแƒ แƒ˜แƒกแƒ˜ แƒฎแƒ›แƒ แƒแƒ  แƒแƒ แƒ˜แƒก)
  4. แƒ›แƒแƒ“แƒ˜แƒ— แƒ“แƒแƒ•แƒแƒงแƒ”แƒœแƒแƒ— แƒฎแƒ›แƒ˜แƒก แƒ’แƒแƒ“แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ, แƒ แƒแƒ’แƒแƒ แƒช CI/CD แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒ˜แƒก แƒœแƒแƒฌแƒ˜แƒšแƒ˜
  5. แƒฉแƒ•แƒ”แƒœ แƒ™แƒ แƒซแƒแƒšแƒแƒ•แƒก แƒ“แƒแƒชแƒฃแƒš แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒ”แƒ‘แƒก แƒ•แƒแƒšแƒ“แƒ”แƒ‘แƒฃแƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒแƒก; แƒงแƒ•แƒ”แƒšแƒ แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ แƒฎแƒ“แƒ”แƒ‘แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ MR-แƒ˜แƒก แƒ›แƒ”แƒจแƒ•แƒ”แƒแƒ‘แƒ˜แƒ—
  6. แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒแƒ›แƒแƒฌแƒ›แƒแƒ— แƒ แƒ แƒ›แƒแƒฎแƒ“แƒ แƒ‘แƒแƒšแƒแƒก

1. แƒจแƒ”แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— แƒŸแƒ”แƒขแƒแƒœแƒ˜ API-แƒ–แƒ” แƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก

แƒ’แƒแƒ“แƒแƒ“แƒ˜แƒ— แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ–แƒ” โ†’ แƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒก แƒŸแƒ”แƒขแƒแƒœแƒ”แƒ‘แƒ–แƒ” แƒ“แƒ แƒฉแƒแƒฌแƒ”แƒ แƒ”แƒ— แƒŸแƒ”แƒขแƒแƒœแƒ˜:

แƒ™แƒแƒ“แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒ˜แƒšแƒ•แƒ Gitlab CE-แƒจแƒ˜: แƒ—แƒฃ แƒแƒ  แƒแƒ แƒ˜แƒก แƒจแƒ”แƒ แƒฌแƒงแƒ›แƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒก แƒ“แƒแƒ›แƒขแƒ™แƒ˜แƒชแƒ”แƒ‘แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒ” แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒšแƒแƒ“ แƒ›แƒ˜แƒœแƒ“แƒ

แƒแƒœแƒ’แƒแƒ แƒ˜แƒจแƒ˜ แƒขแƒแƒ™แƒ”แƒœแƒ˜แƒก แƒ›แƒ˜แƒกแƒแƒฆแƒ”แƒ‘แƒแƒ“
API แƒฌแƒ•แƒ“แƒแƒ›แƒ แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒ’แƒแƒแƒ™แƒ”แƒ—แƒแƒ— แƒ—แƒ˜แƒ—แƒฅแƒ›แƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒกแƒแƒชแƒแƒ•แƒ”แƒ‘แƒ˜แƒ—, แƒแƒ›แƒ˜แƒขแƒแƒ› แƒ’แƒ˜แƒ แƒฉแƒ”แƒ•แƒ— แƒจแƒ”แƒฅแƒ›แƒœแƒแƒ— แƒชแƒแƒšแƒ™แƒ” Gitlab แƒแƒœแƒ’แƒแƒ แƒ˜แƒจแƒ˜, แƒ›แƒ˜แƒกแƒชแƒ”แƒ— แƒ›แƒ˜แƒœแƒ˜แƒ›แƒแƒšแƒฃแƒ แƒ˜ แƒฃแƒคแƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒ—แƒฅแƒ•แƒ”แƒœแƒก แƒกแƒแƒชแƒแƒ•แƒ”แƒ‘แƒ–แƒ” (แƒ›แƒแƒ’. Reporter) แƒ“แƒ แƒ›แƒ˜แƒ˜แƒฆแƒแƒ— แƒขแƒแƒ™แƒ”แƒœแƒ˜ แƒแƒ› แƒแƒœแƒ’แƒแƒ แƒ˜แƒจแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

2. แƒ“แƒแƒแƒ›แƒแƒขแƒ”แƒ— แƒŸแƒ”แƒขแƒแƒœแƒ˜ Gitlab แƒชแƒ•แƒšแƒแƒ“แƒ”แƒ‘แƒก

แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒฌแƒ˜แƒœแƒ แƒ”แƒขแƒแƒžแƒ–แƒ” แƒ›แƒ˜แƒ•แƒ˜แƒฆแƒ”แƒ— แƒŸแƒ”แƒขแƒแƒœแƒ˜ QmN2Y0NOUFlfeXhvd21ZS01aQzgK

แƒ’แƒแƒฎแƒกแƒ”แƒœแƒ˜แƒ— แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜ โ†’ CI/CD โ†’ แƒชแƒ•แƒšแƒแƒ“แƒ”แƒ‘แƒ˜ โ†’ แƒชแƒ•แƒšแƒแƒ“แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ โ†’ GITLAB_TOKEN_FOR_CI

แƒ™แƒแƒ“แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒ˜แƒšแƒ•แƒ Gitlab CE-แƒจแƒ˜: แƒ—แƒฃ แƒแƒ  แƒแƒ แƒ˜แƒก แƒจแƒ”แƒ แƒฌแƒงแƒ›แƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒก แƒ“แƒแƒ›แƒขแƒ™แƒ˜แƒชแƒ”แƒ‘แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒ” แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒšแƒแƒ“ แƒ›แƒ˜แƒœแƒ“แƒ

แƒจแƒ”แƒ“แƒ”แƒ’แƒแƒ“ แƒ•แƒ˜แƒฆแƒ”แƒ‘แƒ—:

แƒ™แƒแƒ“แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒ˜แƒšแƒ•แƒ Gitlab CE-แƒจแƒ˜: แƒ—แƒฃ แƒแƒ  แƒแƒ แƒ˜แƒก แƒจแƒ”แƒ แƒฌแƒงแƒ›แƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒก แƒ“แƒแƒ›แƒขแƒ™แƒ˜แƒชแƒ”แƒ‘แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒ” แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒšแƒแƒ“ แƒ›แƒ˜แƒœแƒ“แƒ

แƒ”แƒก แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒ™แƒ”แƒ—แƒ“แƒ”แƒก แƒ แƒแƒ’แƒแƒ แƒช แƒ”แƒ แƒ— แƒกแƒแƒชแƒแƒ•แƒ–แƒ”, แƒแƒกแƒ”แƒ•แƒ” แƒกแƒแƒชแƒแƒ•แƒ”แƒ‘แƒ˜แƒก แƒฏแƒ’แƒฃแƒคแƒ–แƒ”.

3. แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒ™แƒ แƒซแƒแƒšแƒแƒ•แƒ— Merge-แƒก, แƒ—แƒฃ แƒ™แƒแƒšแƒ”แƒ’แƒ”แƒ‘แƒ˜แƒก แƒ—แƒแƒœแƒฎแƒ›แƒแƒ‘แƒ แƒแƒ  แƒ›แƒ˜แƒ˜แƒฆแƒ”แƒ‘แƒ แƒ™แƒแƒ“แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒ˜แƒšแƒ•แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’.

แƒฉแƒ•แƒ”แƒœแƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒจแƒ”แƒ แƒฌแƒงแƒ›แƒ˜แƒก แƒแƒ™แƒ แƒซแƒแƒšแƒ•แƒ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ˜แƒก, แƒ แƒแƒ› แƒแƒกแƒแƒ›แƒ‘แƒšแƒ”แƒ˜แƒก แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒ˜ แƒ“แƒแƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒก แƒจแƒ”แƒชแƒ“แƒแƒ›แƒแƒก, แƒ—แƒฃ แƒกแƒแƒ™แƒ›แƒแƒ แƒ˜แƒกแƒ˜ แƒฎแƒ›แƒ”แƒ‘แƒ˜ แƒแƒ  แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ.

แƒ’แƒแƒ“แƒแƒ“แƒ˜แƒ— แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒจแƒ˜ โ†’ แƒ–แƒแƒ’แƒแƒ“แƒ˜ โ†’ แƒ’แƒแƒ”แƒ แƒ—แƒ˜แƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜ โ†’ แƒจแƒ”แƒ แƒฌแƒงแƒ›แƒ˜แƒก แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒฉแƒแƒ แƒ—แƒ”แƒ— แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฌแƒแƒ แƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ— แƒฃแƒœแƒ“แƒ แƒ“แƒแƒกแƒ แƒฃแƒšแƒ“แƒ”แƒก แƒแƒกแƒแƒ›แƒ‘แƒšแƒ”แƒ˜แƒก แƒฎแƒแƒ–แƒ”แƒ‘แƒ˜.

แƒ™แƒแƒ“แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒ˜แƒšแƒ•แƒ Gitlab CE-แƒจแƒ˜: แƒ—แƒฃ แƒแƒ  แƒแƒ แƒ˜แƒก แƒจแƒ”แƒ แƒฌแƒงแƒ›แƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒก แƒ“แƒแƒ›แƒขแƒ™แƒ˜แƒชแƒ”แƒ‘แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒ” แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒšแƒแƒ“ แƒ›แƒ˜แƒœแƒ“แƒ

4. แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒ˜แƒก แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ

แƒ—แƒฃ แƒฏแƒ”แƒ  แƒแƒ  แƒจแƒ”แƒ’แƒ˜แƒฅแƒ›แƒœแƒ˜แƒแƒ— CI/CD แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒ˜ แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก
แƒจแƒ”แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— แƒคแƒแƒ˜แƒšแƒ˜ แƒกแƒแƒชแƒแƒ•แƒ˜แƒก แƒซแƒ˜แƒ แƒจแƒ˜ .gitlab-ci.yml แƒฃแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ”แƒกแƒ˜ แƒจแƒ˜แƒœแƒแƒแƒ แƒกแƒ˜แƒ—:

stages:
  - build
  - test

variables:
  NEED_VOTES: 1

include:
  - remote: "https://gitlab.com/gitlab-ce-mr-approvals/ci/-/raw/master/check-approve.gitlab-ci.yml"

run-myapp:
  stage: build
  script: echo "Hello world"

แƒชแƒแƒšแƒ™แƒ” แƒกแƒแƒชแƒแƒ•แƒ˜ CI/CD แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก
แƒ›แƒ” แƒ’แƒ˜แƒ แƒฉแƒ”แƒ•แƒ— แƒจแƒ”แƒฅแƒ›แƒœแƒแƒ— แƒชแƒแƒšแƒ™แƒ” แƒกแƒแƒชแƒแƒ•แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒจแƒ˜แƒช แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒฅแƒ›แƒœแƒแƒ— myapp.gitlab-ci.yml แƒคแƒแƒ˜แƒšแƒ˜ แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒ˜แƒก แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒแƒ› แƒ’แƒ–แƒ˜แƒ— แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒฃแƒ™แƒ”แƒ— แƒแƒ™แƒแƒœแƒขแƒ แƒแƒšแƒแƒ— แƒ›แƒแƒœแƒแƒฌแƒ˜แƒšแƒ”แƒ—แƒ แƒฌแƒ•แƒ“แƒแƒ›แƒ, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒกแƒแƒช แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒแƒ— แƒจแƒ”แƒชแƒ•แƒแƒšแƒแƒœ แƒ›แƒจแƒ”แƒœแƒ”แƒ‘แƒšแƒแƒ‘แƒ˜แƒก แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒ˜ แƒ“แƒ แƒ›แƒ˜แƒ˜แƒฆแƒแƒœ แƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒก แƒœแƒ˜แƒจแƒแƒœแƒ˜.

แƒแƒฎแƒแƒšแƒ˜ แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒ˜แƒก แƒคแƒแƒ˜แƒšแƒ˜แƒก แƒ›แƒ“แƒ”แƒ‘แƒแƒ แƒ”แƒแƒ‘แƒ แƒฃแƒœแƒ“แƒ แƒ“แƒแƒ–แƒฃแƒกแƒขแƒ“แƒ”แƒก myapp แƒกแƒแƒชแƒแƒ•แƒจแƒ˜ แƒ’แƒแƒ“แƒแƒกแƒ•แƒšแƒ˜แƒ— - แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜ - CI/CD - แƒแƒกแƒแƒ›แƒ‘แƒšแƒ”แƒ˜แƒก แƒฎแƒแƒ–แƒ”แƒ‘แƒ˜ - แƒ›แƒแƒ แƒ’แƒ”แƒ‘แƒฃแƒšแƒ˜ CI แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒ’แƒ–แƒ - แƒ›แƒ˜แƒฃแƒ—แƒ˜แƒ—แƒ”แƒ— แƒแƒฎแƒแƒšแƒ˜ แƒคแƒแƒ˜แƒšแƒ˜, แƒ›แƒแƒ’. myapp.gitlab-ci.yml@gitlab-ce-mr-approvals/Ci

แƒ แƒฉแƒ”แƒ•แƒ: แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ— แƒšแƒ˜แƒœแƒขแƒ”แƒ แƒ˜ GitLab CI แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒจแƒ˜ แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒขแƒแƒœแƒแƒ“
แƒ›แƒแƒจแƒ˜แƒœแƒแƒช แƒ™แƒ˜, แƒ—แƒฃ แƒ›แƒแƒ แƒขแƒ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ—, MR-แƒ˜แƒ— แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ แƒ™แƒแƒ แƒ’แƒ˜ แƒ“แƒแƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ, แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒ˜แƒก แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒจแƒ˜ แƒงแƒ•แƒ”แƒšแƒ แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ แƒšแƒ˜แƒœแƒขแƒ”แƒ แƒ˜แƒก แƒ›แƒ”แƒจแƒ•แƒ”แƒแƒ‘แƒ˜แƒ—. แƒ—แƒฃ แƒจแƒ”แƒชแƒ“แƒแƒ›แƒแƒก แƒ“แƒแƒฃแƒจแƒ•แƒ”แƒ‘แƒ— YAML แƒคแƒแƒ˜แƒšแƒ˜แƒก แƒกแƒ˜แƒœแƒขแƒแƒฅแƒกแƒจแƒ˜, แƒ˜แƒก แƒแƒ  แƒ’แƒแƒแƒœแƒแƒ“แƒ’แƒฃแƒ แƒ”แƒ‘แƒก แƒ—แƒฅแƒ•แƒ”แƒœแƒก แƒฌแƒแƒ แƒ›แƒแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒก, แƒแƒ แƒแƒ›แƒ”แƒ“ แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒ“แƒแƒ‘แƒšแƒแƒ™แƒแƒ•แƒก Merge-แƒก.

แƒ™แƒแƒœแƒขแƒ”แƒ˜แƒœแƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜ แƒšแƒ˜แƒขแƒ แƒ˜แƒ—, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒแƒแƒจแƒ”แƒœแƒแƒ— แƒ—แƒฅแƒ•แƒ”แƒœแƒก แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒจแƒ˜:

hub.docker.com/r/gableroux/gitlab-ci-lint
hub.docker.com/r/sebiwi/gitlab-ci-validate

แƒ“แƒ แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ˜แƒก แƒ”แƒขแƒแƒžแƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜:

stages:
  - lint

lint:
  stage: lint
  image: sebiwi/gitlab-ci-validate:1.3.0
  variables:
    GITLAB_HOST: https://gitlab.com
  script:
    - CI_FILES=(./*.yml)
    - for f in "${CI_FILES[@]}"; do
        gitlab-ci-validate $f;
      done;

แƒ แƒฉแƒ”แƒ‘แƒ แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ แƒ—แƒฅแƒ•แƒ”แƒœแƒก แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒ–แƒ”, แƒ แƒแƒ—แƒ แƒ˜แƒก แƒ˜แƒ›แƒฃแƒจแƒแƒแƒก:

stages:
- test

variables:
NEED_VOTES: 1

include:
- remote: "https://gitlab.com/gitlab-ce-mr-approvals/ci/-/raw/master/check-approve.gitlab-ci.yml"

NEED_VOTES แƒชแƒ•แƒšแƒแƒ“แƒ˜ แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒแƒ•แƒก แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜ โ€žแƒชแƒ”แƒ แƒ˜ แƒ–แƒ”แƒ•แƒ˜แƒ—โ€œ แƒฃแƒœแƒ“แƒ แƒฐแƒฅแƒแƒœแƒ“แƒ”แƒก MR-แƒก, แƒ แƒแƒ› แƒจแƒ”แƒ แƒฌแƒงแƒ›แƒ แƒ˜แƒงแƒแƒก แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜. แƒ”แƒ แƒ—แƒ˜แƒก แƒขแƒแƒšแƒ˜ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ แƒœแƒ˜แƒจแƒœแƒแƒ•แƒก, แƒ แƒแƒ› แƒ—แƒฅแƒ•แƒ”แƒœ แƒ—แƒแƒ•แƒแƒ“ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒแƒ›แƒขแƒ™แƒ˜แƒชแƒแƒ— แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ MR โ€žแƒ›แƒแƒฌแƒแƒœแƒ”แƒ‘แƒ˜แƒ—โ€œ.

แƒ›แƒแƒ˜แƒชแƒแƒ•แƒก แƒกแƒแƒขแƒ”แƒกแƒขแƒ แƒ”แƒขแƒแƒžแƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒก โ€žแƒšแƒแƒ˜แƒฅแƒ”แƒ‘แƒ˜แƒกโ€œ แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒแƒก.

แƒฃแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ”แƒกแƒ˜ แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒ˜ myapp.gitlab-ci.yml-แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—
stages:
- build
- test

variables:
NEED_VOTES: 0

include:
- remote: "https://gitlab.com/gitlab-ce-mr-approvals/ci/-/raw/master/check-approve.gitlab-ci.yml"

run-myapp:
stage: build
image: openjdk
script:
- echo CI_MERGE_REQUEST_TARGET_BRANCH_NAME $CI_MERGE_REQUEST_TARGET_BRANCH_NAME
- java HelloWorld.java

แƒจแƒ˜แƒ’แƒ—แƒแƒ•แƒกแƒ˜ check-approve.gitlab-ci.yml
ci-mr:
stage: test
script:
- echo ${CI_API_V4_URL}
- echo "CI_PROJECT_ID ${CI_PROJECT_ID}"
- echo "CI_COMMIT_SHA ${CI_COMMIT_SHA}"
- "export MR_ID=$(curl --silent --request GET --header "PRIVATE-TOKEN: $GITLAB_TOKEN_FOR_CI" ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/merge_requests | jq ".[] | if .sha == \"${CI_COMMIT_SHA}\" then .id else {} end" | grep --invert-match {})"
- "export MR_TITLE=$(curl --silent --request GET --header "PRIVATE-TOKEN: $GITLAB_TOKEN_FOR_CI" ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/merge_requests | jq ".[] | if .sha == \"${CI_COMMIT_SHA}\" then .title else {} end" | grep --invert-match {})"
- "export MR_WIP=$(curl --silent --request GET --header "PRIVATE-TOKEN: $GITLAB_TOKEN_FOR_CI" ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/merge_requests | jq ".[] | if .sha == \"${CI_COMMIT_SHA}\" then .work_in_progress else {} end" | grep --invert-match {})"
- "export MR_UPVOTES=$(curl --silent --request GET --header "PRIVATE-TOKEN: $GITLAB_TOKEN_FOR_CI" ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/merge_requests | jq ".[] | if .sha == \"${CI_COMMIT_SHA}\" then .upvotes else {} end" | grep --invert-match {})"
- "export MR_DOWNVOTES=$(curl --silent --request GET --header "PRIVATE-TOKEN: $GITLAB_TOKEN_FOR_CI" ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/merge_requests | jq ".[] | if .sha == \"${CI_COMMIT_SHA}\" then .downvotes else {} end" | grep --invert-match {})"
- MR_VOTES=$(expr ${MR_UPVOTES} - ${MR_DOWNVOTES})
- NEED_VOTES_REAL=${NEED_VOTES:-1}
- echo "MR_ID ${MR_ID} MR_TITLE ${MR_TITLE} MR_WIP ${MR_WIP} MR_UPVOTES ${MR_UPVOTES} MR_DOWNVOTES ${MR_DOWNVOTES}"
- echo "MR_VOTES ${MR_VOTES} Up vote = 1, down vote = -1, MR OK if votes >=${NEED_VOTES_REAL}"
- if [ "${MR_VOTES}" -ge "$(expr ${NEED_VOTES_REAL})" ];
then
echo "MR OK";
else
echo "MR ERROR Need more votes";
exit 1;
fi
image: laptevss/gitlab-api-util
rules:
- if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME =~ /^release/.*$/'

แƒ›แƒ”แƒขแƒ˜ แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ แƒ˜แƒ›แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘, แƒ—แƒฃ แƒ แƒ แƒฎแƒ“แƒ”แƒ‘แƒ แƒ’แƒแƒ“แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒแƒก:

  • แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒ•แƒ, แƒ แƒแƒ› แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ“แƒ”แƒ‘แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ›แƒแƒกแƒขแƒ”แƒ แƒจแƒ˜ แƒแƒœ แƒ’แƒแƒ›แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก/* แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒ”แƒ‘แƒจแƒ˜ MR-แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒกแƒแƒก
  • GitLab API-แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—, แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒฆแƒ”แƒ‘แƒ— โ€žแƒ›แƒแƒฌแƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒกโ€œ แƒ“แƒ โ€žแƒ“แƒแƒฌแƒฃแƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒกโ€œ แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒแƒก.
  • แƒ’แƒแƒ›แƒแƒ—แƒ•แƒแƒšแƒ”แƒ— แƒ’แƒแƒœแƒกแƒฎแƒ•แƒแƒ•แƒ”แƒ‘แƒ แƒ“แƒแƒ“แƒ”แƒ‘แƒ˜แƒ— แƒ“แƒ แƒฃแƒแƒ แƒงแƒแƒคแƒ˜แƒ— แƒžแƒแƒกแƒฃแƒฎแƒ”แƒ‘แƒก แƒจแƒแƒ แƒ˜แƒก
  • แƒ—แƒฃ แƒ’แƒแƒœแƒกแƒฎแƒ•แƒแƒ•แƒ”แƒ‘แƒ NEED_VOTES-แƒจแƒ˜ แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒš แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒแƒ–แƒ” แƒœแƒแƒ™แƒšแƒ”แƒ‘แƒ˜แƒ, แƒ›แƒแƒจแƒ˜แƒœ แƒฉแƒ•แƒ”แƒœ แƒ“แƒแƒ•แƒ‘แƒšแƒแƒ™แƒแƒ•แƒ— แƒจแƒ”แƒ แƒฌแƒงแƒ›แƒ˜แƒก แƒฃแƒœแƒแƒ แƒก

5. แƒแƒ™แƒ แƒซแƒแƒšแƒแƒก แƒ•แƒแƒšแƒ“แƒ”แƒ‘แƒฃแƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒ“แƒแƒชแƒฃแƒš แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒ”แƒ‘แƒก

แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒœแƒ•แƒกแƒแƒ–แƒฆแƒ•แƒ แƒแƒ•แƒ— แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒ”แƒ‘แƒก, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒกแƒแƒช แƒฃแƒœแƒ“แƒ แƒฉแƒแƒ•แƒแƒขแƒแƒ แƒแƒ— แƒ™แƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒ›แƒแƒฎแƒ˜แƒšแƒ•แƒ แƒ“แƒ แƒ›แƒ˜แƒ•แƒฃแƒ—แƒ˜แƒ—แƒแƒ—, แƒ แƒแƒ› แƒ›แƒแƒ—แƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ MR-แƒ˜แƒก แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒ˜แƒ—.

แƒแƒ›แƒ˜แƒกแƒแƒ—แƒ•แƒ˜แƒก แƒ’แƒแƒ“แƒแƒ“แƒ˜แƒ— แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒจแƒ˜ โ†’ แƒกแƒแƒชแƒแƒ•แƒ˜ โ†’ แƒ“แƒแƒชแƒฃแƒšแƒ˜ แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒ”แƒ‘แƒ˜:

แƒ™แƒแƒ“แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒ˜แƒšแƒ•แƒ Gitlab CE-แƒจแƒ˜: แƒ—แƒฃ แƒแƒ  แƒแƒ แƒ˜แƒก แƒจแƒ”แƒ แƒฌแƒงแƒ›แƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒก แƒ“แƒแƒ›แƒขแƒ™แƒ˜แƒชแƒ”แƒ‘แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒ” แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒšแƒแƒ“ แƒ›แƒ˜แƒœแƒ“แƒ

6. แƒจแƒ”แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ—

แƒ“แƒแƒแƒงแƒ”แƒœแƒ”แƒ— NEED_VOTES: 0

แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ— MR-แƒก แƒ“แƒ แƒ•แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ— "dislike".

แƒ™แƒแƒ“แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒ˜แƒšแƒ•แƒ Gitlab CE-แƒจแƒ˜: แƒ—แƒฃ แƒแƒ  แƒแƒ แƒ˜แƒก แƒจแƒ”แƒ แƒฌแƒงแƒ›แƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒก แƒ“แƒแƒ›แƒขแƒ™แƒ˜แƒชแƒ”แƒ‘แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒ” แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒšแƒแƒ“ แƒ›แƒ˜แƒœแƒ“แƒ

แƒ›แƒจแƒ”แƒœแƒ”แƒ‘แƒšแƒแƒ‘แƒ˜แƒก แƒŸแƒฃแƒ แƒœแƒแƒšแƒ”แƒ‘แƒจแƒ˜:

แƒ™แƒแƒ“แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒ˜แƒšแƒ•แƒ Gitlab CE-แƒจแƒ˜: แƒ—แƒฃ แƒแƒ  แƒแƒ แƒ˜แƒก แƒจแƒ”แƒ แƒฌแƒงแƒ›แƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒก แƒ“แƒแƒ›แƒขแƒ™แƒ˜แƒชแƒ”แƒ‘แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒ” แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒšแƒแƒ“ แƒ›แƒ˜แƒœแƒ“แƒ

แƒแƒฎแƒšแƒ แƒฉแƒแƒ“แƒ”แƒ— โ€žแƒšแƒแƒ˜แƒฅแƒ˜โ€œ แƒ“แƒ แƒ™แƒ•แƒšแƒแƒ• แƒ“แƒแƒ˜แƒฌแƒงแƒ”แƒ— แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ:

แƒ™แƒแƒ“แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒ˜แƒšแƒ•แƒ Gitlab CE-แƒจแƒ˜: แƒ—แƒฃ แƒแƒ  แƒแƒ แƒ˜แƒก แƒจแƒ”แƒ แƒฌแƒงแƒ›แƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒก แƒ“แƒแƒ›แƒขแƒ™แƒ˜แƒชแƒ”แƒ‘แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒ” แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒšแƒแƒ“ แƒ›แƒ˜แƒœแƒ“แƒ

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ