(เชเชฟเชคเซเชฐ เชฆเซเชตเชพเชฐเชพ
เชนเซเชฒเซ!
เชฎเชพเชฐเซเช เชจเชพเชฎ เชเซ เชเชตเชเซเชจเซ เชเซเชฐเซเชเชฟเชจ, เชนเซเช เชเชพเชฃเชเชพเชฎ เชเชเชชเชจเซเชฎเชพเช เชตเชฟเชเชพเชธ เชเซเชฎเชฎเชพเช เชชเซเชฐเซเชเซเชฐเชพเชฎเชฐ เชเซเช เชชเซเชฒเชฟเชฎเซเชเชฒ.
เชเซเชเชชเชฃ เชฎเซเชเซ เชชเซเชฐเซเชเซเชเซเช เชถเชฐเซ เชเชฐเชคเซ เชตเชเชคเซ, เชคเชฎเซ เชตเชฟเชเชพเชฐเชตเชพเชจเซเช เชถเชฐเซ เชเชฐเซ เชเซ: "เชคเซเชจเซ เชเชพเชณเชตเชตเชพ เชฎเชพเชเซ เชเชฏเชพ เชธเซเชซเซเชเชตเซเชฐเชจเซ เชเชชเชฏเซเช เชเชฐเชตเซ เชถเซเชฐเซเชทเซเช เชเซ?" เชเชเชฒเซเช เชธเชเชธเซเชเชฐเชฃ เชฌเชนเชพเชฐ เชชเชพเชกเชคเชพ เชชเชนเซเชฒเชพ IT เชชเซเชฐเซเชเซเชเซเช เชธเชเชเซเชฏเชพเชฌเชเชง เชคเชฌเชเซเชเชพเชเชฎเชพเชเชฅเซ เชชเชธเชพเชฐ เชฅเชพเชฏ เชเซ. เชเซเชฏเชพเชฐเซ เช เชคเชฌเชเซเชเชพเชเชจเซ เชธเชพเชเชเชณ เชธเซเชตเชฏเชเชธเชเชเชพเชฒเชฟเชค เชนเซเชฏ เชคเซเชฏเชพเชฐเซ เชคเซ เชธเชพเชฐเซเช เชเซ. เชเชเชเซ เชชเซเชฐเซเชเซเชเซเชเชจเชพ เชจเชตเชพ เชธเชเชธเซเชเชฐเชฃเชจเซ เชชเซเชฐเชเชพเชถเชฟเชค เชเชฐเชตเชพเชจเซ เชธเซเชตเชฏเชเชธเชเชเชพเชฒเชฟเชค เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชนเซเชตเชพเชฎเชพเช เชเชตเซ เชเซ เชธเชคเชค เชเชเซเชเชฐเชฃ. เชฌเชฟเชฒเซเชกเชฌเซเช เช เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเชพ เช เชฎเชฒเซเชเชฐเชฃเชฎเชพเช เช เชฎเชพเชฐเชพ เชฎเชพเชเซ เชธเชพเชฐเซ เชธเชนเชพเชฏเช เชฌเชจเซเชฏเซ.
เช เชฒเซเชเชฎเชพเช เชฎเซเช เชถเชเซเชฏเชคเชพเชเชจเซ เชเชพเชเชเซ เชเชชเชตเชพเชจเซเช เชจเชเซเชเซ เชเชฐเซเชฏเซเช เชเซ เชฌเชฟเชฒเซเชกเชฌเซเช. เช เชธเซเชซเซเชเชตเซเชฐ เชถเซเช เชธเชเซเชทเชฎ เชเซ? เชคเซเชจเซ เชธเชพเชฅเซ เชเซเชตเซ เชฐเซเชคเซ เชธเชเชชเชฐเซเช เชเชฐเชตเซ เช
เชจเซ เชคเซเชจเซ เชธเชพเชฅเซ เชธเชพเชฎเชพเชจเซเชฏ เช
เชธเชฐเชเชพเชฐเช เชเชพเชฐเซเชฏ เชธเชเชฌเชเชง เชเซเชตเซ เชฐเซเชคเซ เชฌเชจเชพเชตเชตเซ? เชคเชฎเซ เชคเชฎเชพเชฐเชพ เชฎเชถเซเชจ เชชเชฐ เชคเชฎเชพเชฐเชพ เชชเซเชฐเซเชเซเชเซเชเชจเชพ เชจเชฟเชฐเซเชฎเชพเชฃ เช
เชจเซ เชชเชฐเซเชเซเชทเชฃ เชฎเชพเชเซ เชเชพเชฐเซเชฏเชเชพเชฐเซ เชธเซเชตเชพ เชฌเชจเชพเชตเซเชจเซ เช
เชฎเชพเชฐเซ เช
เชจเซเชญเชต เชเชพเชคเซ เชฒเชพเชเซ เชเชฐเซ เชถเชเซ เชเซ.
เช
เชจเซเชเซเชฐเชฎเชฃเชฟเชเชพ
เช เชจเซเชเซเชฐเชฎเชฃเชฟเชเชพ
1. เชถเชพ เชฎเชพเชเซ เชฌเชฟเชฒเซเชกเชฌเซเช?
เช
เชเชพเช habr-e เชชเชฐ เชฎเชจเซ เช
เชฎเชฒเซเชเชฐเชฃ เชตเชฟเชถเซเชจเชพ เชฒเซเชเซ เชฎเชณเซเชฏเชพ เชธเชคเชค เชเชเซเชเชฐเชฃ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชฌเชฟเชฒเซเชกเชฌเซเช. เชฆเชพเชเซเชฒเชพ เชคเชฐเซเชเซ,
เชฌเชเชง! เชถเซเช เชเซเชเช เชเชฐเซเชเชฐ เชคเซเชจเซ เชเชชเชฏเซเช เชคเซเชฎเชจเชพ เชชเซเชฐเซเชเซเชเซเชเซเชธเชฎเชพเช เชเชฐเซเชฏเซ เชเซ? เชคเซ เชนเชพ เชฌเชนเชพเชฐ เชตเชณเซ เชเซ
เชคเซ เชฒเซเชเซ เชถเซเช เชคเชฐเซเช เชตเชพเชชเชฐเซ เชเซ เชฌเชฟเชฒเซเชกเชฌเซเช? เชเซเชตเชเซ, เชคเซเชฏเชพเช เช เชจเซเชฏ เชธเชพเชงเชจเซ เชเซ: เชเซเชฐเซเช เชจเชฟเชฏเชเชคเซเชฐเชฃ ะธ เชเซเชจเชเชฟเชจเซเชธ. เชนเซเช เช เชฐเซเชคเซ เชเชตเชพเชฌ เชเชชเซเชถ. เชฎเซเชเชพ เชญเชพเชเชจเชพ เชเชพเชฐเซเชฏเซ เชฎเชพเชเซ เชเซเชจเชเชฟเชจเซเชธ เช เชจเซ เชธเชคเซเชฏ เชชเซเชฐเชคเซเช เชนเชถเซ. เชคเซเชจเชพ เชฌเชฆเชฒเชพเชฎเชพเช, เชฌเชฟเชฒเซเชกเชฌเซเช - เชตเชงเซ เช เชจเซเชเซเชฒเชจเชถเซเชฒ, เชเซเชฏเชพเชฐเซ เชธเชฎเชธเซเชฏเชพเช เชคเซเชฏเชพเช เชเซเชเชฒเซ เชธเชฐเชณ เชฐเซเชคเซ เชเชเซเชฒเชตเชพเชฎเชพเช เชเชตเซ เชเซ เชเซเชจเชเชฟเชจเซเชธ. เชชเชธเชเชฆเชเซ เชคเชฎเชพเชฐเซ เชเซ. เชชเชฐเชเชคเซ เช เชฎเซ เชตเชฟเชเชพเชธเชถเซเชฒ เชฒเชเซเชทเซเชฏ เชชเซเชฐเซเชเซเชเซเช เชฎเชพเชเซ เชเช เชธเชพเชงเชจ เชถเซเชงเซ เชฐเชนเซเชฏเชพ เชนเซเชตเชพเชฅเซ, เชถเชพ เชฎเชพเชเซ เชธเชฐเชณ เชชเชเชฒเชพเชเชฅเซ เชถเชฐเซ เชเชฐเซเชจเซ, เชเซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเชเซเชฐเชฟเชฏเชพ เช เชจเซ เช เชจเชจเซเชฏ เชเชจเซเชเชฐเชซเซเชธ เชงเชฐเชพเชตเชคเซ เชฌเชฟเชฒเซเชก เชธเชฟเชธเซเชเชฎ เชฎเซเชณเชตเชตเชพ เชฎเชพเชเซ เชชเชฐเชตเชพเชจเชเซ เชเชชเซ เชคเซเชตเซเช เชเช เชชเชธเชเชฆ เชจ เชเชฐเซ.
เชเซเชฎเชจเซ เชเชพเชฐเซเชเซเช เชชเซเชฐเซเชเซเชเซเช เช เชเชเชฐเชฎเชพเช เชฒเชเชพเชฏเซเชฒเซ เชเซ, เชคเซเชฎเชจเชพ เชฎเชพเชเซ เชชเซเชฐเชถเซเชจ เชเชญเซ เชฅเชพเชฏ เชเซ: "เชชเซเชฐเซเชเซเชเซเชเชฎเชพเช เชตเชชเชฐเชพเชคเซ เชญเชพเชทเชพเชจเชพ เชธเชเชฆเชฐเซเชญเชฎเชพเช เชธเซเชชเชทเซเช เชเชจเซเชเชฐเชซเซเชธ เชงเชฐเชพเชตเชคเซ เชเชเซเชเชฐเชฃ เชธเชฟเชธเซเชเชฎ เชเซเชฎ เชชเชธเชเชฆ เชจ เชเชฐเชตเซ?" เช เชจเซ เชนเชตเซ เชฒเชพเชญเซ เชฐเชเซ เชเชฐเชตเชพเชจเซ เชธเชฎเชฏ เชเซ เชฌเชฟเชฒเซเชกเชฌเซเช.
เชคเซเชฅเซ, เช เชฎเชพเชฐเซ "เชตเชพเชฆเซเชฏ เชเซเชเชกเซ". เชฎเชพเชฐเชพ เชฎเชพเชเซ, เชฎเซเช เชเชพเชฐ เชฒเชเซเชทเชฃเซ เชเชณเชเซเชฏเชพ เชเซ เชฌเชฟเชฒเซเชกเชฌเซเช:
- เชคเซ GPL เชฒเชพเชฏเชธเชจเซเชธ เชนเซเช เชณ เชเช เชเชชเชจ เชธเซเชฐเซเชธ เชซเซเชฐเซเชฎเชตเชฐเซเช เชเซ
- เช เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชธเชพเชงเชจ เชคเชฐเซเชเซ เชชเชพเชฏเชฅเซเชจเชจเซ เชเชชเชฏเซเช เช เชจเซ เชเชฐเซเชฐเซ เชเซเชฐเชฟเชฏเชพเชเชจเซเช เชตเชฐเซเชฃเชจ เชเซ
- เชเซ เชฎเชถเซเชจ เชชเชฐ เชเชธเซเชฎเซเชฌเชฒเซ เชฅเชพเชฏ เชเซ เชคเซเชฎเชพเชเชฅเซ เชชเซเชฐเชคเชฟเชธเชพเชฆ เชฎเซเชณเชตเชตเชพเชจเซ เช เชเช เชคเช เชเซ
- เช, เชเซเชตเชเซ, เชฏเชเชฎเชพเชจ เชฎเชพเชเซเชจเซ เชจเซเชฏเซเชจเชคเชฎ เชเชตเชถเซเชฏเชเชคเชพเช เชเซ. เชเชฎเชพเชตเช เชฎเชพเชเซ เชชเชพเชฏเชฅเซเชจ เช เชจเซ เชเซเชตเชฟเชธเซเชเซเชกเชจเซ เชเชฐเซเชฐ เชเซ, เช เชจเซ เชตเชฐเซเชเซเชฏเซเช เชฒ เชฎเชถเซเชจ เช เชจเซ เชเชพเชตเชพ เชฎเชถเซเชจเชจเซ เชเชฐเซเชฐ เชจเชฅเซ.
2. เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชเชฐเชจเซ เชเชเซเชตเชพเชจเซ เชนเซเช เชณเชจเซ เชเซเชฏเชพเชฒ
เชเชพเชฐเซเชฏ เชตเชฟเชคเชฐเชฃ เชเชฐเซเชเชฟเชเซเชเซเชเชฐเชฎเชพเช เชเซเชจเซเชฆเซเชฐเชฟเชฏ เชเซ เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชเชฐ. เชคเซ เชเช เชธเซเชตเชพ เชเซ เชเซ:
- เชเซเชฐเซเช เชฐเชพเชเซ เชเซ เชชเซเชฐเซเชเซเชเซเช เชธเซเชคเซเชฐเซเชค เชตเซเชเซเชทเชฎเชพเช เชซเซเชฐเชซเชพเชฐเซ
- เชฎเซเชเชฒเซ เชเซ เชเชฆเซเชถเซ เชเซ เชเซ เชชเซเชฐเซเชเซเชเซเช เชฌเชจเชพเชตเชตเชพ เช เชจเซ เชคเซเชจเซเช เชชเชฐเซเชเซเชทเชฃ เชเชฐเชตเชพ เชฎเชพเชเซ เชเชพเชฐเซเชฏเชเชฐ เชธเซเชตเชพ เชฆเซเชตเชพเชฐเชพ เช เชฎเชฒเชฎเชพเช เชฎเซเชเชตเชพ เชเซเชเช
- เชธเซเชเชฟเชค เชเชฐเซ เชเซ เชฒเซเชตเชพเชฎเชพเช เชเชตเซเชฒเชพ เชชเชเชฒเชพเชเชจเชพ เชชเชฐเชฟเชฃเชพเชฎเซ เชตเชฟเชถเซ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเช
เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชเชฐ เชซเชพเชเชฒ เชฆเซเชตเชพเชฐเชพ เชเซเช เชตเซเชฒ master.cfg. เช เชซเชพเชเชฒ เชฐเซเชเชฎเชพเช เชเซ เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชเชฐ. เชชเชเซ เชนเซเช เชฌเชคเชพเชตเซเชถ เชเซ เช เชฐเซเช เชเซเชตเซ เชฐเซเชคเซ เชฌเชจเซ เชเซ. เชซเชพเชเชฒ เชชเซเชคเซ master.cfg เชเช เชชเชพเชฏเชฅเซเชจ เชธเซเชเซเชฐเชฟเชชเซเช เชงเชฐเชพเชตเซ เชเซ เชเซ เชเซเชฒเซเชธเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ เชฌเชฟเชฒเซเชกเชฌเซเช.
เชเชเชพเชฎเซ เชธเซเชฅเซ เชฎเชนเชคเซเชตเชชเซเชฐเซเชฃ เชชเชฆเชพเชฐเซเชฅ เชฌเชฟเชฒเซเชกเชฌเซเช เชเช เชจเชพเชฎ เชเซ เชเชพเชฎเชฆเชพเชฐ. เช เชธเซเชตเชพเชจเซ เช เชจเซเชฏ เชนเซเชธเซเช เชชเชฐ เช เชฒเช OS เชธเชพเชฅเซ เช เชฅเชตเชพ เชเชฆเชพเช เชเช เชชเชฐ เชฒเซเชเช เชเชฐเซ เชถเชเชพเชฏ เชเซ เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชเชฐ. เชคเซ เชคเซเชจเชพ เชชเซเชคเชพเชจเชพ เชชเซเชเซเชเซ เช เชจเซ เชเชฒเซ เชธเชพเชฅเซ เชเชพเชธ เชคเซเชฏเชพเชฐ เชตเชฐเซเชเซเชฏเซเช เชฒ เชตเชพเชคเชพเชตเชฐเชฃเชฎเชพเช เชชเชฃ เช เชธเซเชคเชฟเชคเซเชต เชงเชฐเชพเชตเซ เชเซ. เช เชตเชฐเซเชเซเชฏเซเช เชฒ เชตเชพเชคเชพเชตเชฐเชฃเชจเซ เชชเชพเชฏเชฅเซเชจ เชฏเซเชเชฟเชฒเชฟเชเซเชเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชคเซเชฏเชพเชฐ เชเชฐเซ เชถเชเชพเชฏ เชเซ virtualenv, venv.
เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชเชฐ เชฆเชฐเซเชเชจเซ เชเชฆเซเชถเซเชจเซเช เชชเซเชฐเชธเชพเชฐเชฃ เชเชฐเซ เชเซ เชเชพเชฎเชฆเชพเชฐ-y, เช เชจเซ เชคเซ, เชฌเชฆเชฒเชพเชฎเชพเช, เชคเซเชฎเชจเซ เชชเชฐเชฟเชชเซเชฐเซเชฃ เชเชฐเซ เชเซ. เชเชเชฒเซ เชเซ, เชคเซ เชคเชพเชฐเชฃ เชเชชเซ เชเซ เชเซ เชชเซเชฐเซเชเซเชเซเช เชฌเชจเชพเชตเชตเชพ เช เชจเซ เชชเชฐเซเชเซเชทเชฃ เชเชฐเชตเชพเชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชพเชฒเซ เชฅเช เชถเชเซ เชเซ เชเชพเชฎเชฆเชพเชฐ-e เชตเชฟเชจเซเชกเซเช เชเชฒเชพเชตเซ เชฐเชนเซเชฏเชพ เชเซ เช เชจเซ Linux เชเชฒเชพเชตเชคเชพ เช เชจเซเชฏ เชตเชฐเซเชเชฐ เชชเชฐ.
เชเซเชเชเชเช เชชเซเชฐเซเชเซเชเซเช เชธเซเชคเซเชฐเซเชค เชเซเชก เชฆเชฐเซเช เชชเชฐ เชฅเชพเชฏ เชเซ เชเชพเชฎเชฆเชพเชฐ-e.
3. เชธเซเชฅเชพเชชเชจ
เชคเซ, เชเชพเชฒเซ เชเชเช. เชนเซเช เชฏเชเชฎเชพเชจ เชคเชฐเซเชเซ เชเชฌเซเชจเซเชเซ 18.04 เชจเซ เชเชชเชฏเซเช เชเชฐเซเชถ. เชนเซเช เชคเซเชจเชพ เชชเชฐ เชเช เชฎเซเชเซเชถ เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชเชฐ-เช เช เชจเซ เชเช เชเชพเชฎเชฆเชพเชฐ-a เชชเชฐเชเชคเซ เชชเซเชฐเชฅเชฎ เชคเชฎเชพเชฐเซ python3.7 เชเชจเซเชธเซเชเซเชฒ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ:
sudo apt-get update
sudo apt-get install python3.7
เชเซเชฎเชจเซ 3.7.2 เชจเซ เชฌเชฆเชฒเซ python3.7.1 เชจเซ เชเชฐเซเชฐ เชเซ, เชคเชฎเซ เชจเซเชเซ เชฎเซเชเชฌ เชเชฐเซ เชถเชเซ เชเซ:
sudo apt-get update
sudo apt-get software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get install python3.7
sudo ln -fs /usr/bin/python3.7 /usr/bin/python3
pip3 install --upgrade pip
เชเชเชณเชจเซเช เชชเชเชฒเซเช เชเชจเซเชธเซเชเซเชฒ เชเชฐเชตเชพเชจเซเช เชเซ เชเซเชตเซเช เชเชฐเซเชฏเซเช ะธ เชฌเชฟเชฒเซเชกเชฌเซเช, เชคเซเชฎเช เชชเซเชเซเชเซ เชเซ เชเซ เชคเชฎเชจเซ เชตเชงเชพเชฐเชพเชจเซ เชเชพเชฐเซเชฏเชเซเชทเชฎเชคเชพ เชตเชพเชชเชฐเชตเชพ เชฎเชพเชเซ เชชเชฐเชตเชพเชจเชเซ เชเชชเซ เชเซ เชฌเชฟเชฒเซเชกเชฌเซเช-เช.
/*ะัะต ััะพ ะฟะพะด sudo ะฑัะดะตั ัััะฐะฝะพะฒะปะตะฝะฝะพ ะดะปั ะฒัะตั
ะฟะพะปัะทะพะฒะฐัะตะปะตะน ะฒ ะดะธัะตะบัะพัะธั /usr/local/lib/python3.7/dist-packages*/
#ะะฐ ั
ะพััะต ะบะพัะพััะน ะฟัะพะธะทะฒะพะดะธั ะผะพะฝะธัะพัะธะฝะณ Worker-ะพะฒ
sudo pip install twisted #ะะธะฑะปะธะพัะตะบะฐ twisted
sudo pip install buildbot #BuildMaster
#ะะพะฟะพะปะฝะธัะตะปัะฝัะน ััะฝะบัะธะพะฝะฐะป
pip install pysqlite3 #ะฃััะฐะฝะฐะฒะปะธะฒะฐะตะผ ะฑะฐะทั sqllite ะฒ ััะตะฑะฝัั
ัะตะปัั
pip install jinja2 #framework ะฝะฐะฟะพะดะพะฑะธะต django, ะดะปั web ะธ ะดะปั ะฟะพััะพะฒัั
ัะฐัััะปะปะพะบ
pip install autobahn #Web cะพะบะตัั ะดะปั ัะฒัะทะธ BuildMaster->Worker
pip install sqlalchemy sqlalchemy-migrate #ะะปั ะพัะพะฑัะฐะถะตะฝะธั ัั
ะตะผั ะฑะฐะทั ะดะฐะฝะฝัั
#ะะปั Web ะพัะพะฑัะฐะถะตะฝะธั BuildBot-a
pip install buildbot-www buildbot-grid-view buildbot-console-view buildbot-waterfall-view
pip install python-dateutil #ะัะพะฑัะฐะถะตะฝะธะต ะดะฐั ะฒ web
#ะะฐ ััะพัะพะฝะต ั
ะพััะฐ ะบะพัะพััะน ะฝะตะฟะพััะตะดััะฒะตะฝะฝะพ ะพัััะตััะฒะปัะตั ัะฑะพัะบั ะธ ัะตััะธัะพะฒะฐะฝะธะต
pip install buildbot-worker #Worker
#ะะพะฟะพะปะฝะธัะตะปัะฝัะน ััะฝะบัะธะพะฝะฐะป
sudo pip install virtualenv #ะะธัััะฐะปัะฝะฐั ััะตะดะฐ
4. เชชเซเชฐเชฅเชฎ เชชเชเชฒเชพเช
เชฌเชจเชพเชตเชตเชพเชจเซ เชธเชฎเชฏ เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชเชฐ. เชคเซ เช เชฎเชพเชฐเชพ เชซเซเชฒเซเชกเชฐเชฎเชพเช เชนเชถเซ /home/habr/master.
mkdir master
buildbot create-master master # ะกะพะฑััะฒะตะฝะฝะพ ัะดะตัั ะธ ัะพะทะดะฐะตะผ
mkdir worker
buildbot-worker create-worker --umask=0o22 --keepalive=60 worker localhost:4000 yourWorkerName password
เชเซเชฏเชพเชฐเซ เชคเชฎเซ เชเชฒเชพเชตเซ เชเซ เชเชพเชฎเชฆเชพเชฐ, เชชเชเซ เชฎเซเชณเชญเซเชค เชฐเซเชคเซ เชคเซ เชฎเชพเช เชฌเชจเชพเชตเชถเซ /home/habr/worker เชชเซเชฐเซเชเซเชเซเชเชจเชพ เชจเชพเชฎ เชธเชพเชฅเซ เชซเซเชฒเซเชกเชฐ, เชเซเชฎเชพเช เชเชฒเซเชฒเซเชเชฟเชค เชเซ master.cfg. เช เชจเซ เชชเซเชฐเซเชเซเชเซเชเชจเชพ เชจเชพเชฎ เชธเชพเชฅเซเชจเชพ เชซเซเชฒเซเชกเชฐเชฎเชพเช เชคเซ เชกเชฟเชฐเซเชเซเชเชฐเซ เชฌเชจเชพเชตเชถเซ เชฌเชฟเชฒเซเชก เชเชฐเซ, เช เชจเซ เชคเซ เชเชฐเชตเชพเชจเซเช เชเชพเชฒเซ เชฐเชพเชเชถเซ เชเซเชเชเชเช. เชฎเชพเชเซ เชเชพเชฐเซเชฏเชเชพเชฐเซ เชจเชฟเชฐเซเชฆเซเชถเชฟเชเชพ เชเชพเชฎเชฆเชพเชฐ-เช เชจเซ เชคเซ เชกเชฟเชฐเซเชเซเชเชฐเซ เชฌเชจเซ เชเชถเซ /home/habr/yourProject/build.
"เชเซเชฒเซเชกเชจ เชเซ
เช
เชจเซ เชนเชตเซ เชฎเซเช เชชเชพเชเชฒเซ เชซเชเชฐเซ เชเซเชจเชพ เชฎเชพเชเซ เชฒเชเซเชฏเซ เชเซ: เชเช เชธเซเชเซเชฐเชฟเชชเซเช เชเซ เชเซ เชฎเชพเชธเซเชเชฐ เชชเชพเชธเซเชฅเซ เชฎเชพเชเชเชฃเซ เชเชฐเชถเซ เชเชพเชฎเชฆเชพเชฐ-เช
เชจเซ เช เชจเชฟเชฐเซเชฆเซเชถเชฟเชเชพเชฎเชพเช เชฆเซเชฐเชธเซเชฅ เชฐเซเชคเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ เชคเซ เชเชฒเชพเชตเชตเชพเชฎเชพเช เชเชตเชถเซ เชจเชนเซเช เชเชพเชฐเชฃ เชเซ เชธเซเชเซเชฐเชฟเชชเซเชเชจเซ เชเชฒเชพเชตเชตเชพเชจเชพ เช
เชงเชฟเชเชพเชฐเซ เชจเชฅเซ. เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟเชจเซ เชธเซเชงเชพเชฐเชตเชพ เชฎเชพเชเซ, เชคเชฎเชพเชฐเซ เชเซเชจเซ เชเชฐเซเชฐ เชชเชกเชถเซ
เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชเชฐ ะธ เชเชพเชฎเชฆเชพเชฐ เชเชเชฌเซเชเชพ เชธเชพเชฅเซ เชเซเชกเชพเชฃ เชธเซเชฅเชพเชชเชฟเชค เชเชฐเซ. เชเชตเซเช เชฌเชจเซ เชเซ เชเซ เชคเซ เชคเซเชเซ เชเชพเชฏ เชเซ เช เชจเซ เชเชพเชฎเชฆเชพเชฐ เชคเชฐเชซเชฅเซ เชชเซเชฐเชคเชฟเชธเชพเชฆ เชฎเชพเชเซ เชฅเซเชกเซ เชธเชฎเชฏ เชฐเชพเชน เชเซเช เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชเชฐ-เช. เชเซ เชคเซเชฏเชพเช เชเซเช เชชเซเชฐเชคเชฟเชธเชพเชฆ เชจเชฅเซ, เชคเซ เชเชจเซเชเซเชถเชจ เชชเซเชจเชเชชเซเชฐเชพเชฐเชเชญ เชฅเชพเชฏ เชเซ. เชเซ --keepalive=60 เชซเชเซเชค เชคเซ เชชเชเซเชจเซ เชธเชฎเชฏ เชธเซเชเชตเชตเชพ เชฎเชพเชเซ เชเชฐเซเชฐเซ เชเซ เชเซเชกเชพเชตเชพ เชฐเซเชฌเซเช
5. เชฐเซเชชเชฐเซเชเชพเชเชเชจ. เชธเซเชเซเชช เชฌเชพเชฏ เชธเซเชเซเชช เชฐเซเชธเซเชชเซ
เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชเชฐ เชฎเชถเซเชจเชจเซ เชฌเชพเชเซเช เชนเชพเชฅ เชงเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ เชเซเชฏเชพเช เช เชฎเซ เชเชฆเซเชถเชจเซ เช เชฎเชฒ เชเชฐเซเชฏเซ เชนเชคเซ เชธเชฐเซเชเชจ-เชฎเชพเชธเซเชเชฐ. เช เชฎเชพเชฐเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช, เช เชเช เชกเชฟเชฐเซเชเซเชเชฐเซ เชเซ /home/habr/master. เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชซเชพเชเชฒ master.cfg เชนเชเซ เชธเซเชงเซ เช เชธเซเชคเชฟเชคเซเชตเชฎเชพเช เชจเชฅเซ, เชชเชฐเชเชคเซ เชเชฆเซเชถ เชชเซเชคเซ เชชเชนเซเชฒเชพเชฅเซ เช เชซเชพเชเชฒ เชฌเชจเชพเชตเซเชฒ เชเซ master.cmg.sample. เชคเชฎเชพเชฐเซ เชคเซเชจเซเช เชจเชพเชฎ เชฌเชฆเชฒเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ master.cfg.sample ะฒ master.cfg
mv master.cfg.sample master.cfg
เชเชพเชฒเซ เชเชจเซ เชเซเชฒเซเช master.cfg. เช เชจเซ เชเชพเชฒเซ เชเซเชเช เชเซ เชคเซ เชถเซเช เชธเชฎเชพเชตเซ เชเซ. เช เชจเซ เชคเซ เชชเชเซ, เชเชพเชฒเซ เชเชชเชฃเซ เชชเซเชคเชพเชจเซ เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชซเชพเชเชฒ เชฌเชจเชพเชตเชตเชพเชจเซ เชชเซเชฐเชฏเชคเซเชจ เชเชฐเซเช.
master.cfg
c['change_source'] = []
c['change_source'].append(changes.GitPoller(
'git://github.com/buildbot/hello-world.git',
workdir='gitpoller-workdir', branch='master',
pollInterval=300))
c['schedulers'] = []
c['schedulers'].append(schedulers.SingleBranchScheduler(
name="all",
change_filter=util.ChangeFilter(branch='master'),
treeStableTimer=None,
builderNames=["runtests"]))
c['schedulers'].append(schedulers.ForceScheduler(
name="force",
builderNames=["runtests"]))
factory = util.BuildFactory()
factory.addStep(steps.Git(repourl='git://github.com/buildbot/hello-world.git', mode='incremental'))
factory.addStep(steps.ShellCommand(command=["trial", "hello"],
env={"PYTHONPATH": "."}))
c['builders'] = []
c['builders'].append(
util.BuilderConfig(name="runtests",
workernames=["example-worker"],
factory=factory))
c['services'] = []
c['title'] = "Hello World CI"
c['titleURL'] = "https://buildbot.github.io/hello-world/"
c['buildbotURL'] = "http://localhost:8010/"
c['www'] = dict(port=8010,
plugins=dict(waterfall_view={}, console_view={}, grid_view={}))
c['db'] = {
'db_url' : "sqlite:///state.sqlite",
}
5.1 BuildmasterConfig
c = BuildmasterConfig = {}
BuildmasterConfig โ เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชซเชพเชเชฒเชจเซ เชฎเซเชณเชญเซเชค เชถเชฌเซเชฆเชเซเชถ. เชคเซ เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชซเชพเชเชฒเชฎเชพเช เชถเชพเชฎเซเชฒ เชนเซเชตเซเช เชเชตเชถเซเชฏเช เชเซ. เชเชชเชฏเซเชเชฎเชพเช เชธเชฐเชณเชคเชพ เชฎเชพเชเซ, เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชเซเชกเชฎเชพเช เชเชชเชจเชพเชฎ เชฐเชเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชเซ "c". เชถเซเชฐเซเชทเชเซ
5.2 เชเชพเชฎเชฆเชพเชฐเซ
c['workers'] = [worker.Worker("example-worker", "pass")]
เช เชตเชเชคเซ เช
เชฎเซ เชธเซเชเชตเซเช เชเซเช เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชเชฐ-y เชจเซ เชฏเชพเชฆเซ เชเชพเชฎเชฆเชพเชฐ-เช. เชฎเชพเชฐเซ เชเชพเชค เชเชพเชฎเชฆเชพเชฐ เช
เชฎเซ เชฌเชจเชพเชตเซเชฏเซเช
5.3 เชซเซเชฐเชซเชพเชฐ_เชธเซเชฐเซเชค
c['change_source'] = []
c['change_source'].append(changes.GitPoller(
'git://github.com/buildbot/hello-world.git',
workdir='gitpoller-workdir', branch='master',
pollInterval=300))
เชเซ เชฆเซเชตเชพเชฐเชพ เชซเซเชฐเชซเชพเชฐ_เชธเซเชฐเซเชค เชถเชฌเซเชฆเชเซเชถ c เช เชฎเชจเซ เชธเซเชเชฟเชจเซ เชเชเซเชธเซเชธ เชฎเชณเซ เชเซ เชเซเชฏเชพเช เช เชฎเซ เชเช เชเชฌเซเชเซเชเซเช เชฎเซเชเชตเชพ เชฎเชพเชเชเซเช เชเซเช เชเซ เชชเซเชฐเซเชเซเชเซเชเชจเชพ เชธเซเชฐเซเชค เชเซเชก เชธเชพเชฅเซ เชฐเชฟเชชเซเชเซเชเชฐเซเชจเซเช เชฎเชคเชฆเชพเชจ เชเชฐเซ เชเซ. เชเชฆเชพเชนเชฐเชฃ เชเชฟเช เชฐเชฟเชชเซเชเซเชเชฐเซเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ เชเซ เชเซเชเซเชเชธ เช เชเชคเชฐเชพเชฒเซ เชชเชฐ เชฎเชคเชฆเชพเชจ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ.
เชชเซเชฐเชฅเชฎ เชฆเชฒเซเชฒ เช เชคเชฎเชพเชฐเชพ เชญเชเชกเชพเชฐเชจเซ เชฎเชพเชฐเซเช เชเซ.
เชตเชฐเซเชเชกเซเชฐ เชซเซเชฒเซเชกเชฐ เชเซเชฏเชพเช เชฌเชพเชเซ เชชเชฐ เชเซ เชคเซเชจเชพ เชชเชพเชฅเชจเซ เชฐเชเซ เชเชฐเซ เชเซ เชเชพเชฎเชฆเชพเชฐ- เชฎเชพเชฐเซเช เชธเชพเชฅเซ เชธเชเชฌเชเชงเชฟเชค /home/habr/worker/yourProject/build git เชฐเซเชชเซเชเซเชเชฐเซเชจเชพ เชธเซเชฅเชพเชจเชฟเช เชธเชเชธเซเชเชฐเชฃเชจเซ เชธเชเชเซเชฐเชนเชฟเชค เชเชฐเชถเซ.
เชถเชพเชเชพ เชฐเชฟเชชเซเชเซเชเชฐเซเชฎเชพเช เชเซเชเซเชเชธ เชถเชพเชเชพ เชงเชฐเชพเชตเซ เชเซ เชเซเชจเซ เช เชจเซเชธเชฐเชตเซ เชเซเชเช.
เชฎเชคเชฆเชพเชจ เช เชเชคเชฐเชพเชฒ เชคเซ เชชเชเซเชจเซ เชธเซเชเชเชกเชจเซ เชธเชเชเซเชฏเชพ เชธเชฎเชพเชตเซ เชเซ เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชเชฐ เชซเซเชฐเชซเชพเชฐเซ เชฎเชพเชเซ เชฐเซเชชเซเชเซเชเชฐเซเชจเซเช เชฎเชคเชฆเชพเชจ เชเชฐเชถเซ.
เชชเซเชฐเซเชเซเชเซเชเชจเชพ เชฐเชฟเชชเซเชเซเชเชฐเซเชฎเชพเช เชซเซเชฐเชซเชพเชฐเซเชจเซ เชเซเชฐเซ เช เชเชฐเชตเชพ เชฎเชพเชเซ เชเชฃเซ เชชเชฆเซเชงเชคเชฟเช เชเซ.
เชธเซเชฅเซ เชธเชฐเชณ เชชเชฆเซเชงเชคเชฟ เชเซ เชฎเชคเชฆเชพเชจ, เชเซ เชธเซเชเชตเซ เชเซ เชเซ เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชเชฐ เชธเชฎเชฏเชพเชเชคเชฐเซ เชฐเซเชชเซเชเซเชเชฐเซ เชธเชพเชฅเซ เชธเชฐเซเชตเชฐเชจเซเช เชฎเชคเชฆเชพเชจ เชเชฐเซ เชเซ. เชเซ เชฎเซเชเชฒเชตเซเช เชฐเซเชชเซเชเซเชเชฐเซเชฎเชพเช เชซเซเชฐเชซเชพเชฐเซเชจเซ เชชเซเชฐเชคเชฟเชฌเชฟเชเชฌเชฟเชค เชเชฐเซ เชเซ, เชชเชเซ เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชเชฐ เชเซเชเชฒเชพเช เชตเชฟเชฒเชเชฌ เชธเชพเชฅเซ เชเชเชคเชฐเชฟเช เชชเชฆเชพเชฐเซเชฅ เชฌเชจเชพเชตเชถเซ เชฌเชฆเชฒเซ เช
เชจเซ เชคเซเชจเซ เชเชตเซเชจเซเช เชนเซเชจเซเชกเชฒเชฐเชจเซ เชฎเซเชเชฒเซ เชถเซเชกเซเชฏเซเชฒเชฐ, เชเซ เชชเซเชฐเซเชเซเชเซเชเชจเซ เชฌเชฟเชฒเซเชก เชเชฐเชตเชพ เช
เชจเซ เชเชเชพเชธเชตเชพ เชฎเชพเชเซเชจเชพ เชชเชเชฒเชพเช เชถเชฐเซ เชเชฐเชถเซ เชเชพเชฎเชฆเชพเชฐ-e. เช เชชเชเชฒเชพเชเช เชตเชเซเชเซ เชธเซเชเชตเชตเชพเชฎเชพเช เชเชตเชถเซ เชธเซเชงเชพเชฐเซ เชญเชเชกเชพเชฐ เชฌเชฐเชพเชฌเชฐ เชเชพเชฒเซ เชเชพเชฎเชฆเชพเชฐเช เชฐเซเชชเซเชเซเชเชฐเซเชจเซ เชธเซเชฅเชพเชจเชฟเช เชจเชเชฒ เชฌเชจเชพเชตเชถเซ. เช เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเซ เชตเชฟเชเชคเซ เชเชเชพเชฎเซ เชฌเซ เชตเชฟเชญเชพเชเซเชฎเชพเช เชจเซเชเซ เชเชตเชฐเซ เชฒเซเชตเชพเชฎเชพเช เชเชตเชถเซ. (
เชฐเชฟเชชเซเชเซเชเชฐเซเชฎเชพเช เชฅเชคเชพ เชซเซเชฐเชซเชพเชฐเซเชจเซ เชเซเชฐเซ เช เชเชฐเชตเชพเชจเซ เชเช เชตเชงเซ เชญเชตเซเชฏ เชชเชฆเซเชงเชคเชฟ เช เชเซ เชเซ เชคเซเชจเซ เชนเซเชธเซเช เชเชฐเชคเชพ เชธเชฐเซเชตเชฐเชฅเซ เชธเซเชงเชพ เช เชธเชเชฆเซเชถเชพเช เชฎเซเชเชฒเชตเชพ เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชเชฐ- เชชเซเชฐเซเชเซเชเซเช เชธเซเชฐเซเชธ เชเซเชก เชฌเชฆเชฒเชตเชพ เชตเชฟเชถเซ. เช เชเชฟเชธเซเชธเชพเชฎเชพเช, เชเชฒเชฆเซ เชตเชฟเชเชพเชธเชเชฐเซเชคเชพ เชฌเชจเชพเชตเซ เชเซ เชฎเซเชเชฒเชตเซเช, เชชเซเชฐเซเชเซเชเซเช เชฐเซเชชเซเชเซเชเชฐเซ เชธเชพเชฅเซเชจเซเช เชธเชฐเซเชตเชฐ เชเช เชธเชเชฆเซเชถ เชฎเซเชเชฒเชถเซ เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชเชฐ-y. เช เชจเซ เชคเซ, เชฌเชฆเชฒเชพเชฎเชพเช, เชเชฌเซเชเซเชเซเช เชฌเชจเชพเชตเซเชจเซ เชคเซเชจเซ เช เชเชเชพเชตเชถเซ PBCchangeSource. เชเชเชณ, เช เชเชฌเซเชเซเชเซเช เชชเชฐ เชธเซเชฅเชพเชจเชพเชเชคเชฐเชฟเชค เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ เชถเซเชกเซเชฏเซเชฒเชฐ, เชเซ เชชเซเชฐเซเชเซเชเซเช เชฌเชจเชพเชตเชตเชพ เช เชจเซ เชคเซเชจเซเช เชชเชฐเซเชเซเชทเชฃ เชเชฐเชตเชพเชจเชพเช เชชเชเชฒเชพเชเชจเซ เชธเชเซเชฐเชฟเชฏ เชเชฐเซ เชเซ. เช เชชเชฆเซเชงเชคเชฟเชจเซ เชเช เชฎเชนเชคเซเชตเชชเซเชฐเซเชฃ เชญเชพเช เชเชพเชฎ เชเชฐเซ เชฐเชนเซเชฏเซ เชเซ เชนเซเช- เชฐเชฟเชชเซเชเซเชเชฐเซเชฎเชพเช เชธเชฐเซเชตเชฐ เชธเซเชเซเชฐเชฟเชชเซเชเซ. เชธเซเชเซเชฐเชฟเชชเซเชเชฎเชพเช เชนเซเช-a, เชเซเชฏเชพเชฐเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเชตเชพเชจเซ เชเซเชฐเชฟเชฏเชพเช เชฎเชพเชเซ เชเชตเชพเชฌเชฆเชพเชฐ เชฎเซเชเชฒเชตเซเช-e, เชคเชฎเชพเชฐเซ เชเชชเชฏเซเชเชฟเชคเชพเชจเซ เชเซเชฒ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ เชฎเซเชเชฒเชตเซเช เช เชจเซ เชจเซเชเชตเชฐเซเช เชธเชฐเชจเชพเชฎเซเช เชธเซเชชเชทเซเช เชเชฐเซ เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชเชฐ-เช. เชคเชฎเชพเชฐเซ เชจเซเชเชตเชฐเซเช เชชเซเชฐเซเชเชจเซ เชชเชฃ เชเชฒเซเชฒเซเช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ เชเซ เชธเชพเชเชญเชณเชถเซ PBCchangeSource. PBCchangeSource, เชฎเชพเชฐเซเช เชฆเซเชตเชพเชฐเชพ, เชญเชพเช เชเซ เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชเชฐ-เช. เช เชชเชฆเซเชงเชคเชฟเชจเซ เชชเชฐเชตเชพเชจเชเซเชจเซ เชเชฐเซเชฐ เชชเชกเชถเซ เชธเชเชเชพเชฒเช-เช เชธเชฐเซเชตเชฐ เชชเชฐ เชเซเชฏเชพเช เชชเซเชฐเซเชเซเชเซเช เชฐเซเชชเซเชเซเชเชฐเซ เชธเซเชฅเชฟเชค เชเซ. เชคเชฎเชพเชฐเซ เชชเชนเซเชฒเชพ เชฐเซเชชเซเชเซเชเชฐเซเชจเซ เชฌเซเชเช เชช เชฒเซเชตเชพเชจเซ เชเชฐเซเชฐ เชชเชกเชถเซ.
5.4 เชถเซเชกเซเชฏเซเชฒเชฐเซเชธ
c['schedulers'] = []
c['schedulers'].append(schedulers.SingleBranchScheduler(
name="all",
change_filter=util.ChangeFilter(branch='master'),
treeStableTimer=None,
builderNames=["runtests"]))
c['schedulers'].append(schedulers.ForceScheduler(
name="force",
builderNames=["runtests"]))
เชถเซเชกเซเชฏเซเชฒเชฐเซเชธ - เช เชเช เชคเชคเซเชต เชเซ เชเซ เชเซเชฐเชฟเชเชฐ เชคเชฐเซเชเซ เชเชพเชฐเซเชฏ เชเชฐเซ เชเซ เชเซ เชชเซเชฐเซเชเซเชเซเชเชจเซ เชเชธเซเชฎเซเชฌเชฒเซ เช
เชจเซ เชชเชฐเซเชเซเชทเชฃเชจเซ เชธเชฎเชเซเชฐ เชธเชพเชเชเชณ เชถเชฐเซ เชเชฐเซ เชเซ.
เชคเซ เชซเซเชฐเชซเชพเชฐเซ เชเซ เชเซ เชฐเซเชเซเชฐเซเชก เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเชพ เชนเชคเชพ เชซเซเชฐเชซเชพเชฐ_เชธเซเชฐเซเชค, เชเชพเชฎเชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชฎเชพเช เชฐเซเชชเชพเชเชคเชฐเชฟเชค เชฌเชฟเชฒเซเชกเชฌเซเช-เช เชตเชพเชเชงเซ เชเช เชพเชตเชตเซ เชฌเชฆเชฒเซ เช
เชจเซ เชนเชตเซ เชฆเชฐเซเช เชถเซเชกเซเชฏเซเชฒเชฐ เชคเซเชฎเชจเชพ เชเชงเชพเชฐเซ, เชคเซ เชชเซเชฐเซเชเซเชเซเช เชฌเชฟเชฒเซเชก เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชถเชฐเซ เชเชฐเชตเชพ เชตเชฟเชจเชเชคเซเช เชฌเชจเชพเชตเซ เชเซ. เชเซ เชเซ, เชคเซ เช เชชเชฃ เชจเชฟเชฐเซเชงเชพเชฐเชฟเชค เชเชฐเซ เชเซ เชเซ เช เชตเชฟเชจเชเชคเซเช เชเชคเชพเชฐเชฎเชพเช เชเชเชณ เชเซเชฏเชพเชฐเซ เชเซเชฐเชพเชจเซเชธเชซเชฐ เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ. เชเช เชชเชฆเชพเชฐเซเชฅ
เชเชชเชฃเซ เชคเซ เชตเชฐเซเชคเชฎเชพเชจ เชเชฆเชพเชนเชฐเชฃเชฎเชพเช เชเซเชเช เชเซเช เชถเซเชกเซเชฏเซเชฒเชฐเซเชธ 2 เชเซเชเชกเชพเช เชฌเชจเชพเชตเชตเชพเชฎเชพเช เชเชตเซ เชเซ. เชคเชฆเซเชชเชฐเชพเชเชค, เชฆเชฐเซเชเชจเซ เชชเซเชคเชพเชจเซ เชชเซเชฐเชเชพเชฐ เชเซ.
เชธเชฟเชเชเชฒเชฌเซเชฐเชพเชจเซเช เชถเซเชกเซเชฏเซเชฒเชฐ - เชถเซเชกเซเชฏเซเชฒ เชชเชฐเชจเชพ เชธเซเชฅเซ เชฒเซเชเชชเซเชฐเชฟเชฏ เชตเชฐเซเชเซเชฎเชพเชเชจเซ เชเช. เชคเซ เชเช เชถเชพเชเชพเชจเซ เชเซเช เชเซ เช เชจเซ เชคเซเชฎเชพเช เชจเซเชเชงเชพเชฏเซเชฒเชพ เชซเซเชฐเชซเชพเชฐเชฅเซ เชคเซ เชเซเชฐเชฟเชเชฐ เชฅเชพเชฏ เชเซ. เชเซเชฏเชพเชฐเซ เชคเซ เชซเซเชฐเชซเชพเชฐเซ เชเซเช เชเซ, เชคเซเชฏเชพเชฐเซ เชคเซ เชฌเชฟเชฒเซเชก เชตเชฟเชจเชเชคเซ เชฎเซเชเชฒเชตเชพเชฎเชพเช เชตเชฟเชฒเชเชฌ เชเชฐเซ เชถเชเซ เชเซ (เชตเชฟเชถเซเชท เชชเชฐเชฟเชฎเชพเชฃเชฎเชพเช เชเชฒเซเชฒเซเชเชฟเชค เชธเชฎเชฏเชเชพเชณเชพ เชฎเชพเชเซ เชฎเซเชฒเชคเชตเซ เชฐเชพเชเซ เชเซเชฐเซ เชธเซเชเซเชฌเชฒ เชเชพเชเชฎเชฐ). เชตเซ เชจเชพเชฎ เชถเซเชกเซเชฏเซเชฒเชจเซเช เชจเชพเชฎ เชธเซเช เชเชฐเซ เชเซ เชเซ เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เชฅเชถเซ เชฌเชฟเชฒเซเชกเชฌเซเช- เชตเซเชฌ เชเชจเซเชเชฐเชซเซเชธ. IN เชซเชฟเชฒเซเชเชฐ เชฌเชฆเชฒเซ เชเช เชซเชฟเชฒเซเชเชฐ เชธเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชเซ เชชเชธเชพเชฐ เชเชฐเซเชฏเชพ เชชเชเซ เชถเชพเชเชพเชฎเชพเช เชเชฏเชพ เชซเซเชฐเชซเชพเชฐเซ เชถเซเชกเซเชฏเซเชฒเชจเซ เชฌเชพเชเชงเชเชพเชฎ เชฎเชพเชเซ เชตเชฟเชจเชเชคเซ เชฎเซเชเชฒเชตเชพ เชฎเชพเชเซ เชธเชเชเซเชค เชเชชเซ เชเซ. IN เชฌเชฟเชฒเซเชกเชฐเชจเชพ เชจเชพเชฎเซ เชจเชพเชฎ เชฆเชฐเซเชถเชพเชตเซเชฒ เชเซ เชฌเชฟเชฒเซเชกเชฐ-a, เชเซ เชเชชเชฃเซ เชฅเซเชกเซ เชตเชพเชฐ เชชเชเซ เชธเซเช เชเชฐเซเชถเซเช. เช เชฎเชพเชฐเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช เชจเชพเชฎ เชชเซเชฐเซเชเซเชเซเชเชจเชพ เชจเชพเชฎ เชเซเชตเซเช เช เชนเชถเซ: เชคเชฎเชพเชฐเซ เชชเซเชฐเซเชเซเชเซเช.
เชซเซเชฐเซเชธ เชถเซเชกเซเชฏเซเชฒเชฐ เชเช เชเซเชฌ เช เชธเชฐเชณ เชตเชธเซเชคเซ. เช เชชเซเชฐเชเชพเชฐเชจเซเช เชถเซเชกเซเชฏเซเชฒ เชฎเชพเชเชธ เชเซเชฒเชฟเช เชฅเซเชฐเซ เชฆเซเชตเชพเชฐเชพ เชเซเชฐเชฟเชเชฐ เชฅเชพเชฏ เชเซ เชฌเชฟเชฒเซเชกเชฌเซเช- เชตเซเชฌ เชเชจเซเชเชฐเชซเซเชธ. เชชเชฐเชฟเชฎเชพเชฃเซเชฎเชพเช เชธเชฎเชพเชจ เชธเชพเชฐ เชเซ เชธเชฟเชเชเชฒเชฌเซเชฐเชพเชจเซเช เชถเซเชกเซเชฏเซเชฒเชฐ.
เชชเซเชเชธ เชจเชเชฌเชฐ 3. เชเชฆเชพเช เชคเซ เชนเชพเชฅเชฎเชพเช เชเชตเชถเซ
เชธเชพเชฎเชฏเชฟเช เชเช เชถเซเชกเซเชฏเซเชฒ เชเซ เชเซ เชเซเชเซเชเชธ เชธเชฎเชฏ-เชจเชฟเชถเซเชเชฟเชค เชเชตเชฐเซเชคเชจ เชชเชฐ เชเชพเชฒเซ เชเซ. เชเซเชฒ เชเชเชเช เชเชจเชพ เชเซเชตเซ เชฆเซเชเชพเชฏ เชเซ
from buildbot.plugins import schedulers
nightly = schedulers.Periodic(name="daily",
builderNames=["full-solaris"],
periodicBuildTimer=24*60*60)
c['schedulers'] = [nightly]
5.5 เชฌเชฟเชฒเซเชก เชซเซเชเซเชเชฐเซ
factory = util.BuildFactory()
factory.addStep(steps.Git(repourl='git://github.com/buildbot/hello-world.git', mode='incremental'))
factory.addStep(steps.ShellCommand(command=["trial", "hello"],
env={"PYTHONPATH": "."}))
เชธเชพเชฎเชฏเชฟเช เชฌเชฟเชฒเซเชก เชเชพเชเชฎเชฐ เช เชธเชพเชฎเชฏเชฟเชเชคเชพเชจเซ เชธเชฎเชฏ เชธเซเชเชจเซเชกเซเชฎเชพเช เชธเซเชชเชทเซเช เชเชฐเซ เชเซ.
เชฌเชฟเชฒเซเชก เชซเซเชเซเชเชฐเซ เชเซเชเซเชเชธ เชฌเชจเชพเชตเซ เชเซ เชฌเชฟเชฒเซเชก เชเชฐเซ, เชเซ เชชเชเซ เชฌเชฟเชฒเซเชกเชฐ เชจเซ เชฎเซเชเชฒเซ เชเซ เชเชพเชฎเชฆเชพเชฐ. เช เชฌเชฟเชฒเซเชก เชซเซเชเซเชเชฐเซ เช
เชจเซเชธเชฐเชตเชพเชจเชพ เชชเชเชฒเชพเช เชธเซเชเชตเซ เชเซ เชเชพเชฎเชฆเชพเชฐ-y. เชชเชฆเซเชงเชคเชฟเชจเซ เชเซเชฒ เชเชฐเซเชจเซ เชชเชเชฒเชพเช เชเชฎเซเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ เชชเชเชฒเซเช เชเชฎเซเชฐเซ
เช เชเชฆเชพเชนเชฐเชฃเชฎเชพเช เชชเซเชฐเชฅเชฎ เชเชฎเซเชฐเชพเชฏเซเชฒ เชชเชเชฒเซเช เชเซ git เชธเซเชตเชเซเช -d -f -f -xเชชเชเซ เชเชฟเช เชเซเชเชเชเช. เช เชเซเชฐเชฟเชฏเชพเช เชชเชฐเชฟเชฎเชพเชฃเชฎเชพเช เชถเชพเชฎเซเชฒ เชเซ เชชเชฆเซเชงเชคเชฟ, เชเซ เชธเซเชชเชทเซเชเชชเชฃเซ เชเชฃเชพเชตเซเชฒ เชจเชฅเซ เชชเชฐเชเชคเซ เชกเชฟเชซเซเชฒเซเช เชฎเซเชฒเซเชฏ เชธเซเชเชตเซ เชเซ เชคเชพเชเชพ. เชชเชฐเชฟเชฎเชพเชฃ เชฎเซเชก = 'เชตเซเชฆเซเชงเชฟเชถเซเชฒ' เชธเซเชเชตเซ เชเซ เชเซ เชซเชพเชเชฒเซ เชกเชฟเชฐเซเชเซเชเชฐเซเชฎเชพเชเชฅเซ เชเซ เชเซเชฏเชพเช เชเซเชเชเชเช, เชเซเชฏเชพเชฐเซ เชฐเซเชชเซเชเซเชเชฐเซเชฎเชพเชเชฅเซ เชเซเชเซ เชเซ, เชคเซเชฏเชพเชฐเซ เช เชธเซเชชเซเชถเซเชฏ เชฐเชนเซ เชเซ.
เชฌเซเชเซเช เชเชฎเซเชฐเชพเชฏเซเชฒ เชชเชเชฒเซเช เชธเซเชเซเชฐเชฟเชชเซเชเชจเซ เชเซเชฒ เชเชฐเชตเชพเชจเซเช เชเซ เชเซเชฐเชพเชฏเชฒ เชชเชฐเชฟเชฎเชพเชฃ เชธเชพเชฅเซ เชนเซเชฒเซ เชฌเชพเชเซ เชชเชฐ เชเชพเชฎเชฆเชพเชฐ- เช เชกเชฟเชฐเซเชเซเชเชฐเซเชฎเชพเชเชฅเซ /home/habr/worker/yourProject/build เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชเชฒ เชธเชพเชฅเซ PATHONPATH=... เชเชฎ, เชคเชฎเซ เชคเชฎเชพเชฐเซ เชชเซเชคเชพเชจเซ เชธเซเชเซเชฐเชฟเชชเซเชเซ เชฒเชเซ เชถเชเซ เชเซ เช เชจเซ เชคเซเชจเซ เชฌเชพเชเซ เชชเชฐ เชเชฒเชพเชตเซ เชถเชเซ เชเซ. เชเชพเชฎเชฆเชพเชฐ- เชฆเชฐเซเช เชชเชเชฒเซเช util.ShellCommand. เช เชธเซเชเซเชฐเชฟเชชเซเชเซ เชธเซเชงเซ เชฐเซเชชเซเชเซเชเชฐเซเชฎเชพเช เชฎเซเชเซ เชถเชเชพเชฏ เชเซ. เชชเชเซ เชฎเซ เชเซเชเชเชเช-e เชคเซเช เชชเชกเซ เชเชถเซ /home/habr/worker/yourProject/build. เชเซ เชเซ, เชชเชเซ เชคเซเชฏเชพเช เชฌเซ "เชชเชฐเชเชคเซ" เชเซ:
- เชเชพเชฎเชฆเชพเชฐ เชเซ เชตเชกเซ เชฌเชจเชพเชตเชตเซเช เชเซเชเช
--เชเชฎเชพเชธเซเช เชเซเชฅเซ เชคเซ เชชเชเซ เช เชฎเชฒเชจเชพ เช เชงเชฟเชเชพเชฐเซเชจเซ เช เชตเชฐเซเชงเซ เชจเชนเซเช เชเซเชเชเชเช-เช. - เช เชเชคเซ เชเซเช เชฆเชฌเชพเชฃ-e เช เชธเซเชเซเชฐเชฟเชชเซเชเซเชฎเชพเชเชฅเซ เชคเชฎเชพเชฐเซ เชฎเชฟเชฒเชเชคเชจเซ เชเชฒเซเชฒเซเช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ เชเชเซเชเชฟเชเซเชฏเซเชเซเชฌเชฒเชเซเชฅเซ เชชเชเซเชฅเซ เชเซเชเชเชเช-e เช เชเชฟเช เชธเซเชเซเชฐเชฟเชชเซเช เชเชฒเชพเชตเชตเชพเชจเซ เช เชงเชฟเชเชพเชฐ เชเซเชฎเชพเชตเซเชฏเซ เชจเชฅเซ.
5.6 เชฌเชฟเชฒเซเชกเชฐเซ
c['builders'] = []
c['builders'].append(util.BuilderConfig(name="runtests",
workernames=["example-worker"],
factory=factory))
เชถเซเช เชเซ เชคเซ เชตเชฟเชถเซ เชฌเชฟเชฒเซเชกเชฐ เชเชนเซเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชนเชคเซเช
c['builders'] = []
c['builders'].append(util.BuilderConfig(name="yourProject",
workernames=["yourWorkerName"],
factory=factory))
เชนเชตเซ เชนเซเช เชคเชฎเชจเซ เชชเชฐเชฟเชฎเชพเชฃเซ เชตเชฟเชถเซ เชเชนเซเชถ เชฌเชฟเชฒเซเชกเชฐเชเซเชจเซเชซเชฟเช.
เชจเชพเชฎ เชจเชพเชฎ เชธเซเชชเชทเซเช เชเชฐเซ เชเซ เชฌเชฟเชฒเซเชกเชฐ-a เช เชนเซเช เช เชฎเซ เชคเซเชจเซเช เชจเชพเชฎ เชเชชเซเชฏเซเช เชเซ เชคเชฎเชพเชฐเซ เชชเซเชฐเซเชเซเชเซเช... เชเชจเซ เช เชฐเซเชฅ เชเซ เชเซ เชเชพเชฒเซ เชเชพเชฎเชฆเชพเชฐ- เช เช เชฐเชธเซเชคเซ เชฌเชจเชพเชตเชตเชพเชฎเชพเช เชเชตเชถเซ /home/habr/worker/yourProject/build. เชถเซเชกเซเชฏเซเชฒเชฐ เชจเซ เชธเซเชง เชฎเชพ เชนเซเชตเซ เชฌเชฟเชฒเซเชกเชฐ เชซเชเซเชค เช เชจเชพเชฎเชฅเซ.
เชเชพเชฎเชฆเชพเชฐเซเชจเชพ เชจเชพเชฎ เชถเซเช เชธเชฎเชพเชตเซ เชเซ เชเชพเชฎเชฆเชพเชฐ-เช. เชเซเชฎเชพเชเชจเชพ เชฆเชฐเซเชเชฎเชพเช เชเชฎเซเชฐเชตเซเช เชเชตเชถเซเชฏเช เชเซ c['เชเชพเชฎเชฆเชพเชฐเซ'].
เชซเซเชเซเชเชฐเซ - เชเซเชเซเชเชธ เชฌเชฟเชฒเซเชก เชเชฐเซ, เชเซเชจเซ เชธเชพเชฅเซ เชคเซ เชธเชเชเชณเชพเชฏเซเชฒ เชเซ เชฌเชฟเชฒเซเชกเชฐ. เชคเซ เชเชฌเซเชเซเชเซเช เชฎเซเชเชฒเชถเซ เชฌเชฟเชฒเซเชก เชเชฐเซ เชชเชฐ เชเชพเชฎเชฆเชพเชฐ เชเชฎเชพเช เชธเชฎเชพเชตเชฟเชทเซเช เชคเชฎเชพเชฎ เชชเชเชฒเชพเช เชชเซเชฐเซเชฃ เชเชฐเชตเชพ เชฎเชพเชเซ เชฌเชฟเชฒเซเชก เชเชฐเซ-เช.
6. เชคเชฎเชพเชฐเซ เชชเซเชคเชพเชจเซ เชเซเช เชตเชฃเซเชจเซเช เชเชฆเชพเชนเชฐเชฃ
เช
เชนเซเช เชชเซเชฐเซเชเซเชเซเช เชเชฐเซเชเชฟเชเซเชเซเชเชฐเชจเซเช เชเชฆเชพเชนเชฐเชฃ เชเซ เชเซเชจเซ เชนเซเช เช
เชฎเชฒเชฎเชพเช เชฎเซเชเชตเชพเชจเซ เชชเซเชฐเชธเซเชคเชพเชต เชฎเซเชเซเช เชเซเช เชฌเชฟเชฒเซเชกเชฌเซเช
.
เช
เชฎเซ เชตเชฐเซเชเชจ เชเชเชเซเชฐเซเชฒ เชธเชฟเชธเซเชเชฎ เชคเชฐเซเชเซ เชเชชเชฏเซเช เชเชฐเซเชถเซเช เชเชธเชตเซเชเชจ. เชฐเซเชชเซเชเซเชเชฐเซ เชชเซเชคเซ เช
เชฎเซเช เชชเซเชฐเชเชพเชฐเชจเชพ เชตเชพเชฆเชณเชฎเชพเช เชธเซเชฅเชฟเชค เชนเชถเซ. เช เชตเชพเชฆเชณเชจเซเช เชธเชฐเชจเชพเชฎเซเช เช เชฐเชนเซเชฏเซเช
เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชเชฐ ะธ เชเชพเชฎเชฆเชพเชฐ เชธเชฎเชพเชจ เชนเซเชธเซเช เชชเชฐ เชเชฒเชพเชตเซ เชชเซเชฐเซเชเซเชเซเช.เชนเซเชธเซเช .เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชเชฐ เชคเซเชจเซ เชซเชพเชเชฒเซเชจเซ เชซเซเชฒเซเชกเชฐเชฎเชพเช เชธเชเชเซเชฐเชนเชฟเชค เชเชฐเซ เชเซ /home/habr/master. เชเชพเชฎเชฆเชพเชฐ เชคเซ เชจเซเชเซเชจเชพ เชชเชพเชฅเชฎเชพเช เชธเชเชเซเชฐเชนเชฟเชค เชเซ /home/habr/worker. เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชธเชเชเชพเชฐ เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชเชฐ-a เช เชจเซ เชเชพเชฎเชฆเชพเชฐ-เช เชชเซเชฐเซเชเซเชเซเชฒ เช เชจเซเชธเชพเชฐ เชชเซเชฐเซเช 4000 เชฆเซเชตเชพเชฐเชพ เชนเชพเชฅ เชงเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ เชฌเชฟเชฒเซเชกเชฌเซเช-เช, เชเชเชฒเซ เชเซ 'pb' เชชเซเชฐเซเชเซเชเซเชฒ
เชฒเชเซเชทเซเชฏ เชชเซเชฐเซเชเซเชเซเช เชธเชเชชเซเชฐเซเชฃเชชเชฃเซ เชชเชพเชฏเชฅเซเชจเชฎเชพเช เชฒเชเชพเชฏเซเชฒ เชเซ. เชเชพเชฐเซเชฏ เชคเซเชจเชพ เชซเซเชฐเชซเชพเชฐเซเชจเซ เชเซเชฐเซ เช เชเชฐเชตเชพ, เชเชเซเชเชฟเชเซเชฏเซเชเซเชฌเชฒ เชซเชพเชเชฒ เชฌเชจเชพเชตเชตเชพ, เชฆเชธเซเชคเชพเชตเซเชเซเชเชฐเชฃ เชฌเชจเชพเชตเชตเชพ เช เชจเซ เชชเชฐเซเชเซเชทเชฃ เชนเชพเชฅ เชงเชฐเชตเชพเชจเซเช เชเซ. เชจเชฟเชทเซเชซเชณเชคเชพเชจเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช, เชฌเชงเชพ เชตเชฟเชเชพเชธเชเชฐเซเชคเชพเชเช เชเช เช เชธเชซเชณ เชเซเชฐเชฟเชฏเชพ เชนเซเชตเชพเชจเซเช เชเชฃเชพเชตเชคเชพ เชเชฎเซเชเชฒ เชฆเซเชตเชพเชฐเชพ เชธเชเชฆเซเชถ เชฎเซเชเชฒเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ.
เชตเซเชฌ เชชเซเชฐเชฆเชฐเซเชถเชจ เชฌเชฟเชฒเซเชกเชฌเซเช เชฎเชพเชเซ เช เชฎเซ เชชเซเชฐเซเช 80 เชฅเซ เชเชจเซเชเซเช เชเชฐเซเชถเซเช เชชเซเชฐเซเชเซเชเซเช.เชนเซเชธเซเช. Apatch เชเชจเซเชธเซเชเซเชฒ เชเชฐเชตเซเช เชเชฐเซเชฐเซ เชจเชฅเซ. เชชเซเชธเซเชคเชเชพเชฒเชฏเชจเชพ เชญเชพเชเชฐเซเชชเซ เชเซเชตเชฟเชธเซเชเซเชก เชคเซเชฏเชพเช เชชเชนเซเชฒเซเชฅเซ เช เชตเซเชฌ เชธเชฐเซเชตเชฐ เชเซ, เชฌเชฟเชฒเซเชกเชฌเซเช เชคเซเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ.
เชฎเชพเชเซ เชเชเชคเชฐเชฟเช เชฎเชพเชนเชฟเชคเซ เชธเชเชเซเชฐเชนเชฟเชค เชเชฐเชตเชพ เชฌเชฟเชฒเซเชกเชฌเซเช ะธัะฟะพะปัะทะพะฒะฐัั ะธัะฟะพะปัะทะพะฒะฐัั เชเซเชฐเชธ.
เชฎเซเชเชฒเชฟเชเช เชฎเชพเชเซ เชนเซเชธเซเช เชเชฐเซเชฐเซ เชเซ smtp.your.domain - เชคเซ เชฎเซเชเชฒเชฅเซ เชชเชคเซเชฐเซ เชฎเซเชเชฒเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ [เชเชฎเซเชเชฒ เชธเซเชฐเชเซเชทเชฟเชค] เชชเซเชฐเชฎเชพเชฃเซเชเชฐเชฃ เชตเชฟเชจเชพ. เชฏเชเชฎเชพเชจ เชชเชฐ เชชเชฃ'SMTP ' เชชเซเชธเซเช 1025 เชชเชฐ เชฎเชฟเชจเชฟเชเซเชธ เชธเชพเชเชญเชณเชตเชพเชฎเชพเช เชเชตเซ เชฐเชนเซ เชเซ.
เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชฎเชพเช เชฌเซ เชฒเซเชเซ เชธเชพเชฎเซเชฒ เชเซ: เชธเชเชเชพเชฒเช ะธ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ. เชเชกเชฎเชฟเชจ เชตเชนเซเชตเช เชเชฐเซ เชเซ เชฌเชฟเชฒเซเชกเชฌเซเช. เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชชเซเชฐเชคเชฟเชฌเชฆเซเชง เชตเซเชฏเชเซเชคเชฟ เชเซ เชฎเซเชเชฒเชตเซเช-เช.
เชเชเซเชเซเชเซเชฏเซเชเซเชฌเชฒ เชซเชพเชเชฒ เชฎเชพเชฐเชซเชคเซ เชเชจเชฐเซเช เชฅเชพเชฏ เชเซ pyinstaller. เชฆเซเชตเชพเชฐเชพ เชฆเชธเซเชคเชพเชตเซเชเซเชเชฐเชฃ เชเชจเชฐเซเช เชฅเชพเชฏ เชเซ เชกเซเชเซเชธเชฟเชเชจ.
เช เชเชฐเซเชเชฟเชเซเชเซเชเชฐ เชฎเชพเชเซ เชฎเซเช เช เชฒเชเซเชฏเซเช: master.cfg:
master.cfg
import os, re
from buildbot.plugins import steps, util, schedulers, worker, changes, reporters
c= BuildmasterConfig ={}
c['workers'] = [ worker.Worker('yourWorkerName', 'password') ]
c['protocols'] = {'pb': {'port': 4000}}
svn_poller = changes.SVNPoller(repourl="https://svn.host/svn/yourProject/trunk",
svnuser="user",
svnpasswd="password",
pollinterval=60,
split_file=util.svn.split_file_alwaystrunk
)
c['change_source'] = svn_poller
hourlyscheduler = schedulers.SingleBranchScheduler(
name="your-project-schedulers",
change_filter=util.ChangeFilter(branch=None),
builderNames=["yourProject"],
properties = {'owner': 'admin'}
)
c['schedulers'] = [hourlyscheduler]
checkout = steps.SVN(repourl='https://svn.host/svn/yourProject/trunk',
mode='full',
method='fresh',
username="user",
password="password",
haltOnFailure=True)
projectHost_build = util.BuildFactory()
cleanProject = steps.ShellCommand(name="Clean",
command=["buildbot/worker_linux/pyinstaller_project", "clean"]
)
buildProject = steps.ShellCommand(name="Build",
command=["buildbot/worker_linux/pyinstaller_project", "build"]
)
doxyProject = steps.ShellCommand(name="Update Docs",
command=["buildbot/worker_linux/gendoc", []]
)
testProject = steps.ShellCommand(name="Tests",
command=["python","tests/utest.py"],
env={'PYTHONPATH': '.'}
)
projectHost_build.addStep(checkout)
projectHost_build.addStep(cleanProject)
projectHost_build.addStep(buildProject)
projectHost_build.addStep(doxyProject)
projectHost_build.addStep(testProject)
c['builders'] = [
util.BuilderConfig(name="yourProject", workername='yourWorkerName', factory=projectHost_build)
]
template_html=u'''
<h4>ะกัะฐััั ะฟะพัััะพะตะฝะฝะพะณะพ ัะตะปะธะทะฐ: {{ summary }}</h4>
<p>ะัะฟะพะปัะทัะตะผัะน ัะตัะฒะธั ะดะปั ะฟะพัััะฐะตะฝะธั: {{ workername }}</p>
<p>ะัะพะตะบั: {{ projects }}</p>
<p>ะะปั ัะพะณะพ ััะพ ะฑั ะฟะพัะผะพััะตัั ะธะฝัะตััะตะนั ัะฟัะฐะฒะปะตะฝะธั ะฟัะพะนะดะธัะต ะฟะพ ัััะปะบะต: {{ buildbot_url }}</p>
<p>ะะปั ัะพะณะพ ััะพ ะฑั ะฟะพัะผะพััะตัั ัะตะทัะปััะฐั ัะฑะพัะบะธ ะฟัะพะนะดะธัะต ะฟะพ ัััะปะบะต: {{ build_url }}</p>
<p>ะัะฟะพะปัะทัั WinSCP ะผะพะถะฝะพ ะฟะพะดะบะปััะธัััั ะบ ัะตัะฒะตัั c ip:xxx.xx.xxx.xx. ะะพะนะดั ะฟะพะด habr/password, ะทะฐะฑัะฐัั ัะพะฑัะฐะฝะฝัะน executable ัะฐะนะป ั ะดะธัะตะบัะพัะธะธ ~/worker/yourProject/build/dist.</p>
<p><b>ะะพัััะพะตะฝะธะต ะฑัะปะพ ะฟัะพะธะทะฒะตะดะตะฝะพ ัะตัะตะท Buildbot</b></p>
'''
sendMessageToAll = reporters.MailNotifier(fromaddr="[email protected]",
sendToInterestedUsers=True,
lookup="your.domain",
relayhost="smtp.your.domain",
smtpPort=1025,
mode="warnings",
extraRecipients=['[email protected]'],
messageFormatter=reporters.MessageFormatter(
template=template_html,
template_type='html',
wantProperties=True,
wantSteps=True)
)
c['services'] = [sendMessageToAll]
c['title'] = "The process of bulding"
c['titleURL'] = "http://project.host:80/"
c['buildbotURL'] = "http://project.host"
c['www'] = dict(port=80,
plugins=dict(waterfall_view={}, console_view={}, grid_view={}))
c['db'] = {
'db_url' : "sqlite:///state.sqlite"
}
เชชเซเชฐเชฅเชฎ เชคเชฎเชพเชฐเซ เชเชฐเซเชฐ เชเซ
เชเชเชณเชจเซเช เชชเชเชฒเซเช เชธเซเชตเชพ เชถเชฐเซ เชเชฐเชตเชพเชจเซเช เชเซ เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชเชฐเช
sudo buildbot start /home/habr/master
เชชเชเซ เชธเซเชตเชพ เชถเชฐเซ เชเชฐเซ เชเชพเชฎเชฆเชพเชฐ-a
buildbot-worker start /home/habr/worker
เชคเซเชฏเชพเชฐ! เชนเชตเซ เชฌเชฟเชฒเซเชกเชฌเซเช เชซเซเชฐเชซเชพเชฐเซเชจเซ เชเซเชฐเซ เช เชเชฐเชถเซ เช เชจเซ เชเซเชฐเชฟเชเชฐ เชเชฐเชถเซ เชฎเซเชเชฒเชตเซเช-y เชฎเชพเช เชเชธเชตเซเชเชจ, เชเชชเชฐเซเชเซเชค เชเชฐเซเชเชฟเชเซเชเซเชเชฐ เชธเชพเชฅเซ เชชเซเชฐเซเชเซเชเซเช เชฌเชจเชพเชตเชตเชพ เช เชจเซ เชชเชฐเซเชเซเชทเชฃ เชเชฐเชตเชพเชจเชพเช เชชเชเชฒเชพเช.
เชจเซเชเซ เชนเซเช เชเชชเชฐเชจเชพ เชเซเชเชฒเชพเช เชฒเชเซเชทเชฃเซเชจเซเช เชตเชฐเซเชฃเชจ เชเชฐเซเชถ master.cfg.
6.1 เชคเชฎเชพเชฐเชพ master.cfg เชจเชพ เชฎเชพเชฐเซเช เชชเชฐ
เชฒเชเชคเซ เชตเชเชคเซ เชฎเชพเชฐเชพ master.cfg เชเชฃเซ เชญเซเชฒเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ, เชคเซเชฅเซ เชฒเซเช เชซเชพเชเชฒ เชตเชพเชเชเชตเชพเชจเซ เชเชฐเซเชฐ เชชเชกเชถเซ. เชคเชฐเซเชเซ เชธเชเชเซเชฐเชนเชฟเชค เชฅเชพเชฏ เชเซ เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชเชฐ-เชเชธเซ เชธเชเชชเซเชฐเซเชฃ เชฎเชพเชฐเซเช /home/habr/master/twistd.log, เช
เชจเซ เชฌเชพเชเซ เชชเชฐ เชเชพเชฎเชฆเชพเชฐ-เช เชธเชเชชเซเชฐเซเชฃ เชฎเชพเชฐเซเช เชธเชพเชฅเซ /home/habr/worker/twistd.log. เชเซเชฎ เชเซเชฎ เชคเชฎเซ เชญเซเชฒ เชตเชพเชเชเซ เช
เชจเซ เชคเซเชจเซ เช เซเช เชเชฐเซ เชคเซเชฎ, เชคเชฎเชพเชฐเซ เชธเซเชตเชพ เชชเซเชจเชเชชเซเชฐเชพเชฐเชเชญ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชชเชกเชถเซ เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชเชฐ-a เชคเซ เชเซเชตเซ เชฐเซเชคเซ เชฅเชพเชฏ เชเซ เชคเซ เช
เชนเซเช เชเซ:
sudo buildbot stop /home/habr/master
sudo buildbot upgrade-master /home/habr/master
sudo buildbot start /home/habr/master
6.2 svn เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเซเช
svn_poller = changes.SVNPoller(repourl="https://svn.host/svn/yourProject/trunk",
svnuser="user",
svnpasswd="password",
pollinterval=60,
split_file=util.svn.split_file_alwaystrunk
)
c['change_source'] = svn_poller
hourlyscheduler = schedulers.SingleBranchScheduler(
name="your-project-schedulers",
change_filter=util.ChangeFilter(branch=None),
builderNames=["yourProject"],
properties = {'owner': 'admin'}
)
c['schedulers'] = [hourlyscheduler]
checkout = steps.SVN(repourl='https://svn.host/svn/yourProject/trunk',
mode='full',
method='fresh',
username="user",
password="password",
haltOnFailure=True)
เชชเซเชฐเชฅเชฎ, เชเชพเชฒเซ เชเช เชจเชเชฐ เชเชฐเซเช svn_poller. เช เชนเชเซ เชชเชฃ เช เช เชเชจเซเชเชฐเชซเซเชธ เชเซ, เชจเชฟเชฏเชฎเชฟเชคเชชเชฃเซ เชเช เชฎเชฟเชจเชฟเชเชฎเชพเช เชเชเชตเชพเชฐ เชฐเชฟเชชเซเชเซเชเชฐเซเชจเซเช เชฎเชคเชฆเชพเชจ เชเชฐเซ เชเซ. เช เชฌเชพเชฌเชคเซ svn_poller เชฎเชพเชคเซเชฐ เชถเชพเชเชพเชฎเชพเช เชชเซเชฐเชตเซเชถ เชเชฐเซ เชเซ เชเซเชฐเชเช. เชฐเชนเชธเซเชฏเชฎเชฏ เชชเชฐเชฟเชฎเชพเชฃ split_file=util.svn.split_file_alwaystruk เชจเชฟเชฏเชฎเซ เชธเซเชฏเซเชเชฟเชค เชเชฐเซ เชเซ: เชซเซเชฒเซเชกเชฐ เชฎเชพเชณเชเซเช เชเซเชตเซ เชฐเซเชคเซ เชคเซเชกเชตเซเช เชเชธเชตเซเชเชจ เชถเชพเชเชพเช เชชเชฐ. เชคเซ เชคเซเชฎเชจเซ เชธเชเชฌเชเชงเชฟเชค เชฎเชพเชฐเซเชเซ เชชเชฃ เชเชชเซ เชเซ. เชคเซเชจเชพ เชตเชณเชพเชเชเชฎเชพเช split_file_alwaystruk เชฎเชพเชคเซเชฐ เชฐเซเชชเซเชเซเชเชฐเซ เชธเชฎเชพเชตเซ เชเซ เชเชฎ เชเชนเซเชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเซ เชธเชฐเชณ เชฌเชจเชพเชตเซ เชเซ เชเซเชฐเชเช.
ะ เชธเชฎเชฏเชชเชคเซเชฐเช เชธเซเชเชตเซเชฒ เชซเชฟเชฒเซเชเชฐ เชฌเชฆเชฒเซเชเซเชฃ เชเซเช เชเซ เชเชเช เช เชจเซ เชคเซเชจเซ เชธเชพเชฅเซ เชเช เชถเชพเชเชพเชจเซ เชธเชพเชเชเชณเซ เชเซ เชเซเชฐเชเช เชฆเซเชตเชพเชฐเชพ เชเชชเซเชฒ เชเชธเซเชธเชฟเชเชถเชจ เช เชจเซเชธเชพเชฐ split_file_alwaystruk. เชฎเชพเช เชซเซเชฐเชซเชพเชฐเซเชจเซ เชชเซเชฐเชคเชฟเชธเชพเชฆ เชเซเชฐเชเช, เชฒเซเชจเซเช เชเชฐเซ เชเซ เชฌเชฟเชฒเซเชกเชฐ เชจเชพเชฎ เชธเชพเชฅเซ เชคเชฎเชพเชฐเซ เชชเซเชฐเซเชเซเชเซเช.
เชเซเชฃเชงเชฐเซเชฎเซ เช เชนเซเช เชคเซ เชเชฐเซเชฐเซ เชเซ เชเซเชฅเซ เชเชกเชฎเชฟเชจ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเชพ เชฎเชพเชฒเชฟเช เชคเชฐเซเชเซ เชฌเชฟเชฒเซเชก เช เชจเซ เชชเชฐเซเชเซเชทเชฃ เชชเชฐเชฟเชฃเชพเชฎเซเชจเซ เชฎเซเชเชฒเชฟเชเช เชธเซเชเชฟ เชฎเซเชณเชตเซ.
เชชเชเชฒเซเช เชฌเชฟเชฒเซเชก เชเชฐเซ-a เชเซเชเชเชเช เชฐเซเชชเซเชเซเชเชฐเซเชจเชพ เชธเซเชฅเชพเชจเชฟเช เชธเชเชธเซเชเชฐเชฃเชฎเชพเช เชธเซเชฅเชฟเชค เชเซเชเชชเชฃ เชซเชพเชเชฒเซเชจเซ เชธเชเชชเซเชฐเซเชฃเชชเชฃเซ เชเชพเชขเซ เชจเชพเชเชตเชพ เชฎเชพเชเซ เชธเชเซเชทเชฎ เชเชพเชฎเชฆเชพเชฐ-เช. เช เชจเซ เชชเชเซ เชธเชเชชเซเชฐเซเชฃ เชเชฐเซ svn เช เชชเชกเซเช. เชฎเซเชก เชชเซเชฐเชพเชฎเซเชเชฐ เชฆเซเชตเชพเชฐเชพ เชเซเช เชตเซเชฒ เชเซ เชฎเซเชก = เชธเชเชชเซเชฐเซเชฃ, เชชเชฆเซเชงเชคเชฟ=เชคเชพเชเซ. เชชเชฐเชฟเชฎเชพเชฃ haltOnTailure เชเชนเซ เชเซ เชเซ เชเซ svn เช เชชเชกเซเช เชญเซเชฒ เชธเชพเชฅเซ เชเชฒเชพเชตเชตเชพเชฎเชพเช เชเชตเชถเซ, เชคเซ เชชเชเซ เชฌเชฟเชฒเซเชกเชฟเชเช เช เชจเซ เชชเชฐเซเชเซเชทเชฃเชจเซ เชธเชฎเชเซเชฐ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเซ เชธเซเชฅเชเชฟเชค เชเชฐเชตเซ เชเซเชเช, เชเชพเชฐเชฃ เชเซ เชเชเชณเชจเซ เชเซเชฐเชฟเชฏเชพเชเชจเซ เชเซเช เช เชฐเซเชฅ เชจเชฅเซ.
6.3 เชคเชฎเชจเซ เชชเชคเซเชฐ: เชชเชคเซเชฐเชเชพเชฐเซ เชเชพเชนเซเชฐ เชเชฐเชตเชพ เชฎเชพเชเซ เช เชงเชฟเชเซเชค เชเซ
เชชเชคเซเชฐเชเชพเชฐเซ เชเชฎเซเชเชฒ เชฆเซเชตเชพเชฐเชพ เชธเซเชเชจเชพเช เชฎเซเชเชฒเชตเชพ เชฎเชพเชเซเชจเซ เชธเซเชตเชพ เชเซ.
template_html=u'''
<h4>ะกัะฐััั ะฟะพัััะพะตะฝะฝะพะณะพ ัะตะปะธะทะฐ: {{ summary }}</h4>
<p>ะัะฟะพะปัะทัะตะผัะน ัะตัะฒะธั ะดะปั ะฟะพัััะฐะตะฝะธั: {{ workername }}</p>
<p>ะัะพะตะบั: {{ projects }}</p>
<p>ะะปั ัะพะณะพ ััะพ ะฑั ะฟะพัะผะพััะตัั ะธะฝัะตััะตะนั ัะฟัะฐะฒะปะตะฝะธั ะฟัะพะนะดะธัะต ะฟะพ ัััะปะบะต: {{ buildbot_url }}</p>
<p>ะะปั ัะพะณะพ ััะพ ะฑั ะฟะพัะผะพััะตัั ัะตะทัะปััะฐั ัะฑะพัะบะธ ะฟัะพะนะดะธัะต ะฟะพ ัััะปะบะต: {{ build_url }}</p>
<p>ะัะฟะพะปัะทัั WinSCP ะผะพะถะฝะพ ะฟะพะดะบะปััะธัััั ะบ ัะตัะฒะตัั c ip:xxx.xx.xxx.xx. ะะพะนะดั ะฟะพะด habr/password, ะทะฐะฑัะฐัั ัะพะฑัะฐะฝะฝัะน executable ัะฐะนะป ั ะดะธัะตะบัะพัะธะธ ~/worker/yourProject/build/dist.</p>
<p><b>ะะพัััะพะตะฝะธะต ะฑัะปะพ ะฟัะพะธะทะฒะตะดะตะฝะพ ัะตัะตะท Buildbot</b></p>
'''
sendMessageToAll = reporters.MailNotifier(fromaddr="[email protected]",
sendToInterestedUsers=True,
lookup="your.domain",
relayhost="smtp.your.domain",
smtpPort=1025,
mode="warnings",
extraRecipients=['[email protected]'],
messageFormatter=reporters.MessageFormatter(
template=template_html,
template_type='html',
wantProperties=True,
wantSteps=True)
)
c['services'] = [sendMessageToAll]
เชคเซ เชธเชเชฆเซเชถเชพ เชฎเซเชเชฒเซ เชถเชเซ เชเซ
MailNotifier เชธเซเชเชจเชพเช เชฎเซเชเชฒเชตเชพ เชฎเชพเชเซ เชเชฎเซเชฒเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ.
เชเซเชฎเซเชชเชฒเซเช_html เชจเซเชฏเซเชเชฒเซเชเชฐ เชฎเชพเชเซ เชเซเชเซเชธเซเช เชเซเชฎเซเชชเชฒเซเช เชธเซเช เชเชฐเซ เชเซ. HTML เชจเซ เชเชชเชฏเซเช เชฎเชพเชฐเซเชเช
เชช เชฌเชจเชพเชตเชตเชพ เชฎเชพเชเซ เชฅเชพเชฏ เชเซ. เชคเซ เชเชจเซเชเชฟเชจ เชฆเซเชตเชพเชฐเชพ เชธเซเชงเชพเชฐเซเชฒ เชเซ
MailNotifier เชจเซเชเซเชจเซ เชฆเชฒเซเชฒเซ เชธเชฎเชพเชตเซ เชเซ.
เชฎเชพเชเชฅเซ เชเชฎเซเชฐเซ - เชธเชฐเชจเชพเชฎเซเช เชเซเชฏเชพเชเชฅเซ เชฆเชฐเซเชเชจเซ เชจเซเชฏเซเชเชฒเซเชเชฐ เชชเซเชฐเชพเชชเซเชค เชฅเชถเซ.
เชฐเชธ เชงเชฐเชพเชตเชคเชพ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเชเชจเซ เชฎเซเชเชฒเซ=True เชฌเชจเชพเชตเชจเชพเชฐ เชฎเชพเชฒเชฟเช เช เชจเซ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเชจเซ เชธเชเชฆเซเชถ เชฎเซเชเชฒเซ เชเซ เชฎเซเชเชฒเชตเซเช.
เชเซเช โ เชเช เชชเซเชฐเชคเซเชฏเชฏ เชเซ เชเซ เชจเซเชฏเซเชเชฒเซเชเชฐ เชชเซเชฐเชพเชชเซเชค เชเชฐเชจเชพเชฐเชพ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเชเชจเชพ เชจเชพเชฎเซเชฎเชพเช เชเชฎเซเชฐเชตเซ เชเชตเชถเซเชฏเช เชเซ. เชคเซเชฅเซ เชธเชเชเชพเชฒเช เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเชจเซ เชธเชฐเชจเชพเชฎเชพเช เชชเชฐ เชจเซเชฏเซเชเชฒเซเชเชฐ เชเซเชตเซ เชฐเซเชคเซ เชชเซเชฐเชพเชชเซเชค เชฅเชถเซ [เชเชฎเซเชเชฒ เชธเซเชฐเชเซเชทเชฟเชค].
relayhost เชนเซเชธเซเชเชจเชพเชฎ เชธเซเชชเชทเซเช เชเชฐเซ เชเซ เชเซ เชเซเชจเชพ เชชเชฐ เชธเชฐเซเชตเชฐ เชเซเชฒเซ เชเซ SMTPเชเช smptPort เชชเซเชฐเซเช เชจเชเชฌเชฐเชจเซ เชเชฒเซเชฒเซเช เชเชฐเซ เชเซ เชเซ เชธเชพเชเชญเชณเซ เชเซ SMTP เชธเชฐเซเชตเชฐ
เชฎเซเชก="เชเซเชคเชตเชฃเซ" เชเชนเซ เชเซ เชเซ เชฎเซเชเชฒเชฟเชเช เชซเชเซเชค เชคเซเชฏเชพเชฐเซ เช เชฅเชตเซเช เชเซเชเช เชเซ เชคเซเชฏเชพเช เชเชเชพเชฎเชพเช เชเชเซเช เชเช เชชเชเชฒเซเช เชนเซเชฏ เชฌเชฟเชฒเซเชก เชเชฐเซ-a, เชเซ เชธเซเชฅเชฟเชคเชฟ เชจเชฟเชทเซเชซเชณเชคเชพ เช เชฅเชตเชพ เชเซเชคเชตเชฃเซ เชธเชพเชฅเซ เชธเชฎเชพเชชเซเชค เชฅเชพเชฏ เชเซ. เชธเชซเชณเชคเชพเชจเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช, เชจเซเชฏเซเชเชฒเซเชเชฐ เชฎเซเชเชฒเชตเชพเชจเซ เชเชฐเซเชฐ เชจเชฅเซ.
เชตเชงเชพเชฐเชพเชจเชพ เชชเซเชฐเชพเชชเซเชคเชเชฐเซเชคเชพเช เชฎเชพเชฒเชฟเช เช เชจเซ เชคเซ เชตเซเชฏเชเซเชคเชฟ เชเซ เชเซเชฎเชฃเซ เชฎเซเชเชฒเชฟเชเช เชฎเซเชเชฒเชตเซเช เชเซเชเช เชคเซ เชตเซเชฏเชเซเชคเชฟเชเชจเซ เชธเซเชเชฟ เชงเชฐเชพเชตเซ เชเซ เชฎเซเชเชฒเชตเซเช.
เชธเชเชฆเซเชถ เชซเซเชฐเซเชฎเซเชเชฐ เช เชเช เชเชฌเซเชเซเชเซเช เชเซ เชเซ เชธเชเชฆเซเชถ เชซเซเชฐเซเชฎเซเช, เชคเซเชจเซ เชจเชฎเซเชจเซ เช เชจเซ เชเชชเชฒเชฌเซเชง เชเชฒเซเชจเซ เชธเชฎเซเชน เชธเซเชชเชทเซเช เชเชฐเซ เชเซ เชเซเชจเซเชเชพ2. เชเซเชตเชพ เชตเชฟเชเชฒเซเชชเซ wantProperties=เชธเชพเชเซเช ะธ wantSteps=เชธเชพเชเซเช เชเชชเชฒเชฌเซเชง เชเชฒเซเชจเชพ เช เชธเชฎเซเชนเชจเซ เชตเซเชฏเชพเชเซเชฏเชพเชฏเชฟเชค เชเชฐเซ.
เชธเชพเชฅเซ['services']=[sendMessageToAll] เชธเซเชตเชพเชเชจเซ เชธเซเชเชฟ เชชเซเชฐเชฆเชพเชจ เชเชฐเซ เชเซ, เชเซเชฎเชพเชเชฅเซ เช เชฎเชพเชฐเซ เชนเชถเซ เชชเชคเซเชฐเชเชพเชฐ.
เช เชฎเซ เชคเซ เชเชฐเซเชฏเซเช! เช เชญเชฟเชจเชเชฆเชจ
เช เชฎเซ เช เชฎเชพเชฐเซเช เชชเซเชคเชพเชจเซเช เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชฌเชจเชพเชตเซเชฏเซเช เชเซ เช เชจเซ เชคเซ เชเชพเชฐเซเชฏเชเซเชทเชฎเชคเชพ เชเซเช เชเซ เชเซ เชคเซ เชธเชเซเชทเชฎ เชเซ. เชฌเชฟเชฒเซเชกเชฌเซเช. เชฎเชจเซ เชฒเชพเชเซ เชเซ เชเซ, เชคเชฎเชพเชฐเชพ เชชเซเชฐเซเชเซเชเซเชเชจเซ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชเซ เช เชธเชพเชงเชจเชจเซ เชเชฐเซเชฐ เชเซ เชเซ เชเซเชฎ เชคเซ เชธเชฎเชเชตเชพ เชฎเชพเชเซ เช เชชเซเชฐเชคเซเช เชเซ. เชถเซเช เชคเชฎเชจเซ เชคเซเชจเชพเชฎเชพเช เชฐเชธ เชเซ? เชถเซเช เชคเซ เชคเชฎเชพเชฐเชพ เชฎเชพเชเซ เชเชชเชฏเซเชเซ เชฅเชถเซ? เชถเซเช เชคเซ เชคเซเชจเซ เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเชพ เชฎเชพเชเซ เชเชฐเชพเชฎเชฆเชพเชฏเช เชเซ? เชคเซ เชชเชเซ เชนเซเช เช เชฒเซเช เชตเซเชฏเชฐเซเชฅ เชจเชฅเซ เชฒเชเซ เชฐเชนเซเชฏเซ.
เช เชจเซ เชเชเชณ. เชนเซเช เชตเซเชฏเชพเชตเชธเชพเชฏเชฟเช เชธเชฎเซเชฆเชพเชฏเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพ เชฎเชพเชเชเซ เชเซเช เชฌเชฟเชฒเซเชกเชฌเซเช, เชตเซเชฏเชพเชชเช เชฌเชจเซเชฏเซเช, เชฎเชพเชฐเซเชเชฆเชฐเซเชถเชฟเชเชพเชเชจเซเช เชญเชพเชทเชพเชเชคเชฐ เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช, เช เชจเซ เชคเซเชฏเชพเช เชชเชฃ เชตเชงเซ เชเชฆเชพเชนเชฐเชฃเซ เชเซ.
เชคเชฎเชพเชฐเชพ เชงเซเชฏเชพเชจ เชฎเชพเชเซ เชฌเชงเชพเชจเซ เชเชญเชพเชฐ. เชธเชพเชฐเชพ เชจเชธเซเชฌ.
เชธเซเชฐเซเชธ: www.habr.com