HotFix-แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ Maven แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒจแƒ˜ TeamCity-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แƒ”แƒก แƒžแƒแƒกแƒขแƒ˜ แƒแƒฆแƒฌแƒ”แƒ แƒก HotFix แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒก แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒแƒก Maven แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒจแƒ˜ Teamcity-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—.

HotFix-แƒ˜แƒก แƒ’แƒแƒกแƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒšแƒแƒ“, แƒฉแƒ•แƒ”แƒฃแƒšแƒ”แƒ‘แƒ แƒ˜แƒ• แƒ™แƒ”แƒ—แƒ“แƒ”แƒ‘แƒ แƒ›แƒ แƒแƒ•แƒแƒšแƒ˜ แƒฎแƒ”แƒšแƒ˜แƒ— แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜:

  1. แƒจแƒ”แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— แƒ‘แƒ แƒแƒœแƒฉแƒ˜ แƒ˜แƒ› แƒ’แƒแƒ›แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ›แƒšแƒ˜แƒ—แƒแƒช แƒ’แƒกแƒฃแƒ แƒ— HotFix-แƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ
  2. แƒจแƒ”แƒแƒกแƒฌแƒแƒ แƒ”แƒ— แƒ’แƒแƒ›แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒฎแƒแƒ แƒ•แƒ”แƒ–แƒ˜
  3. แƒจแƒ”แƒชแƒ•แƒแƒšแƒ”แƒ— bugfix แƒ•แƒ”แƒ แƒกแƒ˜แƒ แƒ’แƒแƒ›แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒจแƒ˜
  4. แƒ’แƒแƒแƒคแƒแƒ แƒ—แƒแƒ•แƒ”แƒ— bugfix แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒก แƒขแƒ”แƒ’แƒ˜

1,3,4 แƒฅแƒฃแƒšแƒ”แƒ‘แƒ˜ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ˜แƒงแƒแƒก.

แƒกแƒแƒœแƒแƒ› แƒ—แƒ”แƒ›แƒแƒก แƒ’แƒแƒ“แƒแƒ•แƒ˜แƒ“แƒแƒ“แƒ”แƒ—, แƒ›แƒ˜แƒœแƒ“แƒ แƒจแƒ”แƒ•แƒ”แƒฎแƒ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœ แƒ“แƒ แƒ แƒ—แƒฃแƒš แƒ—แƒ”แƒ›แƒแƒก - แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒ แƒ”แƒ‘แƒ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒฃแƒšแƒ˜ แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒ. แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ›แƒแƒ™แƒšแƒ”แƒ“ แƒ’แƒแƒ˜แƒ’แƒแƒ— Semver แƒแƒ› แƒกแƒ™แƒ แƒ˜แƒœแƒจแƒแƒขแƒจแƒ˜. HotFix-แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ Maven แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒจแƒ˜ TeamCity-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แƒ›แƒ”แƒขแƒ˜ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒฌแƒแƒ˜แƒ™แƒ˜แƒ—แƒฎแƒแƒ— แƒ‘แƒ›แƒฃแƒšแƒ–แƒ”: 1.

แƒแƒ› แƒžแƒแƒกแƒขแƒจแƒ˜ แƒแƒฆแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜ แƒงแƒ•แƒ”แƒšแƒ แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ˜ แƒ”แƒคแƒฃแƒซแƒœแƒ”แƒ‘แƒ แƒกแƒ”แƒ›แƒ•แƒ”แƒ แƒ˜ ะธ แƒ›แƒแƒ’แƒ˜แƒกแƒขแƒ แƒแƒšแƒฃแƒ แƒ˜ แƒ“แƒแƒคแƒฃแƒซแƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ’แƒแƒœแƒ•แƒ˜แƒ—แƒแƒ แƒ”แƒ‘แƒ.

Trunk-Based Development-แƒจแƒ˜ แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒฅแƒ›แƒœแƒแƒ— แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒ˜ แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ’แƒแƒ›แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒแƒ› แƒ’แƒแƒ›แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒคแƒแƒ แƒ’แƒšแƒ”แƒ‘แƒจแƒ˜ แƒแƒ แƒกแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒงแƒ•แƒ”แƒšแƒ แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ (แƒชแƒฎแƒ”แƒšแƒ˜ แƒจแƒ”แƒกแƒฌแƒแƒ แƒ”แƒ‘แƒ) แƒ›แƒแƒฌแƒแƒ“แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒแƒ› แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

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

  • CI แƒแƒจแƒ”แƒœแƒ”แƒ‘แƒ

  • แƒแƒฎแƒแƒšแƒ˜ แƒ’แƒแƒ›แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ

  • แƒ’แƒแƒ›แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ

  • แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒกแƒฌแƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒก แƒจแƒ”แƒชแƒ•แƒšแƒ

HotFix-แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ Maven แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒจแƒ˜ TeamCity-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜:

  • Git แƒกแƒแƒชแƒแƒ•แƒ˜ แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒ™แƒแƒ“แƒ˜แƒก แƒจแƒ”แƒกแƒแƒœแƒแƒฎแƒแƒ“. แƒžแƒแƒกแƒขแƒ˜ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก แƒกแƒแƒชแƒแƒ•แƒก https://gitlab.com/anton_patsev/automation-maven-hotfix.
  • Teamcity แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜ แƒ“แƒ แƒแƒ’แƒ”แƒœแƒขแƒ˜. แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒแƒแƒ›แƒแƒฆแƒšแƒแƒ— แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒแƒ“แƒ’แƒ˜แƒšแƒแƒ‘แƒ แƒ˜แƒ•แƒ˜ Teamcity แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜ แƒ“แƒ แƒแƒ’แƒ”แƒœแƒขแƒ˜ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— แƒ“แƒแƒ™แƒ”แƒ แƒ˜-แƒ™แƒแƒ›แƒžแƒแƒ–แƒ˜แƒชแƒ˜แƒ
  • แƒกแƒแƒ“แƒแƒช แƒ—แƒฅแƒ•แƒ”แƒœ แƒ’แƒแƒฅแƒ•แƒ— Teamcity แƒแƒ’แƒ”แƒœแƒขแƒ˜, java, maven, git แƒฃแƒœแƒ“แƒ แƒ˜แƒงแƒแƒก แƒ“แƒแƒ˜แƒœแƒกแƒขแƒแƒšแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜

แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒฅแƒ›แƒœแƒแƒ— แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜ "Automation Maven Hotfix" Teamcity-แƒจแƒ˜ แƒ“แƒ แƒจแƒ”แƒ•แƒฅแƒ›แƒœแƒแƒ— 4 แƒแƒ›แƒแƒชแƒแƒœแƒ.

  • CI Build

  • แƒจแƒ”แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒ˜ แƒ’แƒแƒกแƒแƒ—แƒแƒ•แƒ˜แƒกแƒฃแƒคแƒšแƒ”แƒ‘แƒšแƒแƒ“

  • Maven increment bugfix (bugfix-แƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒก แƒจแƒ”แƒชแƒ•แƒšแƒ))

  • Maven-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒจแƒ•แƒ”แƒ‘แƒ (แƒแƒฎแƒแƒšแƒ˜ แƒ’แƒแƒ›แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ)

แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒกแƒ™แƒ แƒ˜แƒœแƒจแƒแƒขแƒ˜:

HotFix-แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ Maven แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒจแƒ˜ TeamCity-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แƒ–แƒแƒ’แƒแƒ“แƒ˜ แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜

แƒงแƒ•แƒ”แƒšแƒ แƒแƒ›แƒแƒชแƒแƒœแƒแƒจแƒ˜ แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ›แƒแƒœแƒ˜แƒจแƒœแƒแƒ— แƒงแƒฃแƒ—แƒ˜ "Clean build: แƒฌแƒแƒจแƒแƒšแƒ”แƒ— แƒงแƒ•แƒ”แƒšแƒ แƒคแƒแƒ˜แƒšแƒ˜ แƒจแƒ”แƒ™แƒ•แƒ”แƒ—แƒ˜แƒก แƒ“แƒ˜แƒ แƒ”แƒฅแƒขแƒแƒ แƒ˜แƒแƒจแƒ˜ แƒแƒจแƒ”แƒœแƒ”แƒ‘แƒแƒ›แƒ“แƒ”โ€œ, แƒ แƒแƒ“แƒ’แƒแƒœ แƒแƒ› แƒฉแƒแƒ›แƒ แƒ—แƒ•แƒ”แƒšแƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ” แƒ›แƒ” แƒ›แƒ˜แƒ•แƒ˜แƒฆแƒ” แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒ˜.

แƒฉแƒ•แƒ”แƒœ แƒ•แƒฅแƒ›แƒœแƒ˜แƒ— แƒ”แƒ แƒ— VCS-แƒก. VCS แƒ›แƒแƒฎแƒแƒกแƒ˜แƒแƒ—แƒ”แƒ‘แƒšแƒ”แƒ‘แƒ˜ แƒฌแƒ˜แƒ—แƒšแƒแƒ“ แƒแƒ แƒ˜แƒก แƒจแƒ”แƒ›แƒแƒฎแƒแƒ–แƒฃแƒšแƒ˜.

HotFix-แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ Maven แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒจแƒ˜ TeamCity-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แƒ แƒแƒ’แƒแƒ แƒช แƒฌแƒ”แƒกแƒ˜, VCS แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก HTTPS แƒกแƒฅแƒ”แƒ›แƒแƒก. IN แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒ˜แƒก แƒกแƒžแƒ”แƒชแƒ˜แƒคแƒ˜แƒ™แƒแƒชแƒ˜แƒ: แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒงแƒ•แƒ”แƒšแƒ แƒ‘แƒ แƒฃแƒœแƒฉแƒ˜แƒก แƒ“แƒ แƒงแƒ•แƒ”แƒšแƒ แƒขแƒ”แƒ’แƒ˜แƒก แƒกแƒแƒงแƒฃแƒ แƒ”แƒ‘แƒšแƒแƒ“:

+:refs/heads/*
+:refs/tags/*

แƒแƒฃแƒชแƒ˜แƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ 4 แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ.

  • BRANCH_FOR_INCREMENT
  • TAG_FROM_VERSION
  • TEAM_USER
  • TEAM_USER_EMAIL

แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ˜แƒก แƒ•แƒ”แƒšแƒ˜ BRANCH_FOR_INCREMENT แƒ“แƒ TAG_FROM_VERSION แƒชแƒแƒ แƒ˜แƒ”แƒšแƒ˜ แƒฃแƒœแƒ“แƒ แƒ“แƒแƒ แƒฉแƒ”แƒก.

HotFix-แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ Maven แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒจแƒ˜ TeamCity-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒแƒ—/แƒ“แƒแƒแƒ›แƒแƒขแƒแƒ— แƒžแƒ˜แƒ แƒแƒ“แƒ˜ แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜. แƒงแƒ•แƒ”แƒšแƒ แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ CI Build-แƒ˜แƒก แƒ’แƒแƒ แƒ“แƒ แƒ›แƒแƒ˜แƒ—แƒฎแƒแƒ•แƒก แƒžแƒ˜แƒ แƒแƒ“ แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒก.

HotFix-แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ Maven แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒจแƒ˜ TeamCity-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒš แƒแƒ›แƒแƒชแƒแƒœแƒแƒจแƒ˜, แƒ’แƒแƒ แƒ“แƒ CI Build-แƒ˜แƒกแƒ, Build Features แƒ’แƒแƒœแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒแƒจแƒ˜ แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ“แƒแƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒแƒ— แƒžแƒ˜แƒ แƒแƒ“แƒ˜ แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜.

แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก Maven แƒ’แƒแƒ—แƒแƒ•แƒ˜แƒกแƒฃแƒคแƒšแƒ”แƒ‘แƒ

HotFix-แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ Maven แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒจแƒ˜ TeamCity-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

CI Build **.

แƒแƒ›แƒแƒชแƒแƒœแƒแƒจแƒ˜ CI Build แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ”แƒ แƒ—แƒ˜ แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜ mvn แƒกแƒฃแƒคแƒ—แƒ แƒขแƒ”แƒกแƒขแƒ˜

HotFix-แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ Maven แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒจแƒ˜ TeamCity-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

Maven แƒ’แƒแƒ—แƒแƒ•แƒ˜แƒกแƒฃแƒคแƒšแƒ”แƒ‘แƒ

แƒแƒ›แƒแƒชแƒแƒœแƒแƒจแƒ˜ Maven แƒ’แƒแƒ—แƒแƒ•แƒ˜แƒกแƒฃแƒคแƒšแƒ”แƒ‘แƒ 2 แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜. แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜ แƒแƒ แƒ˜แƒก แƒ‘แƒ แƒฃแƒœแƒฉแƒ˜แƒก แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ แƒกแƒแƒ›แƒแƒ’แƒ˜แƒกแƒขแƒ แƒ. แƒ—แƒฃ แƒ‘แƒ แƒแƒœแƒฉแƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก แƒกแƒแƒ›แƒแƒ’แƒ˜แƒกแƒขแƒ แƒ, แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ แƒ›แƒแƒ“แƒ˜แƒก.

BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" != "master" ]]; then
  echo 'Branch is not master';
  echo 'Aborting';
  exit 1;
fi

HotFix-แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ Maven แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒจแƒ˜ TeamCity-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แƒ›แƒ”แƒแƒ แƒ” แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜ แƒแƒ แƒ˜แƒก แƒกแƒขแƒแƒœแƒ“แƒแƒ แƒขแƒฃแƒšแƒ˜ mvn แƒ’แƒแƒ›แƒแƒจแƒ•แƒ”แƒ‘แƒ: แƒ›แƒแƒ›แƒ–แƒแƒ“แƒ”แƒ‘แƒ แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ˜แƒ— -- แƒžแƒแƒ แƒขแƒ˜แƒฃแƒšแƒ˜ แƒ แƒ”แƒŸแƒ˜แƒ›แƒ˜

HotFix-แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ Maven แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒจแƒ˜ TeamCity-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แƒจแƒ”แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒ˜ แƒ’แƒแƒกแƒแƒ—แƒแƒ•แƒ˜แƒกแƒฃแƒคแƒšแƒ”แƒ‘แƒšแƒแƒ“

แƒ’แƒแƒ›แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒชแƒฎแƒ”แƒšแƒ˜ แƒจแƒ”แƒกแƒฌแƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฅแƒ›แƒœแƒ”แƒšแƒแƒ“, แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒฅแƒ›แƒœแƒแƒ— แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒ˜. แƒ”แƒก แƒแƒ แƒ˜แƒก แƒ˜แƒก, แƒ แƒแƒกแƒแƒช แƒแƒ›แƒแƒชแƒแƒœแƒ แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒก แƒจแƒ”แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒ˜ แƒ’แƒแƒกแƒแƒ—แƒแƒ•แƒ˜แƒกแƒฃแƒคแƒšแƒ”แƒ‘แƒšแƒแƒ“. แƒ›แƒแƒก แƒแƒฅแƒ•แƒก 2 แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜.

แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜ แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒก, แƒ แƒแƒ› แƒ‘แƒ แƒแƒœแƒฉแƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก แƒกแƒแƒ›แƒแƒ’แƒ˜แƒกแƒขแƒ แƒแƒ“แƒ แƒ›แƒ”แƒแƒ แƒ” แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒก, แƒ แƒแƒ› แƒ•แƒ”แƒ แƒกแƒ˜แƒ แƒคแƒแƒ˜แƒšแƒจแƒ˜แƒ pom.xml แƒกแƒ˜แƒขแƒงแƒ•แƒแƒก แƒแƒ  แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒ“แƒ แฒ™แฒแฒ“แฒ แฒ˜

BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" == "master" ]]; then
  echo 'Branch is master';
  echo 'Aborting';
  exit 1;
fi

echo "Get version package from pom.xml"
version=`python -c "import xml.etree.ElementTree as ET; print(ET.parse(open('pom.xml')).getroot().find('{http://maven.apache.org/POM/4.0.0}version').text)"`

echo "Check SNAPSHOT"
if [[ $version == "*SNAPSHOT*" ]]; then
    echo "******************* W A R N I N G *************************"
    echo "************ You are create branch for SNAPSHOTS ******************"
    echo "***********************************************************"
    exit 1
fi

HotFix-แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ Maven แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒจแƒ˜ TeamCity-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แƒ›แƒ”แƒแƒ แƒ” แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜ แƒชแƒ•แƒšแƒ˜แƒก แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒกแƒฅแƒ”แƒ›แƒแƒก developerConnection-แƒจแƒ˜ HTTPS-แƒ“แƒแƒœ GIT-แƒ›แƒ“แƒ”.

# ะ—ะดะตััŒ ะฟะพะปัƒั‡ะฐะตะผ developerConnection ะธะท ั„ะฐะนะปะฐ pom.xml
developerConnection=$(xmllint -xpath "/*[local-name() = 'project' ]//*[local-name() = 'developerConnection']/text()" pom.xml | sed  's|scm:git:ssh://||')
echo developerConnection
echo $developerConnection
# ะ—ะดะตััŒ ะผะตะฝัะตะผ / ะฝะฐ : ะฒ URL ะดะปั git_remote_url
git_remote_url=$(echo $developerConnection| sed 's/gitlab.com//gitlab.com:/g')
echo git_remote_url
echo $git_remote_url

git remote set-url origin $git_remote_url

# ะ•ัะปะธ ะฒั‹ ะฝะต ะธัะฟะพะปัŒะทัƒะตั‚ะต ะฒะฒัั‚ั€ะพะตะฝะฝัƒัŽ ะฒะพะทะผะพะถะฝะพัั‚ัŒ Teamcity ะฟะพะปัƒั‡ะตะฝะธั user ะธ email ะธะท ~/.gitconfig, ั‚ะพ ะผะพะถะฝะพ ัƒะบะฐะทะฐั‚ัŒ ะธั… ะทะดะตััŒ
echo 'git config user.name %TEAM_USER%'
git config user.name %TEAM_USER%
echo 'git config user.email %TEAM_USER_EMAIL%'
git config user.email %TEAM_USER_EMAIL%

# ะ—ะดะตััŒ ะฟะพะปัƒั‡ะฐะตะผ ะฒะตั€ัะธัŽ ะธะท ั„ะฐะนะปะฐ pom.xml
echo "Get version package from pom.xml"
version=`python -c "import xml.etree.ElementTree as ET; print(ET.parse(open('pom.xml')).getroot().find('{http://maven.apache.org/POM/4.0.0}version').text)"`
echo $version

# ะŸะพั‡ะตะผัƒ-ั‚ะพ ะฑะตะท fetch ะฒั‹ะดะฐะฒะฐะปะพ ะพัˆะธะฑะบัƒ.
git fetch

if [ `git branch -a | egrep "${version}$"` ]
then
    echo "Branch exists"
    exit 1
fi

# ะกะพะทะดะฐะตะผ ะฑั€ะฐะฝั‡ ั‚ะพะน ะฒะตั€ัะธะธ, ะบะพั‚ะพั€ั‹ะน ะฑั‹ะป ะฒ ั„ะฐะนะปะต pom.xml
echo "Create branch"
git checkout -b $version

# ะงะธัั‚ั‹ะน git ะฒัะตะณะดะฐ ะฟั€ะตะดะปะฐะณะฐะตั‚ ะฝะฐัั‚ั€ะพะธั‚ัŒ ะฟะพะปะธั‚ะธะบัƒ ะพั‚ะฟั€ะฐะฒะบะธ.
git config --global push.default simple

# ะŸัƒัˆะธะผ ะฒ ะฒะตั‚ะบัƒ ัะพะฒะฟะฐะดะฐัŽั‰ัƒัŽ ั ะฒะตั€ัะธะตะน ะฒ pom.xml
echo "Push release branch"
git push --set-upstream origin $version

HotFix-แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ Maven แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒจแƒ˜ TeamCity-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

Maven increment bugfix

แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ แƒจแƒ”แƒ“แƒ’แƒ”แƒ‘แƒ 6 แƒœแƒแƒฌแƒ˜แƒšแƒ˜แƒกแƒ’แƒแƒœ. แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒแƒ“แƒ แƒ›แƒ˜แƒกแƒ˜ แƒ แƒ”แƒคแƒแƒฅแƒขแƒแƒ แƒ˜แƒ แƒ”แƒ‘แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒแƒ˜แƒœแƒช แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก.

แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜ แƒแƒ แƒ˜แƒก แƒ˜แƒ›แƒ˜แƒก แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ, แƒ แƒแƒ› แƒ‘แƒ แƒแƒœแƒฉแƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก แƒกแƒแƒ›แƒแƒ’แƒ˜แƒกแƒขแƒ แƒ. แƒ—แƒฃ แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒ˜ แƒกแƒแƒ›แƒแƒ’แƒ˜แƒกแƒขแƒ แƒ แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ แƒ”แƒชแƒ”แƒ›แƒ.

BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" == "master" ]]; then
  echo 'Branch is master';
  echo 'Aborting';
  exit 1;
fi

# ะ—ะดะตััŒ ะฟะพะปัƒั‡ะฐะตะผ ะฒะตั€ัะธัŽ ะธะท ั„ะฐะนะปะฐ pom.xml
echo "Get version package from pom.xml"
BRANCH=`python -c "import xml.etree.ElementTree as ET; print(ET.parse(open('pom.xml')).getroot().find('{http://maven.apache.org/POM/4.0.0}version').text)"`
# ะŸั€ะธั…ะพะดะธั‚ัั ะดะตะปะฐั‚ัŒ checkout ะฝะฐ ะฝัƒะถะฝั‹ะน ะฑั€ะฐะฝั‡.
# ะ˜ะฝะฐั‡ะต git status ะฟะพะบะฐะทั‹ะฒะฐะตั‚ detached ะบ ะฝัƒะถะฝะพะผัƒ ะฑั€ะฐะฝั‡ัƒ.
# ะัƒะถะฝะพ ั‡ั‚ะพะฑั‹ git status ะฟะพะบะฐะทั‹ะฒะฐะป ะฟั€ะพัั‚ะพ ะฑั€ะฐะฝั‡
git checkout $BRANCH
# ะญะบัะฟะพั€ั‚ะธั€ัƒะตะผ ะฟะตั€ะตะผะตะฝะฝัƒัŽ bash ะฒ ะฟะตั€ะตะผะตะฝะฝัƒัŽ Teamcity ะดะปั ะดะฐะปัŒะฝะตะนัˆะตะณะพ ะธัะฟะพะปัŒะทะพะฒะฐะฝะธั.
echo "##teamcity[setParameter name='BRANCH_FOR_INCREMENT' value='$BRANCH']"

HotFix-แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ Maven แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒจแƒ˜ TeamCity-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แƒ›แƒ”แƒแƒ แƒ” Maven แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜ แƒแƒ แƒ˜แƒก แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒกแƒฌแƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒก แƒจแƒ”แƒชแƒ•แƒšแƒ pom.xml แƒคแƒแƒ˜แƒšแƒจแƒ˜.

แƒ›แƒ˜แƒ–แƒœแƒ”แƒ‘แƒ˜: แƒ›แƒแƒ•แƒ”แƒœแƒก แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ”แƒ แƒ— แƒฎแƒแƒ–แƒ–แƒ” แƒแƒฅแƒ•แƒก

build-helper:parse-version versions:set -DnewVersion=${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.nextIncrementalVersion} versions:commit

HotFix-แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ Maven แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒจแƒ˜ TeamCity-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แƒ›แƒ”แƒกแƒแƒ›แƒ” แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜ แƒแƒ แƒ˜แƒก Git แƒกแƒขแƒแƒขแƒฃแƒกแƒ˜แƒก แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ˜แƒก แƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒ แƒ“แƒ แƒกแƒฎแƒ•แƒ:

echo 'cat pom.xml'
cat pom.xml
echo 'git status'
git status
echo 'git remote -v'
git remote -v
echo 'git branch'
git branch

HotFix-แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ Maven แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒจแƒ˜ TeamCity-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แƒ›แƒ”แƒแƒ—แƒฎแƒ” แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜ แƒชแƒ•แƒšแƒ˜แƒก แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒกแƒฅแƒ”แƒ›แƒแƒก developerConnection-แƒจแƒ˜ HTTPS-แƒ“แƒแƒœ GIT-แƒ›แƒ“แƒ”.

แƒ“แƒ แƒฃแƒ‘แƒ˜แƒซแƒ’แƒ”แƒ‘แƒก แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒก Teamcity-แƒจแƒ˜ แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒฃแƒš แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒจแƒ˜ %BRANCH_FOR_INCREMENT% แƒชแƒ•แƒšแƒแƒ“แƒ˜แƒ—

# ะ—ะดะตััŒ ะฟะพะปัƒั‡ะฐะตะผ developerConnection ะธะท ั„ะฐะนะปะฐ pom.xml
developerConnection=$(xmllint -xpath "/*[local-name() = 'project' ]//*[local-name() = 'developerConnection']/text()" pom.xml | sed  's|scm:git:ssh://||')
echo developerConnection
# ะ—ะดะตััŒ ะผะตะฝัะตะผ / ะฝะฐ : ะฒ URL ะดะปั git_remote_url
git_remote_url=$(echo $developerConnection| sed 's/gitlab.com//gitlab.com:/g')
echo git_remote_url
echo $git_remote_url

git remote set-url origin $git_remote_url

# ะ•ัะปะธ ะฒั‹ ะฝะต ะธัะฟะพะปัŒะทัƒะตั‚ะต ะฒะฒัั‚ั€ะพะตะฝะฝัƒัŽ ะฒะพะทะผะพะถะฝะพัั‚ัŒ Teamcity ะฟะพะปัƒั‡ะตะฝะธั user ะธ email ะธะท ~/.gitconfig, ั‚ะพ ะผะพะถะฝะพ ัƒะบะฐะทะฐั‚ัŒ ะธั… ะทะดะตััŒ
echo 'git config user.name %TEAM_USER%'
git config user.name %TEAM_USER%
echo 'git config user.email %TEAM_USER_EMAIL%'
git config user.email %TEAM_USER_EMAIL%
echo 'git add .'
git add .
echo 'git commit -m "Increment bugfix"'
git commit -m "Increment bugfix"

git push --set-upstream origin %BRANCH_FOR_INCREMENT%

HotFix-แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ Maven แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒจแƒ˜ TeamCity-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แƒ›แƒ”แƒฎแƒฃแƒ—แƒ” แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜ แƒแƒ แƒ˜แƒก แƒคแƒแƒ˜แƒšแƒ˜แƒ“แƒแƒœ แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒ pom.xml แƒ•แƒ”แƒ แƒกแƒ˜แƒ แƒ“แƒ แƒ“แƒแƒแƒ˜แƒœแƒกแƒขแƒแƒšแƒ˜แƒ แƒ”แƒ‘แƒก แƒ›แƒแƒกแƒจแƒ˜ แƒ’แƒฃแƒœแƒ“แƒฃแƒ แƒ˜ แƒฅแƒแƒšแƒแƒฅแƒ˜ แƒชแƒ•แƒšแƒแƒ“แƒ˜ TAG_FROM_VERSION. แƒ’แƒแƒ˜แƒ—แƒ•แƒแƒšแƒ˜แƒกแƒฌแƒ˜แƒœแƒ”แƒ—, แƒ แƒแƒ› แƒ•แƒ”แƒ แƒกแƒ˜แƒ แƒคแƒแƒ˜แƒšแƒ˜แƒ“แƒแƒœ pom.xml V แƒแƒกแƒแƒก แƒ’แƒแƒ แƒ”แƒจแƒ” แƒฌแƒ˜แƒœ. แƒ“แƒ แƒขแƒ”แƒ’แƒก, แƒแƒ› แƒ•แƒ”แƒ แƒกแƒ˜แƒแƒ–แƒ” แƒ“แƒแƒงแƒ แƒ“แƒœแƒแƒ‘แƒ˜แƒ—, แƒฃแƒ™แƒ•แƒ” แƒแƒฅแƒ•แƒก แƒแƒกแƒ v แƒ“แƒแƒกแƒแƒฌแƒงแƒ˜แƒกแƒจแƒ˜.

echo "Get version package from pom.xml"
VERSION_AFTER_CHANGE=`python -c "import xml.etree.ElementTree as ET; print(ET.parse(open('pom.xml')).getroot().find('{http://maven.apache.org/POM/4.0.0}version').text)"`
echo $VERSION_AFTER_CHANGE
echo "##teamcity[setParameter name='TAG_FROM_VERSION' value='v$VERSION_AFTER_CHANGE']"

HotFix-แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ Maven แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒจแƒ˜ TeamCity-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แƒ›แƒ”แƒ”แƒฅแƒ•แƒกแƒ” แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜ - แƒ›แƒแƒœแƒ˜แƒจแƒ•แƒœแƒ แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ แƒ•แƒ”แƒ แƒกแƒ˜แƒ”แƒ‘แƒ˜. แƒ”แƒก แƒ™แƒ”แƒ—แƒ“แƒ”แƒ‘แƒ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— Maven แƒกแƒแƒญแƒ˜แƒ แƒ แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ˜แƒ— แƒ›แƒ˜แƒ–แƒแƒœแƒ˜.

แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ˜ แƒ›แƒ˜แƒ–แƒœแƒ”แƒ‘แƒ˜:

-Dtag=%TAG_FROM_VERSION% scm:tag

HotFix-แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ Maven แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒจแƒ˜ TeamCity-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

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

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