BuildBot เชธเชพเชฅเซ‡ เชธเชคเชค เชเช•เซ€เช•เชฐเชฃเชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ เช…เชฎเชฒเซ€เช•เชฐเชฃ

BuildBot เชธเชพเชฅเซ‡ เชธเชคเชค เชเช•เซ€เช•เชฐเชฃเชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ เช…เชฎเชฒเซ€เช•เชฐเชฃ
(เชšเชฟเชคเซเชฐ เชฆเซเชตเชพเชฐเชพ เช•เซ‹เชฎเซเชชเซเชฏเซเชŸเชฐเชพเช‡เชเชฐ เชฅเซ€ Pixabay)

เชนเซ‡เชฒเซ‹!

เชฎเชพเชฐเซเช‚ เชจเชพเชฎ เช›เซ‡ เชเชตเชœเซ‡เชจเซ€ เชšเซ‡เชฐเซเช•เชฟเชจ, เชนเซเช‚ เช–เชพเชฃเช•เชพเชฎ เช•เช‚เชชเชจเซ€เชฎเชพเช‚ เชตเชฟเช•เชพเชธ เชŸเซ€เชฎเชฎเชพเช‚ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฐ เช›เซเช‚ เชชเซ‹เชฒเชฟเชฎเซ‡เชŸเชฒ.

เช•เซ‹เชˆเชชเชฃ เชฎเซ‹เชŸเซ‹ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชถเชฐเซ‚ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡, เชคเชฎเซ‡ เชตเชฟเชšเชพเชฐเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซ‹ เช›เซ‹: "เชคเซ‡เชจเซ‡ เชœเชพเชณเชตเชตเชพ เชฎเชพเชŸเซ‡ เช•เชฏเชพ เชธเซ‹เชซเซเชŸเชตเซ‡เชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹ เชถเซเชฐเซ‡เชทเซเช  เช›เซ‡?" เช†เช—เชฒเซเช‚ เชธเช‚เชธเซเช•เชฐเชฃ เชฌเชนเชพเชฐ เชชเชพเชกเชคเชพ เชชเชนเซ‡เชฒเชพ IT เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชธเช‚เช–เซเชฏเชพเชฌเช‚เชง เชคเชฌเช•เซเช•เชพเช“เชฎเชพเช‚เชฅเซ€ เชชเชธเชพเชฐ เชฅเชพเชฏ เช›เซ‡. เชœเซเชฏเชพเชฐเซ‡ เช† เชคเชฌเช•เซเช•เชพเช“เชจเซ€ เชธเชพเช‚เช•เชณ เชธเซเชตเชฏเช‚เชธเช‚เชšเชพเชฒเชฟเชค เชนเซ‹เชฏ เชคเซเชฏเชพเชฐเซ‡ เชคเซ‡ เชธเชพเชฐเซเช‚ เช›เซ‡. เช†เช‡เชŸเซ€ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเชพ เชจเชตเชพ เชธเช‚เชธเซเช•เชฐเชฃเชจเซ‡ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเชตเชพเชจเซ€ เชธเซเชตเชฏเช‚เชธเช‚เชšเชพเชฒเชฟเชค เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชนเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เชธเชคเชค เชเช•เซ€เช•เชฐเชฃ. เชฌเชฟเชฒเซเชกเชฌเซ‹เชŸ เช† เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃเชฎเชพเช‚ เช…เชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เชธเชพเชฐเซ‹ เชธเชนเชพเชฏเช• เชฌเชจเซเชฏเซ‹.

เช† เชฒเซ‡เช–เชฎเชพเช‚ เชฎเซ‡เช‚ เชถเช•เซเชฏเชคเชพเช“เชจเซ€ เชเชพเช‚เช–เซ€ เช†เชชเชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚ เช›เซ‡ เชฌเชฟเชฒเซเชกเชฌเซ‹เชŸ. เช† เชธเซ‹เชซเซเชŸเชตเซ‡เชฐ เชถเซเช‚ เชธเช•เซเชทเชฎ เช›เซ‡? เชคเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชธเช‚เชชเชฐเซเช• เช•เชฐเชตเซ‹ เช…เชจเซ‡ เชคเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เชธเชพเชฎเชพเชจเซเชฏ เช…เชธเชฐเช•เชพเชฐเช• เช•เชพเชฐเซเชฏ เชธเช‚เชฌเช‚เชง เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฌเชจเชพเชตเชตเซ‹? เชคเชฎเซ‡ เชคเชฎเชพเชฐเชพ เชฎเชถเซ€เชจ เชชเชฐ เชคเชฎเชพเชฐเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเชพ เชจเชฟเชฐเซเชฎเชพเชฃ เช…เชจเซ‡ เชชเชฐเซ€เช•เซเชทเชฃ เชฎเชพเชŸเซ‡ เช•เชพเชฐเซเชฏเช•เชพเชฐเซ€ เชธเซ‡เชตเชพ เชฌเชจเชพเชตเซ€เชจเซ‡ เช…เชฎเชพเชฐเซ‹ เช…เชจเซเชญเชต เชœเชพเชคเซ‡ เชฒเชพเช—เซ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹.

เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพ

เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพ

1. เชถเชพ เชฎเชพเชŸเซ‡ เชฌเชฟเชฒเซเชกเชฌเซ‹เชŸ?
2. เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชŸเชฐเชจเซ€ เช†เช—เซ‡เชตเชพเชจเซ€ เชนเซ‡เช เชณเชจเซ‹ เช–เซเชฏเชพเชฒ
3. เชธเซเชฅเชพเชชเชจ
4. เชชเซเชฐเชฅเชฎ เชชเช—เชฒเชพเช‚

5. เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ. เชธเซเชŸเซ‡เชช เชฌเชพเชฏ เชธเซเชŸเซ‡เชช เชฐเซ‡เชธเซ€เชชเซ€

5.1 BuildmasterConfig
5.2 เช•เชพเชฎเชฆเชพเชฐเซ‹
5.3 เชซเซ‡เชฐเชซเชพเชฐ_เชธเซเชฐเซ‹เชค
5.4 เชถเซ‡เชกเซเชฏเซเชฒเชฐเซเชธ

5.5 เชฌเชฟเชฒเซเชก เชซเซ‡เช•เซเชŸเชฐเซ€
5.6 เชฌเชฟเชฒเซเชกเชฐเซ‹

6. เชคเชฎเชพเชฐเซ€ เชชเซ‹เชคเชพเชจเซ€ เช—เซ‹เช เชตเชฃเซ€เชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ

6.1 เชคเชฎเชพเชฐเชพ master.cfg เชจเชพ เชฎเชพเชฐเซเช— เชชเชฐ
6.2 svn เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเซเช‚
6.3 เชคเชฎเชจเซ‡ เชชเชคเซเชฐ: เชชเชคเซเชฐเช•เชพเชฐเซ‹ เชœเชพเชนเซ‡เชฐ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช…เชงเชฟเช•เซƒเชค เช›เซ‡

เช…เชฎเซ‡ เชคเซ‡ เช•เชฐเซเชฏเซเช‚! เช…เชญเชฟเชจเช‚เชฆเชจ

1. เชถเชพ เชฎเชพเชŸเซ‡ เชฌเชฟเชฒเซเชกเชฌเซ‹เชŸ?

เช…เช—เชพเช‰ habr-e เชชเชฐ เชฎเชจเซ‡ เช…เชฎเชฒเซ€เช•เชฐเชฃ เชตเชฟเชถเซ‡เชจเชพ เชฒเซ‡เช–เซ‹ เชฎเชณเซเชฏเชพ เชธเชคเชค เชเช•เซ€เช•เชฐเชฃ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฌเชฟเชฒเซเชกเชฌเซ‹เชŸ. เชฆเชพเช–เซเชฒเชพ เชคเชฐเซ€เช•เซ‡, เช† เชเช• เชฎเชจเซ‡ เชคเซ‡ เชธเซŒเชฅเซ€ เชฎเชพเชนเชฟเชคเซ€เชชเซเชฐเชฆ เชฒเชพเช—เซเชฏเซเช‚. เชฌเซ€เชœเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ เช›เซ‡ - เชธเชฐเชณ. เช† เชฒเซ‡เช–เซ‹ เช…เชจเซเชญเชตเซ€ เชถเช•เชพเชฏ เช›เซ‡ เชฎเซ‡เชจเซเชฏเซเช…เชฒเชฎเชพเช‚เชฅเซ€ เช‰เชฆเชพเชนเชฐเชฃเช…เชจเซ‡ เชคเซ‡ เชคเซ‡ เชชเช›เซ€, เช…เช‚เช—เซเชฐเซ‡เชœเซ€เชฎเชพเช‚. เช•เซ‚เชช เชเช• เชธเชพเชฐเซ‹ เชชเซเชฐเชพเชฐเช‚เชญเชฟเช• เชฌเชฟเช‚เชฆเซ เชฌเชจเชพเชตเซ‡ เช›เซ‡. เช† เชฒเซ‡เช–เซ‹ เชตเชพเช‚เชšเซเชฏเชพ เชชเช›เซ€, เชคเชฎเชจเซ‡ เช•เชฆเชพเชš เชคเชฐเชค เชœ เช•เช‚เชˆเช• เชœเซ‹เชˆเช เช›เซ‡ เชฌเชฟเชฒเซเชกเชฌเซ‹เชŸ เชถเซเช‚ เช•เชฐเชตเซเช‚.

เชฌเช‚เชง! เชถเซเช‚ เช•เซ‹เชˆเช เช–เชฐเซ‡เช–เชฐ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชคเซ‡เชฎเชจเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเซเชธเชฎเชพเช‚ เช•เชฐเซเชฏเซ‹ เช›เซ‡? เชคเซ‡ เชนเชพ เชฌเชนเชพเชฐ เชตเชณเซ‡ เช›เซ‡ เช˜เชฃเชพ เชคเซ‡เชจเซ‡ เชคเซ‡เชฎเชจเชพ เช•เชพเชฐเซเชฏเซ‹เชฎเชพเช‚ เชฒเชพเช—เซ เช•เชฐเซ‹. เชฎเชณเซ€ เชถเช•เซ‡ เช›เซ‡ เช‰เชฆเชพเชนเชฐเชฃเซ‹ ะธัะฟะพะปัŒะทะพะฒะฐะฝะธั เชฌเชฟเชฒเซเชกเชฌเซ‹เชŸ เช…เชจเซ‡ Google เช•เซ‹เชก เช†เชฐเซเช•เชพเช‡เชตเซเชธเชฎเชพเช‚.

เชคเซ‹ เชฒเซ‹เช•เซ‹ เชถเซเช‚ เชคเชฐเซเช• เชตเชพเชชเชฐเซ‡ เช›เซ‡ เชฌเชฟเชฒเซเชกเชฌเซ‹เชŸ? เช›เซ‡เชตเชŸเซ‡, เชคเซเชฏเชพเช‚ เช…เชจเซเชฏ เชธเชพเชงเชจเซ‹ เช›เซ‡: เช•เซเชฐเซเช เชจเชฟเชฏเช‚เชคเซเชฐเชฃ ะธ เชœเซ‡เชจเช•เชฟเชจเซเชธ. เชนเซเช‚ เช† เชฐเซ€เชคเซ‡ เชœเชตเชพเชฌ เช†เชชเซ€เชถ. เชฎเซ‹เชŸเชพ เชญเชพเช—เชจเชพ เช•เชพเชฐเซเชฏเซ‹ เชฎเชพเชŸเซ‡ เชœเซ‡เชจเช•เชฟเชจเซเชธ เช…เชจเซ‡ เชธเชคเซเชฏ เชชเซ‚เชฐเชคเซเช‚ เชนเชถเซ‡. เชคเซ‡เชจเชพ เชฌเชฆเชฒเชพเชฎเชพเช‚, เชฌเชฟเชฒเซเชกเชฌเซ‹เชŸ - เชตเชงเซ เช…เชจเซเช•เซ‚เชฒเชจเชถเซ€เชฒ, เชœเซเชฏเชพเชฐเซ‡ เชธเชฎเชธเซเชฏเชพเช“ เชคเซเชฏเชพเช‚ เชœเซ‡เชŸเชฒเซ€ เชธเชฐเชณ เชฐเซ€เชคเซ‡ เช‰เช•เซ‡เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เชœเซ‡เชจเช•เชฟเชจเซเชธ. เชชเชธเช‚เชฆเช—เซ€ เชคเชฎเชพเชฐเซ€ เช›เซ‡. เชชเชฐเช‚เชคเซ เช…เชฎเซ‡ เชตเชฟเช•เชพเชธเชถเซ€เชฒ เชฒเช•เซเชทเซเชฏ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฎเชพเชŸเซ‡ เชเช• เชธเชพเชงเชจ เชถเซ‹เชงเซ€ เชฐเชนเซเชฏเชพ เชนเซ‹เชตเชพเชฅเซ€, เชถเชพ เชฎเชพเชŸเซ‡ เชธเชฐเชณ เชชเช—เชฒเชพเช“เชฅเซ€ เชถเชฐเซ‚ เช•เชฐเซ€เชจเซ‡, เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เช…เชจเซ‡ เช…เชจเชจเซเชฏ เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชงเชฐเชพเชตเชคเซ€ เชฌเชฟเชฒเซเชก เชธเชฟเชธเซเชŸเชฎ เชฎเซ‡เชณเชตเชตเชพ เชฎเชพเชŸเซ‡ เชชเชฐเชตเชพเชจเช—เซ€ เช†เชชเซ‡ เชคเซ‡เชตเซเช‚ เชเช• เชชเชธเช‚เชฆ เชจ เช•เชฐเซ‹.

เชœเซ‡เชฎเชจเซ‹ เชŸเชพเชฐเซเช—เซ‡เชŸ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เช…เชœเช—เชฐเชฎเชพเช‚ เชฒเช–เชพเชฏเซ‡เชฒเซ‹ เช›เซ‡, เชคเซ‡เชฎเชจเชพ เชฎเชพเชŸเซ‡ เชชเซเชฐเชถเซเชจ เชŠเชญเซ‹ เชฅเชพเชฏ เช›เซ‡: "เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชฎเชพเช‚ เชตเชชเชฐเชพเชคเซ€ เชญเชพเชทเชพเชจเชพ เชธเช‚เชฆเชฐเซเชญเชฎเชพเช‚ เชธเซเชชเชทเซเชŸ เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชงเชฐเชพเชตเชคเซ€ เชเช•เซ€เช•เชฐเชฃ เชธเชฟเชธเซเชŸเชฎ เช•เซ‡เชฎ เชชเชธเช‚เชฆ เชจ เช•เชฐเชตเซ€?" เช…เชจเซ‡ เชนเชตเซ‡ เชฒเชพเชญเซ‹ เชฐเชœเซ‚ เช•เชฐเชตเชพเชจเซ‹ เชธเชฎเชฏ เช›เซ‡ เชฌเชฟเชฒเซเชกเชฌเซ‹เชŸ.

เชคเซ‡เชฅเซ€, เช…เชฎเชพเชฐเซ€ "เชตเชพเชฆเซเชฏ เชšเซ‹เช•เชกเซ€". เชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡, เชฎเซ‡เช‚ เชšเชพเชฐ เชฒเช•เซเชทเชฃเซ‹ เช“เชณเช–เซเชฏเชพ เช›เซ‡ เชฌเชฟเชฒเซเชกเชฌเซ‹เชŸ:

  1. เชคเซ‡ GPL เชฒเชพเชฏเชธเชจเซเชธ เชนเซ‡เช เชณ เชเช• เช“เชชเชจ เชธเซ‹เชฐเซเชธ เชซเซเชฐเซ‡เชฎเชตเชฐเซเช• เช›เซ‡
  2. เช† เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชธเชพเชงเชจ เชคเชฐเซ€เช•เซ‡ เชชเชพเชฏเชฅเซ‹เชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช…เชจเซ‡ เชœเชฐเซ‚เชฐเซ€ เช•เซเชฐเชฟเชฏเชพเช“เชจเซเช‚ เชตเชฐเซเชฃเชจ เช›เซ‡
  3. เชœเซ‡ เชฎเชถเซ€เชจ เชชเชฐ เชเชธเซ‡เชฎเซเชฌเชฒเซ€ เชฅเชพเชฏ เช›เซ‡ เชคเซ‡เชฎเชพเช‚เชฅเซ€ เชชเซเชฐเชคเชฟเชธเชพเชฆ เชฎเซ‡เชณเชตเชตเชพเชจเซ€ เช† เชเช• เชคเช• เช›เซ‡
  4. เช†, เช›เซ‡เชตเชŸเซ‡, เชฏเชœเชฎเชพเชจ เชฎเชพเชŸเซ‡เชจเซ€ เชจเซเชฏเซ‚เชจเชคเชฎ เช†เชตเชถเซเชฏเช•เชคเชพเช“ เช›เซ‡. เชœเชฎเชพเชตเชŸ เชฎเชพเชŸเซ‡ เชชเชพเชฏเชฅเซ‹เชจ เช…เชจเซ‡ เชŸเซเชตเชฟเชธเซเชŸเซ‡เชกเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เช…เชจเซ‡ เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชฎเชถเซ€เชจ เช…เชจเซ‡ เชœเชพเชตเชพ เชฎเชถเซ€เชจเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€.

2. เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชŸเชฐเชจเซ€ เช†เช—เซ‡เชตเชพเชจเซ€ เชนเซ‡เช เชณเชจเซ‹ เช–เซเชฏเชพเชฒ

BuildBot เชธเชพเชฅเซ‡ เชธเชคเชค เชเช•เซ€เช•เชฐเชฃเชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ เช…เชฎเชฒเซ€เช•เชฐเชฃ

เช•เชพเชฐเซเชฏ เชตเชฟเชคเชฐเชฃ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐเชฎเชพเช‚ เช•เซ‡เชจเซเชฆเซเชฐเชฟเชฏ เช›เซ‡ เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชŸเชฐ. เชคเซ‡ เชเช• เชธเซ‡เชตเชพ เช›เซ‡ เชœเซ‡:

  • เชŸเซเชฐเซ‡เช• เชฐเชพเช–เซ‡ เช›เซ‡ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชธเซเชคเซเชฐเซ‹เชค เชตเซƒเช•เซเชทเชฎเชพเช‚ เชซเซ‡เชฐเชซเชพเชฐเซ‹
  • เชฎเซ‹เช•เชฒเซ‡ เช›เซ‡ เช†เชฆเซ‡เชถเซ‹ เช•เซ‡ เชœเซ‡ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฌเชจเชพเชตเชตเชพ เช…เชจเซ‡ เชคเซ‡เชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เชพเชฐเซเชฏเช•เชฐ เชธเซ‡เชตเชพ เชฆเซเชตเชพเชฐเชพ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเชพ เชœเซ‹เชˆเช
  • เชธเซ‚เชšเชฟเชค เช•เชฐเซ‡ เช›เซ‡ เชฒเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒเชพ เชชเช—เชฒเชพเช‚เชจเชพ เชชเชฐเชฟเชฃเชพเชฎเซ‹ เชตเชฟเชถเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“

เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชŸเชฐ เชซเชพเช‡เชฒ เชฆเซเชตเชพเชฐเชพ เช—เซ‹เช เชตเซ‡เชฒ 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 # ะกะพะฑัั‚ะฒะตะฝะฝะพ ัะดะตััŒ ะธ ัะพะทะดะฐะตะผ

เช†เช—เชณเชจเซเช‚ เชชเช—เชฒเซเช‚. เชšเชพเชฒเซ‹ เชฌเชจเชพเชตเซ€เช เช•เชพเชฎเชฆเชพเชฐ. เชคเซ‡ เช…เชฎเชพเชฐเชพ เชซเซ‹เชฒเซเชกเชฐเชฎเชพเช‚ เชนเชถเซ‡ /home/habr/worker.

mkdir worker
buildbot-worker create-worker --umask=0o22 --keepalive=60 worker localhost:4000 yourWorkerName password

เชœเซเชฏเชพเชฐเซ‡ เชคเชฎเซ‡ เชšเชฒเชพเชตเซ‹ เช›เซ‹ เช•เชพเชฎเชฆเชพเชฐ, เชชเช›เซ€ เชฎเซ‚เชณเชญเซ‚เชค เชฐเซ€เชคเซ‡ เชคเซ‡ เชฎเชพเช‚ เชฌเชจเชพเชตเชถเซ‡ /home/habr/worker เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเชพ เชจเชพเชฎ เชธเชพเชฅเซ‡ เชซเซ‹เชฒเซเชกเชฐ, เชœเซ‡เชฎเชพเช‚ เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เช›เซ‡ master.cfg. เช…เชจเซ‡ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเชพ เชจเชพเชฎ เชธเชพเชฅเซ‡เชจเชพ เชซเซ‹เชฒเซเชกเชฐเชฎเชพเช‚ เชคเซ‡ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€ เชฌเชจเชพเชตเชถเซ‡ เชฌเชฟเชฒเซเชก เช•เชฐเซ‹, เช…เชจเซ‡ เชคเซ‡ เช•เชฐเชตเชพเชจเซเช‚ เชšเชพเชฒเซ เชฐเชพเช–เชถเซ‡ เชšเซ‡เช•เช†เช‰เชŸ. เชฎเชพเชŸเซ‡ เช•เชพเชฐเซเชฏเช•เชพเชฐเซ€ เชจเชฟเชฐเซเชฆเซ‡เชถเชฟเช•เชพ เช•เชพเชฎเชฆเชพเชฐ-เช…เชจเซ‡ เชคเซ‡ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€ เชฌเชจเซ€ เชœเชถเซ‡ /home/habr/yourProject/build.

"เช—เซ‹เชฒเซเชกเชจ เช•เซ€
เช…เชจเซ‡ เชนเชตเซ‡ เชฎเซ‡เช‚ เชชเชพเช›เชฒเซ‹ เชซเช•เชฐเซ‹ เชœเซ‡เชจเชพ เชฎเชพเชŸเซ‡ เชฒเช–เซเชฏเซ‹ เช›เซ‡: เชเช• เชธเซเช•เซเชฐเชฟเชชเซเชŸ เช•เซ‡ เชœเซ‡ เชฎเชพเชธเซเชŸเชฐ เชชเชพเชธเซ‡เชฅเซ€ เชฎเชพเช‚เช—เชฃเซ€ เช•เชฐเชถเซ‡ เช•เชพเชฎเชฆเชพเชฐ-เช…เชจเซ‡ เช† เชจเชฟเชฐเซเชฆเซ‡เชถเชฟเช•เชพเชฎเชพเช‚ เชฆเซ‚เชฐเชธเซเชฅ เชฐเซ€เชคเซ‡ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เชคเซ‡ เชšเชฒเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เชจเชนเซ€เช‚ เช•เชพเชฐเชฃ เช•เซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซ‡ เชšเชฒเชพเชตเชตเชพเชจเชพ เช…เชงเชฟเช•เชพเชฐเซ‹ เชจเชฅเซ€. เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟเชจเซ‡ เชธเซเชงเชพเชฐเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เช•เซ€เชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡ --umask=0o22, เชœเซ‡ เช† เชจเชฟเชฐเซเชฆเซ‡เชถเชฟเช•เชพเชฎเชพเช‚ เชฒเช–เชตเชพ เชชเชฐ เชชเซเชฐเชคเชฟเชฌเช‚เชง เชฎเซ‚เช•เซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เชฒเซ‹เชจเซเชš เช…เชงเชฟเช•เชพเชฐเซ‹ เชœเชพเชณเชตเซ€ เชฐเชพเช–เชถเซ‡. เช…เชจเซ‡ เชคเซ‡ เชœ เช†เชชเชฃเชจเซ‡ เชœเซ‹เชˆเช เช›เซ‡.

เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชŸเชฐ ะธ เช•เชพเชฎเชฆเชพเชฐ เชเช•เชฌเซ€เชœเชพ เชธเชพเชฅเซ‡ เชœเซ‹เชกเชพเชฃ เชธเซเชฅเชพเชชเชฟเชค เช•เชฐเซ‹. เชเชตเซเช‚ เชฌเชจเซ‡ เช›เซ‡ เช•เซ‡ เชคเซ‡ เชคเซ‚เชŸเซ€ เชœเชพเชฏ เช›เซ‡ เช…เชจเซ‡ เช•เชพเชฎเชฆเชพเชฐ เชคเชฐเชซเชฅเซ€ เชชเซเชฐเชคเชฟเชธเชพเชฆ เชฎเชพเชŸเซ‡ เชฅเซ‹เชกเซ‹ เชธเชฎเชฏ เชฐเชพเชน เชœเซเช“ เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชŸเชฐ-เช. เชœเซ‹ เชคเซเชฏเชพเช‚ เช•เซ‹เชˆ เชชเซเชฐเชคเชฟเชธเชพเชฆ เชจเชฅเซ€, เชคเซ‹ เช•เชจเซ‡เช•เซเชถเชจ เชชเซเชจเชƒเชชเซเชฐเชพเชฐเช‚เชญ เชฅเชพเชฏ เช›เซ‡. เช•เซ€ --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". เชถเซ€เชฐเซเชทเช•เซ‹ เช•เซ€เช“ ะฒ c["keyFromDist"] เชธเชพเชฅเซ‡ เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เชฎเชพเชŸเซ‡ เชจเชฟเชถเซเชšเชฟเชค เชคเชคเซเชตเซ‹ เช›เซ‡ เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชŸเชฐ. เชฆเชฐเซ‡เช• เช•เซ€ เชฎเชพเชŸเซ‡, เช…เชจเซเชฐเซ‚เชช เช‘เชฌเซเชœเซ‡เช•เซเชŸเชจเซ‡ เชฎเซ‚เชฒเซเชฏ เชคเชฐเซ€เช•เซ‡ เชฌเชฆเชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

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. เช† เชชเช—เชฒเชพเช‚เช“ เชตเชšเซเชšเซ‡ เชธเซ‚เชšเชตเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เชธเซเชงเชพเชฐเซ‹ เชญเช‚เชกเชพเชฐ เชฌเชฐเชพเชฌเชฐ เชšเชพเชฒเซ เช•เชพเชฎเชฆเชพเชฐเช† เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชจเซ€ เชธเซเชฅเชพเชจเชฟเช• เชจเช•เชฒ เชฌเชจเชพเชตเชถเซ‡. เช† เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ€ เชตเชฟเช—เชคเซ‹ เช†เช—เชพเชฎเซ€ เชฌเซ‡ เชตเชฟเชญเชพเช—เซ‹เชฎเชพเช‚ เชจเซ€เชšเซ‡ เช†เชตเชฐเซ€ เชฒเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡. (5.4 ะธ 5.5).

เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เชฅเชคเชพ เชซเซ‡เชฐเชซเชพเชฐเซ‹เชจเซ‡ เชŸเซเชฐเซ…เช• เช•เชฐเชตเชพเชจเซ€ เชเช• เชตเชงเซ เชญเชตเซเชฏ เชชเชฆเซเชงเชคเชฟ เช เช›เซ‡ เช•เซ‡ เชคเซ‡เชจเซ‡ เชนเซ‹เชธเซเชŸ เช•เชฐเชคเชพ เชธเชฐเซเชตเชฐเชฅเซ€ เชธเซ€เชงเชพ เชœ เชธเช‚เชฆเซ‡เชถเชพเช“ เชฎเซ‹เช•เชฒเชตเชพ เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชŸเชฐ- เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชธเซ‹เชฐเซเชธ เช•เซ‹เชก เชฌเชฆเชฒเชตเชพ เชตเชฟเชถเซ‡. เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชœเชฒเชฆเซ€ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพ เชฌเชจเชพเชตเซ‡ เช›เซ‡ เชฎเซ‹เช•เชฒเชตเซเช‚, เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€ เชธเชพเชฅเซ‡เชจเซเช‚ เชธเชฐเซเชตเชฐ เชเช• เชธเช‚เชฆเซ‡เชถ เชฎเซ‹เช•เชฒเชถเซ‡ เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชŸเชฐ-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"]))

เชถเซ‡เชกเซเชฏเซเชฒเชฐเซเชธ - เช† เชเช• เชคเชคเซเชต เช›เซ‡ เชœเซ‡ เชŸเซเชฐเชฟเช—เชฐ เชคเชฐเซ€เช•เซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡ เชœเซ‡ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเซ€ เชเชธเซ‡เชฎเซเชฌเชฒเซ€ เช…เชจเซ‡ เชชเชฐเซ€เช•เซเชทเชฃเชจเซ€ เชธเชฎเช—เซเชฐ เชธเชพเช‚เช•เชณ เชถเชฐเซ‚ เช•เชฐเซ‡ เช›เซ‡.
BuildBot เชธเชพเชฅเซ‡ เชธเชคเชค เชเช•เซ€เช•เชฐเชฃเชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ เช…เชฎเชฒเซ€เช•เชฐเชฃ

เชคเซ‡ เชซเซ‡เชฐเชซเชพเชฐเซ‹ เช•เซ‡ เชœเซ‡ เชฐเซ‡เช•เซ‹เชฐเซเชก เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เชนเชคเชพ เชซเซ‡เชฐเชซเชพเชฐ_เชธเซเชฐเซ‹เชค, เช•เชพเชฎเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชฎเชพเช‚ เชฐเซ‚เชชเชพเช‚เชคเชฐเชฟเชค เชฌเชฟเชฒเซเชกเชฌเซ‹เชŸ-เช เชตเชพเช‚เชงเซ‹ เช‰เช เชพเชตเชตเซ‹ เชฌเชฆเชฒเซ‹ เช…เชจเซ‡ เชนเชตเซ‡ เชฆเชฐเซ‡เช• เชถเซ‡เชกเซเชฏเซเชฒเชฐ เชคเซ‡เชฎเชจเชพ เช†เชงเชพเชฐเซ‡, เชคเซ‡ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฌเชฟเชฒเซเชก เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชถเชฐเซ‚ เช•เชฐเชตเชพ เชตเชฟเชจเช‚เชคเซ€เช“ เชฌเชจเชพเชตเซ‡ เช›เซ‡. เชœเซ‹ เช•เซ‡, เชคเซ‡ เช เชชเชฃ เชจเชฟเชฐเซเชงเชพเชฐเชฟเชค เช•เชฐเซ‡ เช›เซ‡ เช•เซ‡ เช† เชตเชฟเชจเช‚เชคเซ€เช“ เช•เชคเชพเชฐเชฎเชพเช‚ เช†เช—เชณ เช•เซเชฏเชพเชฐเซ‡ เชŸเซเชฐเชพเชจเซเชธเชซเชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡. เชเช• เชชเชฆเชพเชฐเซเชฅ เชฌเชฟเชฒเซเชกเชฐ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซ€ เช•เชคเชพเชฐ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชตเชฐเซเชคเชฎเชพเชจ เชเชธเซ‡เชฎเซเชฌเชฒเซ€เชจเซ€ เชธเซเชฅเชฟเชคเชฟเชจเซ‡ เช…เชฒเช— เชชเชฐ เชŸเซเชฐเซ…เช• เช•เชฐเซ‡ เช›เซ‡ เช•เชพเชฎเชฆเชพเชฐ-e. เชฌเชฟเชฒเซเชกเชฐ เชชเชฐ เช…เชธเซเชคเชฟเชคเซเชต เชงเชฐเชพเชตเซ‡ เช›เซ‡ เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชŸเชฐ-e เช…เชจเซ‡ เชšเชพเชฒเซ เช•เชพเชฎเชฆเชพเชฐ-e. เชคเซ‡ เชธเชพเชฅเซ‡ เชฎเซ‹เช•เชฒเซ‡ เช›เซ‡ เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชŸเชฐ-เชเช• เชชเชฐ เช•เชพเชฎเชฆเชพเชฐ- เช…เชจเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชšเซ‹เช•เซเช•เชธ เชฌเชฟเชฒเซเชก เช•เชฐเซ‹ - เชชเช—เชฒเชพเช‚เช“เชจเซ€ เชถเซเชฐเซ‡เชฃเซ€ เช•เซ‡ เชœเซ‡ เช…เชจเซเชธเชฐเชตเซเช‚ เช†เชตเชถเซเชฏเช• เช›เซ‡.
เช†เชชเชฃเซ‡ เชคเซ‡ เชตเชฐเซเชคเชฎเชพเชจ เช‰เชฆเชพเชนเชฐเชฃเชฎเชพเช‚ เชœเซ‹เชˆเช เช›เซ€เช เชถเซ‡เชกเซเชฏเซเชฒเชฐเซเชธ 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. เชœเซ‹ เช•เซ‡, เชชเช›เซ€ เชคเซเชฏเชพเช‚ เชฌเซ‡ "เชชเชฐเช‚เชคเซ" เช›เซ‡:

  1. เช•เชพเชฎเชฆเชพเชฐ เช•เซ€ เชตเชกเซ‡ เชฌเชจเชพเชตเชตเซเช‚ เชœเซ‹เชˆเช --เช‰เชฎเชพเชธเซเช• เชœเซ‡เชฅเซ€ เชคเซ‡ เชชเช›เซ€ เช…เชฎเชฒเชจเชพ เช…เชงเชฟเช•เชพเชฐเซ‹เชจเซ‡ เช…เชตเชฐเซ‹เชงเซ‡ เชจเชนเซ€เช‚ เชšเซ‡เช•เช†เช‰เชŸ-เช†.
  2. เช…เช‚เชคเซ‡ เช—เซ€เชŸ เชฆเชฌเชพเชฃ-e เช† เชธเซเช•เซเชฐเชฟเชชเซเชŸเซ‹เชฎเชพเช‚เชฅเซ€ เชคเชฎเชพเชฐเซ‡ เชฎเชฟเชฒเช•เชคเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เชเช•เซเชเชฟเช•เซเชฏเซเชŸเซ‡เชฌเชฒเชœเซ‡เชฅเซ€ เชชเช›เซ€เชฅเซ€ เชšเซ‡เชšเช†เช‰เชŸ-e เช เช—เชฟเชŸ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชšเชฒเชพเชตเชตเชพเชจเซ‹ เช…เชงเชฟเช•เชพเชฐ เช—เซเชฎเชพเชตเซเชฏเซ‹ เชจเชฅเซ€.

5.6 เชฌเชฟเชฒเซเชกเชฐเซ‹


c['builders'] = []
c['builders'].append(util.BuilderConfig(name="runtests",
                                        workernames=["example-worker"],
                                        factory=factory))

เชถเซเช‚ เช›เซ‡ เชคเซ‡ เชตเชฟเชถเซ‡ เชฌเชฟเชฒเซเชกเชฐ เช•เชนเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเชคเซเช‚ เช…เชนเซ€เช‚. เชนเชตเซ‡ เชนเซเช‚ เชคเชฎเชจเซ‡ เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฌเชจเชพเชตเชตเซเช‚ เชคเซ‡ เชตเชฟเชถเซ‡ เชตเชงเซ เชตเชฟเช—เชคเชตเชพเชฐ เชœเชฃเชพเชตเซ€เชถ. เชฌเชฟเชฒเซเชกเชฐเช•เซ‹เชจเซเชซเชฟเช— เชเช• เช•เชจเซเชธเซเชŸเซเชฐเช•เซเชŸเชฐ เช›เซ‡ เชฌเชฟเชฒเซเชกเชฐ. เชฎเชพเช‚ เช†เชตเชพ เชกเชฟเชเชพเช‡เชจเชฐเซ‹ c['เชฌเชฟเชฒเซเชกเชฐเซ‹'] เชคเชฎเซ‡ เช˜เชฃเชพเชจเซ‡ เชธเซเชชเชทเซเชŸ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹, เช•เชพเชฐเชฃ เช•เซ‡ เช† เช‘เชฌเซเชœเซ‡เช•เซเชŸเซเชธเชจเซ€ เชถเซ€เชŸ เช›เซ‡ เชฌเชฟเชฒเซเชกเชฐ เชชเซเชฐเช•เชพเชฐ เชนเชตเซ‡ เชฎเชพเช‚เชฅเซ€ เช‰เชฆเชพเชนเชฐเชฃ เชซเชฐเซ€ เชฒเช–เซ€เช เชฌเชฟเชฒเซเชกเชฌเซ‹เชŸ, เชคเซ‡เชจเซ‡ เช…เชฎเชพเชฐเชพ เช•เชพเชฐเซเชฏเชจเซ€ เชจเชœเซ€เช• เชฒเชพเชตเซ€เช เช›เซ€เช.


c['builders'] = []
c['builders'].append(util.BuilderConfig(name="yourProject",
                                            workernames=["yourWorkerName"],
                                            factory=factory))

เชนเชตเซ‡ เชนเซเช‚ เชคเชฎเชจเซ‡ เชชเชฐเชฟเชฎเชพเชฃเซ‹ เชตเชฟเชถเซ‡ เช•เชนเซ€เชถ เชฌเชฟเชฒเซเชกเชฐเช•เซ‹เชจเซเชซเชฟเช—.

เชจเชพเชฎ เชจเชพเชฎ เชธเซเชชเชทเซเชŸ เช•เชฐเซ‡ เช›เซ‡ เชฌเชฟเชฒเซเชกเชฐ-a เช…เชนเซ€เช‚ เช…เชฎเซ‡ เชคเซ‡เชจเซเช‚ เชจเชพเชฎ เช†เชชเซเชฏเซเช‚ เช›เซ‡ เชคเชฎเชพเชฐเซ‹ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ... เช†เชจเซ‹ เช…เชฐเซเชฅ เช›เซ‡ เช•เซ‡ เชšเชพเชฒเซ เช•เชพเชฎเชฆเชพเชฐ- เช† เชœ เชฐเชธเซเชคเซ‹ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ /home/habr/worker/yourProject/build. เชถเซ‡เชกเซเชฏเซเชฒเชฐ เชจเซ€ เชธเซ‹เชง เชฎเชพ เชนเซ‹เชตเซ เชฌเชฟเชฒเซเชกเชฐ เชซเช•เซเชค เช† เชจเชพเชฎเชฅเซ€.

เช•เชพเชฎเชฆเชพเชฐเซ‹เชจเชพ เชจเชพเชฎ เชถเซ€เชŸ เชธเชฎเชพเชตเซ‡ เช›เซ‡ เช•เชพเชฎเชฆเชพเชฐ-เช“. เชœเซ‡เชฎเชพเช‚เชจเชพ เชฆเชฐเซ‡เช•เชฎเชพเช‚ เช‰เชฎเซ‡เชฐเชตเซเช‚ เช†เชตเชถเซเชฏเช• เช›เซ‡ c['เช•เชพเชฎเชฆเชพเชฐเซ‹'].

เชซเซ‡เช•เซเชŸเชฐเซ€ - เชšเซ‹เช•เซเช•เชธ เชฌเชฟเชฒเซเชก เช•เชฐเซ‹, เชœเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เชคเซ‡ เชธเช‚เช•เชณเชพเชฏเซ‡เชฒ เช›เซ‡ เชฌเชฟเชฒเซเชกเชฐ. เชคเซ‡ เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชฎเซ‹เช•เชฒเชถเซ‡ เชฌเชฟเชฒเซเชก เช•เชฐเซ‹ เชชเชฐ เช•เชพเชฎเชฆเชพเชฐ เช†เชฎเชพเช‚ เชธเชฎเชพเชตเชฟเชทเซเชŸ เชคเชฎเชพเชฎ เชชเช—เชฒเชพเช“ เชชเซ‚เชฐเซเชฃ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฌเชฟเชฒเซเชก เช•เชฐเซ‹-เช†.

6. เชคเชฎเชพเชฐเซ€ เชชเซ‹เชคเชพเชจเซ€ เช—เซ‹เช เชตเชฃเซ€เชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ

เช…เชนเซ€เช‚ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐเชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ เช›เซ‡ เชœเซ‡เชจเซ‡ เชนเซเช‚ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเชพเชจเซ‹ เชชเซเชฐเชธเซเชคเชพเชต เชฎเซ‚เช•เซเช‚ เช›เซเช‚ เชฌเชฟเชฒเซเชกเชฌเซ‹เชŸ
.

เช…เชฎเซ‡ เชตเชฐเซเชเชจ เช•เช‚เชŸเซเชฐเซ‹เชฒ เชธเชฟเชธเซเชŸเชฎ เชคเชฐเซ€เช•เซ‡ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชถเซเช‚ เชเชธเชตเซ€เชเชจ. เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€ เชชเซ‹เชคเซ‡ เช…เชฎเซเช• เชชเซเชฐเช•เชพเชฐเชจเชพ เชตเชพเชฆเชณเชฎเชพเช‚ เชธเซเชฅเชฟเชค เชนเชถเซ‡. เช† เชตเชพเชฆเชณเชจเซเช‚ เชธเชฐเชจเชพเชฎเซเช‚ เช† เชฐเชนเซเชฏเซเช‚ svn.host/svn/yourProject/trunk. เชตเชพเชฆเชณ เชจเซ€เชšเซ‡ เชเชธเชตเซ€เชเชจ เชคเซเชฏเชพเช‚ เชเช• เชเช•เชพเช‰เชจเซเชŸ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชจเชพเชฎ เช›เซ‡: เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ, passwd: เชชเชพเชธเชตเชฐเซเชก. เชธเซเช•เซเชฐเชฟเชชเซเชŸเซ‹ เชœเซ‡ เชชเช—เชฒเชพเช‚เช“เชจเซเช‚ เชชเซเชฐเชคเชฟเชจเชฟเชงเชฟเชคเซเชต เช•เชฐเซ‡ เช›เซ‡ เชฌเชฟเชฒเซเชก เช•เชฐเซ‹-เช เชชเชฃ เชฌเซเชฐเชพเชจเซเชšเชฎเชพเช‚ เชนเชถเซ‡ เชเชธเชตเซ€เชเชจ, เชเช• เช…เชฒเช— เชซเซ‹เชฒเซเชกเชฐเชฎเชพเช‚ เชฌเชฟเชฒเซเชกเชฌเซ‹เชŸ/เชตเชฐเซเช•เชฐ_เชฒเชฟเชจเช•เซเชธ. เช† เชธเซเช•เซเชฐเชฟเชชเซเชŸเซ‹ เชธเช‚เช—เซเชฐเชนเชฟเชค เชฎเชฟเชฒเช•เชค เชธเชพเชฅเซ‡ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เชธเซเชฅเชฟเชค เช›เซ‡ เชเช•เซเชเซ‡เช•เซเชฏเซเชŸเซ‡เชฌเชฒ.

เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชŸเชฐ ะธ เช•เชพเชฎเชฆเชพเชฐ เชธเชฎเชพเชจ เชนเซ‹เชธเซเชŸ เชชเชฐ เชšเชฒเชพเชตเซ‹ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ.เชนเซ‹เชธเซเชŸ .เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชŸเชฐ เชคเซ‡เชจเซ€ เชซเชพเช‡เชฒเซ‹เชจเซ‡ เชซเซ‹เชฒเซเชกเชฐเชฎเชพเช‚ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเซ‡ เช›เซ‡ /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"
}

เชชเซเชฐเชฅเชฎ เชคเชฎเชพเชฐเซ‡ เชœเชฐเซ‚เชฐ เช›เซ‡ เชฌเชจเชพเชตเชตเซเช‚ เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชŸเชฐ-a เช…เชจเซ‡ เช•เชพเชฎเชฆเชพเชฐ-a เชชเช›เซ€ เช† เชซเชพเชˆเชฒ เชชเซ‡เชธเซเชŸ เช•เชฐเซ‹ master.cfg ะฒ /home/habr/master.

เช†เช—เชณเชจเซเช‚ เชชเช—เชฒเซเช‚ เชธเซ‡เชตเชพ เชถเชฐเซ‚ เช•เชฐเชตเชพเชจเซเช‚ เช›เซ‡ เชฌเชฟเชฒเซเชกเชฎเชพเชธเซเชŸเชฐเช


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 เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฎเชพเชฐเซเช•เช…เชช เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชฅเชพเชฏ เช›เซ‡. เชคเซ‡ เชเชจเซเชœเชฟเชจ เชฆเซเชตเชพเชฐเชพ เชธเซเชงเชพเชฐเซ‡เชฒ เช›เซ‡ เชœเซ€เชจเซเชœเชพ2 (เชธเชพเชฅเซ‡ เชธเชฐเช–เชพเชตเซ€ เชถเช•เชพเชฏ เช›เซ‡ เชœเชพเช‚เช—เซ‹). เชฌเชฟเชฒเซเชกเชฌเซ‹เชŸ เชšเชฒเซ‹เชจเซ‹ เชธเชฎเซ‚เชน เช›เซ‡ เชœเซ‡เชจเซ€ เช•เชฟเช‚เชฎเชคเซ‹ เชธเช‚เชฆเซ‡เชถ เชŸเซ‡เช•เซเชธเซเชŸ เชœเชจเชฐเซ‡เชŸ เช•เชฐเชตเชพเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชŸเซ‡เชฎเซเชชเชฒเซ‡เชŸเชฎเชพเช‚ เช…เชตเซ‡เชœเซ€ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เช† เชšเชฒเซ‹ {{ เชกเชฌเชฒ เช•เชฐเซเชฒเซ€ เช•เซŒเช‚เชธ }} เชฎเชพเช‚ เชฌเช‚เชง เช›เซ‡. เชฆเชพเช–เซเชฒเชพ เชคเชฐเซ€เช•เซ‡, เชธเชพเชฐเชพเช‚เชถ เชชเซ‚เชฐเซเชฃ เชฅเชฏเซ‡เชฒ เช•เชพเชฎเช—เซ€เชฐเซ€เชจเซ€ เชธเซเชฅเชฟเชคเชฟ เชฆเชฐเซเชถเชพเชตเซ‡ เช›เซ‡, เชเชŸเชฒเซ‡ เช•เซ‡ เชธเชซเชณเชคเชพ เช•เซ‡ เชจเชฟเชทเซเชซเชณเชคเชพ. เช เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เช†เช‰เชŸเชชเซเชŸ เช•เชฐเชถเซ‡ เชคเชฎเชพเชฐเซ‹ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ. เชคเซ‡เชฅเซ€, เชฎเชพเช‚ เชจเชฟเชฏเช‚เชคเซเชฐเชฃ เช†เชฆเซ‡เชถเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชœเซ€เชจเซเชœเชพ2, เชšเชฒเซ‹ เชฌเชฟเชฒเซเชกเชฌเซ‹เชŸ-a เช…เชจเซ‡ python เชธเซเชŸเซเชฐเชฟเช‚เช— เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฟเช‚เช— เชŸเซ‚เชฒเซเชธ, เชคเชฎเซ‡ เชคเชฆเซเชฆเชจ เชฎเชพเชนเชฟเชคเซ€เชชเซเชฐเชฆ เชธเช‚เชฆเซ‡เชถ เชฌเชจเชพเชตเซ€ เชถเช•เซ‹ เช›เซ‹.

MailNotifier เชจเซ€เชšเซ‡เชจเซ€ เชฆเชฒเซ€เชฒเซ‹ เชธเชฎเชพเชตเซ‡ เช›เซ‡.

เชฎเชพเช‚เชฅเซ€ เช‰เชฎเซ‡เชฐเซ‹ - เชธเชฐเชจเชพเชฎเซเช‚ เชœเซเชฏเชพเช‚เชฅเซ€ เชฆเชฐเซ‡เช•เชจเซ‡ เชจเซเชฏเซ‚เชเชฒเซ‡เชŸเชฐ เชชเซเชฐเชพเชชเซเชค เชฅเชถเซ‡.

เชฐเชธ เชงเชฐเชพเชตเชคเชพ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“เชจเซ‡ เชฎเซ‹เช•เชฒเซ‹=True เชฌเชจเชพเชตเชจเชพเชฐ เชฎเชพเชฒเชฟเช• เช…เชจเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ‡ เชธเช‚เชฆเซ‡เชถ เชฎเซ‹เช•เชฒเซ‡ เช›เซ‡ เชฎเซ‹เช•เชฒเชตเซเช‚.

เชœเซเช“ โ€” เชเช• เชชเซเชฐเชคเซเชฏเชฏ เช•เซ‡ เชœเซ‡ เชจเซเชฏเซ‚เชเชฒเซ‡เชŸเชฐ เชชเซเชฐเชพเชชเซเชค เช•เชฐเชจเชพเชฐเชพ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“เชจเชพ เชจเชพเชฎเซ‹เชฎเชพเช‚ เช‰เชฎเซ‡เชฐเชตเซ‹ เช†เชตเชถเซเชฏเช• เช›เซ‡. เชคเซ‡เชฅเซ€ เชธเช‚เชšเชพเชฒเช• เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ‡ เชธเชฐเชจเชพเชฎเชพเช‚ เชชเชฐ เชจเซเชฏเซ‚เชเชฒเซ‡เชŸเชฐ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชชเซเชฐเชพเชชเซเชค เชฅเชถเซ‡ [เช‡เชฎเซ‡เช‡เชฒ เชธเซเชฐเช•เซเชทเชฟเชค].

relayhost เชนเซ‹เชธเซเชŸเชจเชพเชฎ เชธเซเชชเชทเซเชŸ เช•เชฐเซ‡ เช›เซ‡ เช•เซ‡ เชœเซ‡เชจเชพ เชชเชฐ เชธเชฐเซเชตเชฐ เช–เซเชฒเซ‡ เช›เซ‡ SMTPเชเช• smptPort เชชเซ‹เชฐเซเชŸ เชจเช‚เชฌเชฐเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซ‡ เช›เซ‡ เชœเซ‡ เชธเชพเช‚เชญเชณเซ‡ เช›เซ‡ SMTP เชธเชฐเซเชตเชฐ

เชฎเซ‹เชก="เชšเซ‡เชคเชตเชฃเซ€" เช•เชนเซ‡ เช›เซ‡ เช•เซ‡ เชฎเซ‡เช‡เชฒเชฟเช‚เช— เชซเช•เซเชค เชคเซเชฏเชพเชฐเซ‡ เชœ เชฅเชตเซเช‚ เชœเซ‹เชˆเช เชœเซ‹ เชคเซเชฏเชพเช‚ เช“เช›เชพเชฎเชพเช‚ เช“เช›เซเช‚ เชเช• เชชเช—เชฒเซเช‚ เชนเซ‹เชฏ เชฌเชฟเชฒเซเชก เช•เชฐเซ‹-a, เชœเซ‡ เชธเซเชฅเชฟเชคเชฟ เชจเชฟเชทเซเชซเชณเชคเชพ เช…เชฅเชตเชพ เชšเซ‡เชคเชตเชฃเซ€ เชธเชพเชฅเซ‡ เชธเชฎเชพเชชเซเชค เชฅเชพเชฏ เช›เซ‡. เชธเชซเชณเชคเชพเชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชจเซเชฏเซ‚เชเชฒเซ‡เชŸเชฐ เชฎเซ‹เช•เชฒเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€.

เชตเชงเชพเชฐเชพเชจเชพ เชชเซเชฐเชพเชชเซเชคเช•เชฐเซเชคเชพเช“ เชฎเชพเชฒเชฟเช• เช…เชจเซ‡ เชคเซ‡ เชตเซเชฏเช•เซเชคเชฟ เช•เซ‡ เชœเซ‡เชฎเชฃเซ‡ เชฎเซ‡เช‡เชฒเชฟเช‚เช— เชฎเซ‹เช•เชฒเชตเซเช‚ เชœเซ‹เชˆเช เชคเซ‡ เชตเซเชฏเช•เซเชคเชฟเช“เชจเซ€ เชธเซ‚เชšเชฟ เชงเชฐเชพเชตเซ‡ เช›เซ‡ เชฎเซ‹เช•เชฒเชตเซเช‚.

เชธเช‚เชฆเซ‡เชถ เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฐ เช เชเช• เช‘เชฌเซเชœเซ‡เช•เซเชŸ เช›เซ‡ เชœเซ‡ เชธเช‚เชฆเซ‡เชถ เชซเซ‹เชฐเซเชฎเซ‡เชŸ, เชคเซ‡เชจเซ‹ เชจเชฎเซ‚เชจเซ‹ เช…เชจเซ‡ เช‰เชชเชฒเชฌเซเชง เชšเชฒเซ‹เชจเซ‹ เชธเชฎเซ‚เชน เชธเซเชชเชทเซเชŸ เช•เชฐเซ‡ เช›เซ‡ เชœเซ€เชจเซเชœเชพ2. เชœเซ‡เชตเชพ เชตเชฟเช•เชฒเซเชชเซ‹ wantProperties=เชธเชพเชšเซเช‚ ะธ wantSteps=เชธเชพเชšเซเช‚ เช‰เชชเชฒเชฌเซเชง เชšเชฒเซ‹เชจเชพ เช† เชธเชฎเซ‚เชนเชจเซ‡ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเซ‹.

เชธเชพเชฅเซ‡['services']=[sendMessageToAll] เชธเซ‡เชตเชพเช“เชจเซ€ เชธเซ‚เชšเชฟ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡, เชœเซ‡เชฎเชพเช‚เชฅเซ€ เช…เชฎเชพเชฐเซ€ เชนเชถเซ‡ เชชเชคเซเชฐเช•เชพเชฐ.

เช…เชฎเซ‡ เชคเซ‡ เช•เชฐเซเชฏเซเช‚! เช…เชญเชฟเชจเช‚เชฆเชจ

เช…เชฎเซ‡ เช…เชฎเชพเชฐเซเช‚ เชชเซ‹เชคเชพเชจเซเช‚ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชฌเชจเชพเชตเซเชฏเซเช‚ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡ เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพ เชœเซ‹เชˆ เช›เซ‡ เชœเซ‡ เชคเซ‡ เชธเช•เซเชทเชฎ เช›เซ‡. เชฌเชฟเชฒเซเชกเชฌเซ‹เชŸ. เชฎเชจเซ‡ เชฒเชพเช—เซ‡ เช›เซ‡ เช•เซ‡, เชคเชฎเชพเชฐเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเซ‡ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช† เชธเชพเชงเชจเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เช•เซ‡ เช•เซ‡เชฎ เชคเซ‡ เชธเชฎเชœเชตเชพ เชฎเชพเชŸเซ‡ เช† เชชเซ‚เชฐเชคเซเช‚ เช›เซ‡. เชถเซเช‚ เชคเชฎเชจเซ‡ เชคเซ‡เชจเชพเชฎเชพเช‚ เชฐเชธ เช›เซ‡? เชถเซเช‚ เชคเซ‡ เชคเชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เช‰เชชเชฏเซ‹เช—เซ€ เชฅเชถเซ‡? เชถเซเช‚ เชคเซ‡ เชคเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช†เชฐเชพเชฎเชฆเชพเชฏเช• เช›เซ‡? เชคเซ‹ เชชเช›เซ€ เชนเซเช‚ เช† เชฒเซ‡เช– เชตเซเชฏเชฐเซเชฅ เชจเชฅเซ€ เชฒเช–เซ€ เชฐเชนเซเชฏเซ‹.

เช…เชจเซ‡ เช†เช—เชณ. เชนเซเช‚ เชตเซเชฏเชพเชตเชธเชพเชฏเชฟเช• เชธเชฎเซเชฆเชพเชฏเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚ เชฌเชฟเชฒเซเชกเชฌเซ‹เชŸ, เชตเซเชฏเชพเชชเช• เชฌเชจเซเชฏเซเช‚, เชฎเชพเชฐเซเช—เชฆเชฐเซเชถเชฟเช•เชพเช“เชจเซเช‚ เชญเชพเชทเชพเช‚เชคเชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚, เช…เชจเซ‡ เชคเซเชฏเชพเช‚ เชชเชฃ เชตเชงเซ เช‰เชฆเชพเชนเชฐเชฃเซ‹ เช›เซ‡.

เชคเชฎเชพเชฐเชพ เชงเซเชฏเชพเชจ เชฎเชพเชŸเซ‡ เชฌเชงเชพเชจเซ‹ เช†เชญเชพเชฐ. เชธเชพเชฐเชพ เชจเชธเซ€เชฌ.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹