เจฌเจฟเจฒเจกเจฌเฉ‹เจŸ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจจเจฟเจฐเฉฐเจคเจฐ เจเจ•เฉ€เจ•เจฐเจฃ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเฉ€ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจฃ

เจฌเจฟเจฒเจกเจฌเฉ‹เจŸ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจจเจฟเจฐเฉฐเจคเจฐ เจเจ•เฉ€เจ•เจฐเจฃ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเฉ€ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจฃ
(เจ‡เจธ เจฆเฉเจ†เจฐเจพ เจšเจฟเฉฑเจคเจฐ เจ•เฉฐเจชเจฟเจŠเจŸเจฐเจพเจˆเจœเจผเจฐ เจคเฉฑเจ• Pixabay)

เจนเฉˆเจฒเฉ‹!

เจฎเฉ‡เจฐเจพ เจจเจพเจฎ เจนเฉˆ เจ‡เจตเจ—เฉ‡เจจเฉ€ เจšเฉˆเจฐเจ•เจฟเจจ, เจฎเฉˆเจ‚ เจ‡เฉฑเจ• เจฎเจพเจˆเจจเจฟเฉฐเจ— เจ•เฉฐเจชเจจเฉ€ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจตเจฟเจ•เจพเจธ เจŸเฉ€เจฎ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฐ เจนเจพเจ‚ เจชเฉŒเจฒเฉ€เจฎเฉ‡เจŸเจฒ.

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

เจ‡เจธ เจฒเฉ‡เจ– เจตเจฟเฉฑเจš เจฎเฉˆเจ‚ เจธเฉฐเจญเจพเจตเจจเจพเจตเจพเจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจธเฉฐเจ–เฉ‡เจช เจœเจพเจฃเจ•เจพเจฐเฉ€ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจจ เจฆเจพ เจซเฉˆเจธเจฒเจพ เจ•เฉ€เจคเจพ เจนเฉˆ เจฌเจฟเจฒเจกเจฌเฉ‹เจŸ. เจ‡เจน เจธเจพเจซเจŸเจตเฉ‡เจ…เจฐ เจ•เฉ€ เจ•เจฐเจจ เจฆเฉ‡ เจฏเฉ‹เจ— เจนเฉˆ? เจ‰เจธ เจจเจพเจฒ เจ•เจฟเจตเฉ‡เจ‚ เจธเฉฐเจชเจฐเจ• เจ•เจฐเจจเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‰เจธ เจจเจพเจฒ เจ‡เฉฑเจ• เจ†เจฎ เจชเฉเจฐเจญเจพเจตเฉ€ เจ•เฉฐเจฎ เจ•เจฐเจจ เจตเจพเจฒเจพ เจฐเจฟเจธเจผเจคเจพ เจ•เจฟเจตเฉ‡เจ‚ เจฌเจฃเจพเจ‰เจฃเจพ เจนเฉˆ? เจคเฉเจธเฉ€เจ‚ เจ†เจชเจฃเฉ€ เจฎเจธเจผเฉ€เจจ 'เจคเฉ‡ เจ†เจชเจฃเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจ…เจคเฉ‡ เจŸเฉˆเจธเจŸ เจ•เจฐเจจ เจฒเจˆ เจ•เจพเจฐเจœเจธเจผเฉ€เจฒ เจธเฉ‡เจตเจพ เจฌเจฃเจพ เจ•เฉ‡ เจธเจพเจกเฉ‡ เจ…เจจเฉเจญเจต เจจเฉ‚เฉฐ เจ–เฉเจฆ เจฒเจพเจ—เฉ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

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

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

1. เจฌเจฟเจฒเจกเจฌเฉ‹เจŸ เจ•เจฟเจ‰เจ‚?
2. เจฌเจฟเจฒเจกเจฎเจพเจธเจŸเจฐ เจฆเฉ€ เจ…เจ—เจตเจพเจˆ เจตเจพเจฒเฉ€ เจงเจพเจฐเจจเจพ
3. เจธเจฅเจพเจชเจจเจพ
4. เจชเจนเจฟเจฒเฉ‡ เจ•เจฆเจฎ

5. เจธเฉฐเจฐเจšเจจเจพ. เจ•เจฆเจฎ เจฆเจฐ เจ•เจฆเจฎ เจตเจฟเจ…เฉฐเจœเจจ

5.1 เจฌเจฟเจฒเจกเจฎเจพเจธเจŸเจฐ เจ•เฉŒเจ‚เจซเจฟเจ—
5.2 เจ•เจฐเจฎเจšเจพเจฐเฉ€
5.3 เจคเจฌเจฆเฉ€เจฒเฉ€_เจธเจฐเฉ‹เจค
5.4 เจธเจผเจกเจฟเจŠเจฒเจฐ

5.5 เจฌเจฟเจฒเจก เจซเฉˆเจ•เจŸเจฐเฉ€
5.6 เจฌเจฟเจฒเจกเจฐ

6. เจคเฉเจนเจพเจกเฉ€ เจ†เจชเจฃเฉ€ เจธเฉฐเจฐเจšเจจเจพ เจฆเฉ€ เจ‰เจฆเจพเจนเจฐเจจ

6.1 เจคเฉเจนเจพเจกเฉ‡ master.cfg เจฆเฉ‡ เจฐเจธเจคเฉ‡ 'เจคเฉ‡
6.2 svn เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจเจพ
6.3 เจคเฉเจนเจพเจจเฉ‚เฉฐ เจชเฉฑเจคเจฐ: เจชเฉฑเจคเจฐเจ•เจพเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจ˜เฉ‹เจธเจผเจฃเจพ เจ•เจฐเจจ เจฒเจˆ เจ…เจงเจฟเจ•เจพเจฐเจค เจนเจจ

เจ…เจธเฉ€เจ‚ เจ‡เจน เจ•เฉ€เจคเจพ! เจตเจงเจพเจˆเจ†เจ‚

1. เจฌเจฟเจฒเจกเจฌเฉ‹เจŸ เจ•เจฟเจ‰เจ‚?

เจชเจนเจฟเจฒเจพเจ‚ habr-e 'เจคเฉ‡ เจฎเฉˆเจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฌเจพเจฐเฉ‡ เจฒเฉ‡เจ– เจฎเจฟเจฒเฉ‡ เจธเจจ เจฒเจ—เจพเจคเจพเจฐ เจเจ•เจคเจพ เจตเจฐเจค เจฌเจฟเจฒเจกเจฌเฉ‹เจŸ. เจœเจฟเจตเฉ‡เจ‚, เจ‡เจน เจตเจพเจฒเจพ เจฎเฉˆเจจเฉ‚เฉฐ เจ‡เจน เจธเจญ เจคเฉ‹เจ‚ เจตเฉฑเจง เจœเจพเจฃเจ•เจพเจฐเฉ€ เจญเจฐเจชเฉ‚เจฐ เจฒเฉฑเจ—เจฟเจ†เฅค เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจ‰เจฆเจพเจนเจฐเจฃ เจนเฉˆ - เจธเจฐเจฒ. เจ‡เจน เจฒเฉ‡เจ– เจคเจœเจฐเจฌเฉ‡เจ•เจพเจฐ เจนเฉ‹ เจธเจ•เจฆเฉ‡ เจนเจจ เจฎเฉˆเจจเฉ‚เจ…เจฒ เจคเฉ‹เจ‚ เจ‰เจฆเจพเจนเจฐเจจเจ…เจคเฉ‡ เจ‡เจธ เจจเฉ‚เฉฐ เจ‰เจธ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจ…เฉฐเจ—เจฐเฉ‡เจœเจผเฉ€ เจตเจฟเฉฑเจšเฅค เจ•เฉ‚เจช เจ‡เฉฑเจ• เจตเจงเฉ€เจ† เจธเจผเฉเจฐเฉ‚เจ†เจคเฉ€ เจฌเจฟเฉฐเจฆเฉ‚ เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆเฅค เจ‡เจนเจจเจพเจ‚ เจฒเฉ‡เจ–เจพเจ‚ เจจเฉ‚เฉฐ เจชเฉœเฉเจนเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจคเฉเจธเฉ€เจ‚ เจธเจผเจพเจ‡เจฆ เจคเฉเจฐเฉฐเจค เจ•เฉเจ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเฉ‹ เจฌเจฟเจฒเจกเจฌเฉ‹เจŸ เจ•เจฐเจจ เจฒเจˆ.

เจฐเฉ‚เจ•เฉ‹! เจ•เฉ€ เจ•เจฟเจธเฉ‡ เจจเฉ‡ เจ…เจธเจฒ เจตเจฟเฉฑเจš เจ‡เจธเจจเฉ‚เฉฐ เจ†เจชเจฃเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸเจพเจ‚ เจตเจฟเฉฑเจš เจตเจฐเจคเจฟเจ† เจนเฉˆ? เจ‡เจน yes เจฌเจพเจนเจฐ เจ•เจพเจฎเฉเจ• เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจ‡เจธ เจจเฉ‚เฉฐ เจ†เจชเจฃเฉ‡ เจ•เฉฐเจฎเจพเจ‚ เจตเจฟเฉฑเจš เจฒเจพเจ—เฉ‚ เจ•เฉ€เจคเจพเฅค เจชเจพเจ‡เจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ เจ‰เจฆเจพเจนเจฐเจฃ ะธัะฟะพะปัŒะทะพะฒะฐะฝะธั เจฌเจฟเจฒเจกเจฌเฉ‹เจŸ เจ…เจคเฉ‡ Google เจ•เฉ‹เจก เจชเฉเจฐเจพเจฒเฉ‡เจ–เจพเจ‚ เจตเจฟเฉฑเจšเฅค

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

เจ‰เจนเจจเจพเจ‚ เจฒเจˆ เจœเจฟเจจเฉเจนเจพเจ‚ เจฆเจพ เจŸเฉ€เจšเจพ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ python เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฟเจ† เจ—เจฟเจ† เจนเฉˆ, เจธเจตเจพเจฒ เจ‰เฉฑเจ เจฆเจพ เจนเฉˆ: "เจ•เจฟเจ‰เจ‚ เจจเจพ เจ‡เฉฑเจ• เจเจ•เฉ€เจ•เจฐเจฃ เจชเฉเจฐเจฃเจพเจฒเฉ€ เจฆเฉ€ เจšเฉ‹เจฃ เจ•เจฐเฉ‹ เจœเจฟเจธเจฆเจพ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจตเจฟเฉฑเจš เจตเจฐเจคเฉ€ เจ—เจˆ เจญเจพเจธเจผเจพ เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจธเจชเจธเจผเจŸ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจนเฉ‹เจตเฉ‡?" เจ…เจคเฉ‡ เจนเฉเจฃ เจ‡เจน เจฒเจพเจญ เจชเฉ‡เจธเจผ เจ•เจฐเจจ เจฆเจพ เจธเจฎเจพเจ‚ เจนเฉˆ เจฌเจฟเจฒเจกเจฌเฉ‹เจŸ.

เจ‡เจธ เจฒเจˆ, เจธเจพเจกเจพ "เจ‡เฉฐเจธเจŸเฉเจฐเฉ‚เจฎเฉˆเจ‚เจŸเจฒ เจšเฉŒเจ‚เจ•"เฅค เจ†เจชเจฃเฉ‡ เจฒเจˆ, เจฎเฉˆเจ‚ เจšเจพเจฐ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจฆเฉ€ เจชเจ›เจพเจฃ เจ•เฉ€เจคเฉ€ เจนเฉˆ เจฌเจฟเจฒเจกเจฌเฉ‹เจŸ:

  1. เจ‡เจน GPL เจฒเจพเจ‡เจธเฉฐเจธ เจฆเฉ‡ เจ…เจงเฉ€เจจ เจ‡เฉฑเจ• เจ“เจชเจจ เจธเฉ‹เจฐเจธ เจซเจฐเฉ‡เจฎเจตเจฐเจ• เจนเฉˆ
  2. เจ‡เจน python เจฆเฉ€ เจ‡เฉฑเจ• เจธเฉฐเจฐเจšเจจเจพ เจŸเฉ‚เจฒ เจ…เจคเฉ‡ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ€เจ†เจ‚ เจ•เจพเจฐเจตเจพเจˆเจ†เจ‚ เจฆเฉ‡ เจตเจฐเจฃเจจ เจตเจœเฉ‹เจ‚ เจตเจฐเจคเฉ‹เจ‚ เจนเฉˆ
  3. เจ‡เจน เจฎเจธเจผเฉ€เจจ เจคเฉ‹เจ‚ เจœเจตเจพเจฌ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฆเจพ เจ‡เฉฑเจ• เจฎเฉŒเจ•เจพ เจนเฉˆ เจœเจฟเจธ 'เจคเฉ‡ เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ
  4. เจ‡เจน, เจ…เฉฐเจค เจตเจฟเฉฑเจš, เจ‡เฉฑเจ• เจฎเฉ‡เจœเจผเจฌเจพเจจ เจฒเจˆ เจ˜เฉฑเจŸเฉ‹-เจ˜เฉฑเจŸ เจฒเฉ‹เฉœเจพเจ‚ เจนเจจ. เจคเฉˆเจจเจพเจคเฉ€ เจฒเจˆ python เจ…เจคเฉ‡ เจฎเจฐเฉ‹เฉœเจฟเจ† เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ, เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจตเจฐเจšเฉเจ…เจฒ เจฎเจธเจผเฉ€เจจ เจ…เจคเฉ‡ java เจฎเจธเจผเฉ€เจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค

2. เจฌเจฟเจฒเจกเจฎเจพเจธเจŸเจฐ เจฆเฉ€ เจ…เจ—เจตเจพเจˆ เจตเจพเจฒเฉ€ เจงเจพเจฐเจจเจพ

เจฌเจฟเจฒเจกเจฌเฉ‹เจŸ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจจเจฟเจฐเฉฐเจคเจฐ เจเจ•เฉ€เจ•เจฐเจฃ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเฉ€ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจฃ

เจŸเจพเจธเจ• เจกเจฟเจธเจŸเฉเจฐเฉ€เจฌเจฟเจŠเจธเจผเจจ เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจฆเจพ เจ•เฉ‡เจ‚เจฆเจฐเฉ€ เจนเฉˆ เจฌเจฟเจฒเจกเจฎเจพเจธเจŸเจฐ. เจ‡เจน เจ‡เฉฑเจ• เจธเฉ‡เจตเจพ เจนเฉˆ เจœเฉ‹:

  • เจŸเจฐเฉˆเจ• เจฐเฉฑเจ–เจฆเจพ เจนเฉˆ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจธเจฐเฉ‹เจค เจฐเฉเฉฑเจ– เจตเจฟเฉฑเจš เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚
  • เจญเฉ‡เจœเจฆเจพ เจนเฉˆ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจœเฉ‹ เจ•เจฟ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจ…เจคเฉ‡ เจ‡เจธเจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจ เจฒเจˆ เจตเจฐเจ•เจฐ เจธเฉ‡เจตเจพ เจฆเฉเจ†เจฐเจพ เจฒเจพเจ—เฉ‚ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจœเจพเจฃเฉ€เจ†เจ‚ เจšเจพเจนเฉ€เจฆเฉ€เจ†เจ‚ เจนเจจ
  • เจธเฉ‚เจšเจฟเจค เจ•เจฐเจฆเจพ เจนเฉˆ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจ•เจพเจฐเจตเจพเจˆเจ†เจ‚ เจฆเฉ‡ เจจเจคเฉ€เจœเจฟเจ†เจ‚ เจฌเจพเจฐเฉ‡ เจ‰เจชเจญเฉ‹เจ—เจคเจพ

เจฌเจฟเจฒเจกเจฎเจพเจธเจŸเจฐ เจซเจพเจˆเจฒ เจฆเฉเจ†เจฐเจพ เจธเฉฐเจฐเจšเจฟเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ master.cfg. เจ‡เจน เจซเจพเจˆเจฒ เจฐเฉ‚เจŸ เจตเจฟเฉฑเจš เจนเฉˆ เจฌเจฟเจฒเจกเจฎเจพเจธเจŸเจฐ. เจฌเจพเจ…เจฆ เจตเจฟเฉฑเจš เจฎเฉˆเจ‚ เจฆเจฟเจ–เจพเจตเจพเจ‚เจ—เจพ เจ•เจฟ เจ‡เจน เจฐเฉ‚เจŸ เจ•เจฟเจตเฉ‡เจ‚ เจฌเจฃเจพเจ‡เจ† เจ—เจฟเจ† เจนเฉˆเฅค เจซเจพเจˆเจฒ เจ†เจชเจฃเฉ‡ เจ†เจช master.cfg เจ‡เฉฑเจ• เจชเจพเจˆเจฅเจจ เจธเจ•เฉเจฐเจฟเจชเจŸ เจนเฉˆ เจœเฉ‹ เจ•เจพเจฒเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ€ เจนเฉˆ เจฌเจฟเจฒเจกเจฌเฉ‹เจŸ.

เจ…เจ—เจฒเฉ€ เจธเจญ เจคเฉ‹เจ‚ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจตเจธเจคเฉ‚ เจฌเจฟเจฒเจกเจฌเฉ‹เจŸ เจ‡เฉฑเจ• เจจเจพเจฎ เจนเฉˆ เจ•เจพเจฎเจพ. เจ‡เจน เจธเฉ‡เจตเจพ เจ•เจฟเจธเฉ‡ เจนเฉ‹เจฐ เจนเฉ‹เจธเจŸ 'เจคเฉ‡ เจ‡เฉฑเจ• เจตเฉฑเจ–เจฐเฉ‡ OS เจฆเฉ‡ เจจเจพเจฒ เจฒเจพเจ‚เจš เจ•เฉ€เจคเฉ€ เจœเจพ เจธเจ•เจฆเฉ€ เจนเฉˆ, เจœเจพเจ‚ เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆ เจ•เจฟ เจ‡เฉฑเจ• เจœเจฟเฉฑเจฅเฉ‡ เจฌเจฟเจฒเจกเจฎเจพเจธเจŸเจฐ. เจ‡เจน เจ†เจชเจฃเฉ‡ เจชเฉˆเจ•เฉ‡เจœเจพเจ‚ เจ…เจคเฉ‡ เจตเฉ‡เจฐเฉ€เจเจฌเจฒเจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจตเจฟเจธเจผเฉ‡เจธเจผ เจคเฉŒเจฐ 'เจคเฉ‡ เจคเจฟเจ†เจฐ เจตเจฐเจšเฉเจ…เจฒ เจตเจพเจคเจพเจตเจฐเจฃ เจตเจฟเฉฑเจš เจตเฉ€ เจฎเฉŒเจœเฉ‚เจฆ เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจ‡เจน เจตเจฐเจšเฉเจ…เจฒ เจตเจพเจคเจพเจตเจฐเจฃ python เจ‰เจชเจฏเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจคเจฟเจ†เจฐ เจ•เฉ€เจคเฉ‡ เจœเจพ เจธเจ•เจฆเฉ‡ เจนเจจ virtualenv, venv.

เจฌเจฟเจฒเจกเจฎเจพเจธเจŸเจฐ เจนเจฐ เจ•เจฟเจธเฉ‡ เจจเฉ‚เฉฐ เจนเฉเจ•เจฎเจพเจ‚ เจฆเจพ เจชเฉเจฐเจธเจพเจฐเจฃ เจ•เจฐเจฆเจพ เจนเฉˆ เจ•เจพเจฎเจพ-y, เจ…เจคเฉ‡ เจ‰เจน, เจฌเจฆเจฒเฉ‡ เจตเจฟเฉฑเจš, เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉ‚เจฐเจพ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจญเจพเจต, เจ‡เจน เจชเจคเจพ เจšเจฒเจฆเจพ เจนเฉˆ เจ•เจฟ เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฌเจฃเจพเจ‰เจฃ เจ…เจคเฉ‡ เจŸเฉˆเจธเจŸ เจ•เจฐเจจ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจšเฉฑเจฒ เจธเจ•เจฆเฉ€ เจนเฉˆ เจ•เจพเจฎเจพ-e เจตเจฟเฉฐเจกเฉ‹เจœเจผ เจšเจฒเจพ เจฐเจฟเจนเจพ เจนเฉˆ เจ…เจคเฉ‡ เจฒเฉ€เจจเจ•เจธ เจšเจฒเจพเจ‰เจฃ เจตเจพเจฒเฉ‡ เจ•เจฟเจธเฉ‡ เจนเฉ‹เจฐ เจตเจฐเจ•เจฐ 'เจคเฉ‡เฅค

เจ•เจฎเจฐเจพ เจ›เฉฑเจก เจฆเจฟเจ“ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจธเจฐเฉ‹เจค เจ•เฉ‹เจก เจนเจฐเฉ‡เจ• 'เจคเฉ‡ เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจ•เจพเจฎเจพ-เจˆ.

3. เจธเจฅเจพเจชเจจเจพ

เจ‡เจธ เจฒเจˆ, เจ†เจ“ เจšเฉฑเจฒเฉ€เจเฅค เจฎเฉˆเจ‚ เจนเฉ‹เจธเจŸ เจตเจœเฉ‹เจ‚ เจ‰เจฌเฉฐเจŸเฉ‚ 18.04 เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจพเจ‚เจ—เจพ. เจฎเฉˆเจ‚ เจ‡เจธ 'เจคเฉ‡ เจ‡เฉฑเจ• เจฐเฉฑเจ–เจพเจ‚เจ—เจพ เจฌเจฟเจฒเจกเจฎเจพเจธเจŸเจฐ-a เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจ•เจพเจฎเจพ-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. เจชเจนเจฟเจฒเฉ‡ เจ•เจฆเจฎ

เจฌเจฃเจพเจ‰เจฃ เจฆเจพ เจธเจฎเจพเจ‚ เจฌเจฟเจฒเจกเจฎเจพเจธเจŸเจฐ. เจ‡เจน เจธเจพเจกเฉ‡ เจซเฉ‹เจฒเจกเจฐ เจตเจฟเฉฑเจš เจนเฉ‹เจตเฉ‡เจ—เจพ /เจ˜เจฐ/เจนเฉˆเจฌเจฐ/เจฎเจพเจธเจŸเจฐ.

mkdir master
buildbot create-master master # ะกะพะฑัั‚ะฒะตะฝะฝะพ ัะดะตััŒ ะธ ัะพะทะดะฐะตะผ

เจ…เจ—เจฒเจพ เจ•เจฆเจฎ. เจ†เจ“ เจฌเจฃเจพเจˆเจ เจ•เจพเจฎเจพ. เจ‡เจน เจธเจพเจกเฉ‡ เจซเฉ‹เจฒเจกเจฐ เจตเจฟเฉฑเจš เจนเฉ‹เจตเฉ‡เจ—เจพ /เจ˜เจฐ/เจนเจพเจฌเจฐ/เจ•เจฐเจฎเจšเจพเจฐเฉ€.

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

เจœเจฆเฉ‹เจ‚ เจคเฉเจธเฉ€เจ‚ เจฆเฉŒเฉœเจฆเฉ‡ เจนเฉ‹ เจ•เจพเจฎเจพ, เจซเจฟเจฐ เจฎเฉ‚เจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจ‡เจธ เจตเจฟเฉฑเจš เจฌเจฃเจพเจ‡เจ† เจœเจพเจตเฉ‡เจ—เจพ /เจ˜เจฐ/เจนเจพเจฌเจฐ/เจ•เจฐเจฎเจšเจพเจฐเฉ€ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเฉ‡ เจจเจพเจฎ เจฆเฉ‡ เจจเจพเจฒ เจซเฉ‹เจฒเจกเจฐ, เจœเจฟเจธ เจตเจฟเฉฑเจš เจฆเจฟเฉฑเจคเจพ เจ—เจฟเจ† เจนเฉˆ master.cfg. เจ…เจคเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเฉ‡ เจจเจพเจฎ เจตเจพเจฒเฉ‡ เจซเฉ‹เจฒเจกเจฐ เจตเจฟเฉฑเจš เจ‡เจน เจ‡เฉฑเจ• เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจฌเจฃเจพเจเจ—เจพ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ, เจ…เจคเฉ‡ เจ‡เจธ เจจเฉ‚เฉฐ เจ•เจฐเจจเจพ เจœเจพเจฐเฉ€ เจฐเฉฑเจ–เฉ‡เจ—เจพ เจ•เจฎเจฐเจพ เจ›เฉฑเจก เจฆเจฟเจ“. เจฒเจˆ เจ•เจพเจฐเจœเจ•เจพเจฐเฉ€ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจ•เจพเจฎเจพ-เจ…เจคเฉ‡ เจ‡เจน เจ‡เฉฑเจ• เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจฌเจฃ เจœเจพเจตเฉ‡เจ—เฉ€ /home/habr/yourProject/build.

"เจธเฉเจจเจนเจฟเจฐเฉ€ เจ•เฉเฉฐเจœเฉ€
เจ…เจคเฉ‡ เจนเฉเจฃ เจœเจฟเจธ เจฒเจˆ เจฎเฉˆเจ‚ เจชเจฟเจ›เจฒเจพ เจชเฉˆเจฐเจพ เจฒเจฟเจ–เจฟเจ† เจธเฉ€: เจ‡เฉฑเจ• เจธเจ•เฉเจฐเจฟเจชเจŸ เจœเฉ‹ เจ•เจฟ เจฎเจพเจธเจŸเจฐ เจคเฉ‹เจ‚ เจฎเฉฐเจ— เจ•เจฐเฉ‡เจ—เจพ เจ•เจพเจฎเจพ-เจ…เจคเฉ‡ เจ‡เจธ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจฐเจฟเจฎเฉ‹เจŸ เจคเฉŒเจฐ 'เจคเฉ‡ เจ•เฉ€เจคเฉ‡ เจ—เจ เจจเฉ‚เฉฐ เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจŸ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจธเจ•เฉเจฐเจฟเจชเจŸ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจฒเจˆ เจ…เจงเจฟเจ•เจพเจฐ เจจเจนเฉ€เจ‚ เจนเจจเฅค เจธเจฅเจฟเจคเฉ€ เจจเฉ‚เฉฐ เจ เฉ€เจ• เจ•เจฐเจจ เจฒเจˆ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจ•เฉเฉฐเจœเฉ€ เจฆเฉ€ เจฒเฉ‹เฉœ เจชเจตเฉ‡เจ—เฉ€ --umask=0o22, เจœเฉ‹ เจ‡เจธ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฃ เจฆเฉ€ เจฎเจจเจพเจนเฉ€ เจ•เจฐเจฆเจพ เจนเฉˆ, เจชเจฐ เจฒเจพเจ‚เจš เจ…เจงเจฟเจ•เจพเจฐ เจฌเจฐเจ•เจฐเจพเจฐ เจฐเฉฑเจ–เฉ‡เจ—เจพเฅค เจ…เจคเฉ‡ เจ‡เจน เจธเจญ เจธเจพเจจเฉ‚เฉฐ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ.

เจฌเจฟเจฒเจกเจฎเจพเจธเจŸเจฐ ะธ เจ•เจพเจฎเจพ เจ‡เฉฑเจ• เจฆเฉ‚เจœเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจธเจฌเฉฐเจง เจธเจฅเจพเจชเจค เจ•เจฐเฉ‹. เจ…เจœเจฟเจนเจพ เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจ•เจฟ เจ‡เจน เจŸเฉเฉฑเจŸ เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ•เจพเจฎเจพ เจฆเฉ‡ เจœเจตเจพเจฌ เจฒเจˆ เจ•เฉเจ เจธเจฎเฉ‡เจ‚ เจฆเฉ€ เจ‰เจกเฉ€เจ• เจ•เจฐ เจฐเจนเฉ‡ เจนเจพเจ‚ เจฌเจฟเจฒเจกเจฎเจพเจธเจŸเจฐ-เจ. เจœเฉ‡เจ•เจฐ เจ•เฉ‹เจˆ เจœเจตเจพเจฌ เจจเจนเฉ€เจ‚ เจฎเจฟเจฒเจฆเจพ, เจคเจพเจ‚ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจฎเฉเฉœ เจšเจพเจฒเฉ‚ เจนเฉ‹ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจ•เฉเฉฐเจœเฉ€ --keepalive=60 เจธเจฟเจฐเจซเจผ เจ‰เจธ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจฆเจพ เจธเจฎเจพเจ‚ เจฆเจฐเจธเจพเจ‰เจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ เจจเจพเจฒ เจœเฉเฉœเจจ เจฐเฉ€เจฌเฉ‚เจŸ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

5. เจธเฉฐเจฐเจšเจจเจพ. เจ•เจฆเจฎ เจฆเจฐ เจ•เจฆเจฎ เจตเจฟเจ…เฉฐเจœเจจ

เจ•เฉŒเจจเจซเจฟเจ—เจฐเฉ‡เจธเจผเจจ เจฌเจฟเจฒเจกเจฎเจพเจธเจŸเจฐ เจฎเจธเจผเฉ€เจจ เจฆเฉ‡ เจ‰เจธ เจชเจพเจธเฉ‡ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจœเจฟเฉฑเจฅเฉ‡ เจ…เจธเฉ€เจ‚ เจ•เจฎเจพเจ‚เจก เจจเฉ‚เฉฐ เจšเจฒเจพเจ‡เจ† เจธเฉ€ เจฌเจฃเจพเจ‰เจฃ-เจฎเจพเจธเจŸเจฐ. เจธเจพเจกเฉ‡ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš, เจ‡เจน เจ‡เฉฑเจ• เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจนเฉˆ /เจ˜เจฐ/เจนเฉˆเจฌเจฐ/เจฎเจพเจธเจŸเจฐ. เจธเฉฐเจฐเจšเจจเจพ เจซเจพเจ‡เจฒ 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 เจฌเจฟเจฒเจกเจฎเจพเจธเจŸเจฐ เจ•เฉŒเจ‚เจซเจฟเจ—

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))                

เจ•เฉเฉฐเจœเฉ€ เจฆเฉเจ†เจฐเจพ เจคเจฌเจฆเฉ€เจฒเฉ€_เจธเจฐเฉ‹เจค เจกเจฟเจ•เจธเจผเจจเจฐเฉ€ เจธเฉ€ เจธเจพเจจเฉ‚เฉฐ เจธเฉ‚เจšเฉ€ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจชเฉเจฐเจพเจชเจค เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ เจœเจฟเฉฑเจฅเฉ‡ เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจตเจธเจคเฉ‚ เจชเจพเจ‰เจฃเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเจพเจ‚ เจœเฉ‹ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเฉ‡ เจธเจฐเฉ‹เจค เจ•เฉ‹เจก เจจเจพเจฒ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจจเฉ‚เฉฐ เจชเฉ‹เจฒ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ‰เจฆเจพเจนเจฐเจจ เจ‡เฉฑเจ• Git เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ€ เจนเฉˆ เจœเฉ‹ เจ•เฉเจ เจ…เฉฐเจคเจฐเจพเจฒเจพเจ‚ 'เจคเฉ‡ เจชเฉ‹เจฒ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค

เจชเจนเจฟเจฒเฉ€ เจฆเจฒเฉ€เจฒ เจคเฉเจนเจพเจกเฉ€ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจฆเจพ เจฎเจพเจฐเจ— เจนเฉˆเฅค

workdir เจซเฉ‹เจฒเจกเจฐ เจฆเฉ‡ เจฎเจพเจฐเจ— เจจเฉ‚เฉฐ เจฆเจฐเจธเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ เจœเจฟเฉฑเจฅเฉ‡ เจชเจพเจธเฉ‡ เจนเฉˆ เจ•เจพเจฎเจพ- เจฎเจพเจฐเจ— เจฆเจพ เจฐเจฟเจธเจผเจคเฉ‡เจฆเจพเจฐ /home/habr/worker/yourProject/build git เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจฆเฉ‡ เจธเจฅเจพเจจเจ• เจธเฉฐเจธเจ•เจฐเจฃ เจจเฉ‚เฉฐ เจธเจŸเฉ‹เจฐ เจ•เจฐเฉ‡เจ—เจพ.

เจธเจผเจพเจ–เจพ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจ–เจพเจธ เจธเจผเจพเจ–เจพ เจธเจผเจพเจฎเจฒ เจนเฉˆ เจœเจฟเจธเจฆเจพ เจ…เจจเฉเจธเจฐเจฃ เจ•เฉ€เจคเจพ เจœเจพเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค

pollInterval เจœเจฟเจธ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจธเจ•เจฟเฉฐเจŸเจพเจ‚ เจฆเฉ€ เจธเฉฐเจ–เจฟเจ† เจธเจผเจพเจฎเจฟเจฒ เจนเฉˆ เจฌเจฟเจฒเจกเจฎเจพเจธเจŸเจฐ เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจฒเจˆ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจชเฉ‹เจฒ เจ•เจฐเฉ‡เจ—เจพเฅค

เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเฉ€ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจŸเจฐเฉˆเจ• เจ•เจฐเจจ เจฒเจˆ เจ•เจˆ เจคเจฐเฉ€เจ•เฉ‡ เจนเจจเฅค

เจธเจญ เจคเฉ‹เจ‚ เจธเจฐเจฒ เจคเจฐเฉ€เจ•เจพ เจนเฉˆ เจชเฉ‹เจฒเจฟเฉฐเจ—, เจœเจฟเจธเจฆเจพ เจฎเจคเจฒเจฌ เจนเฉˆ เจ•เจฟ เจฌเจฟเจฒเจกเจฎเจพเจธเจŸเจฐ เจธเจฎเฉ‡เจ‚-เจธเจฎเฉ‡เจ‚ 'เจคเฉ‡ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจจเจพเจฒ เจธเจฐเจตเจฐ เจจเฉ‚เฉฐ เจชเฉ‹เจฒ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจœเฉ‡ เจ•เจฎเจฟเจŸ เจ•เจฐเฉ‹ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจฆเจฐเจธเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ, เจซเจฟเจฐ เจฌเจฟเจฒเจกเจฎเจพเจธเจŸเจฐ เจ•เฉเจ เจฆเฉ‡เจฐเฉ€ เจจเจพเจฒ เจ‡เฉฑเจ• เจ…เฉฐเจฆเจฐเฉ‚เจจเฉ€ เจตเจธเจคเฉ‚ เจฌเจฃเจพเจตเฉ‡เจ—เจพ เจฌเจฆเจฒเฉ‹ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจ‡เจตเฉˆเจ‚เจŸ เจนเฉˆเจ‚เจกเจฒเจฐ เจจเฉ‚เฉฐ เจญเฉ‡เจœเฉ‹ เจธเฉˆเจกเจฟเจŠเจฒเจฐ, เจœเฉ‹ เจ•เจฟ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจ…เจคเฉ‡ เจŸเฉˆเจธเจŸ เจ•เจฐเจจ เจฒเจˆ เจ•เจฆเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ‚เจš เจ•เจฐเฉ‡เจ—เจพ เจ•เจพเจฎเจพ-เจˆ. เจ‡เจนเจจเจพเจ‚ เจ•เจฆเจฎเจพเจ‚ เจตเจฟเฉฑเจš เจธเฉฐเจ•เฉ‡เจค เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพ เจ…เฉฑเจชเจกเฉ‡เจŸ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€. เจฌเจฟเจฒเจ•เฉเจฒ 'เจคเฉ‡ เจ•เจพเจฎเจพเจ‡เจน เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจฆเฉ€ เจ‡เฉฑเจ• เจธเจฅเจพเจจเจ• เจ•เจพเจชเฉ€ เจฌเจฃเจพเจเจ—เจพเฅค เจ‡เจธ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฆเฉ‡ เจตเฉ‡เจฐเจตเฉ‡ เจ…เจ—เจฒเฉ‡ เจฆเฉ‹ เจญเจพเจ—เจพเจ‚ เจตเจฟเฉฑเจš เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ‡ เจœเจพเจฃเจ—เฉ‡เฅค (5.4 ะธ 5.5).

เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจŸเจฐเฉˆเจ• เจ•เจฐเจจ เจฆเจพ เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจตเฉ€ เจธเจผเจพเจจเจฆเจพเจฐ เจคเจฐเฉ€เจ•เจพ เจนเฉˆ เจธเจฐเจตเจฐ เจคเฉ‹เจ‚ เจธเจฟเฉฑเจงเฉ‡ เจธเฉเจจเฉ‡เจนเฉ‡ เจญเฉ‡เจœเจฃเจพ เจฌเจฟเจฒเจกเจฎเจพเจธเจŸเจฐ- เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจธเจฐเฉ‹เจค เจ•เฉ‹เจกเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฃ เจฌเจพเจฐเฉ‡เฅค เจ‡เจธ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš, เจœเจฟเจตเฉ‡เจ‚ เจนเฉ€ เจกเจฟเจตเฉˆเจฒเจชเจฐ เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ เจ•เจฎเจฟเจŸ เจ•เจฐเฉ‹, เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจตเจพเจฒเจพ เจธเจฐเจตเจฐ เจ‡เฉฑเจ• เจธเฉเจจเฉ‡เจนเจพ เจญเฉ‡เจœเฉ‡เจ—เจพ เจฌเจฟเจฒเจกเจฎเจพเจธเจŸเจฐ-y. เจ…เจคเฉ‡ เจ‰เจน, เจฌเจฆเจฒเฉ‡ เจตเจฟเฉฑเจš, เจ‡เฉฑเจ• เจตเจธเจคเฉ‚ เจฌเจฃเจพ เจ•เฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจฐเฉ‹เจ• เจฆเฉ‡เจตเฉ‡เจ—เจพ PBCchangeSource. เจ…เฉฑเจ—เฉ‡, เจ‡เจธ เจตเจธเจคเฉ‚ เจจเฉ‚เฉฐ เจคเจฌเจฆเฉ€เจฒ เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพ เจธเฉˆเจกเจฟเจŠเจฒเจฐ, เจœเฉ‹ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจ…เจคเฉ‡ เจ‡เจธเจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจ เจฒเจˆ เจ•เจฆเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจธเจฐเจ—เจฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ‡เจธ เจตเจฟเจงเฉ€ เจฆเจพ เจ‡เฉฑเจ• เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจนเจฟเฉฑเจธเจพ เจ•เฉฐเจฎ เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ เจนเฉเฉฑเจ•- เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจธเจฐเจตเจฐ เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚เฅค เจธเจ•เฉเจฐเจฟเจชเจŸ เจตเจฟเฉฑเจš เจนเฉเฉฑเจ•-a, เจ•เจพเจฐเจตเจพเจˆ เจ•เจฐเจจ เจฒเจˆ เจœเจผเจฟเฉฐเจฎเฉ‡เจตเจพเจฐ เจนเฉˆ, เจœเจฆ เจ•เจฎเจฟเจŸ เจ•เจฐเฉ‹-เจˆ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‰เจชเจฏเฉ‹เจ—เจคเจพ เจจเฉ‚เฉฐ เจ•เจพเจฒ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ เจคเจฌเจฆเฉ€เจฒเฉ€ เจญเฉ‡เจœเฉ‹ เจ…เจคเฉ‡ เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจเจกเจฐเฉˆเฉฑเจธ เจฆเจฟเจ“ เจฌเจฟเจฒเจกเจฎเจพเจธเจŸเจฐ-เจ. เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‰เจธ เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจชเฉ‹เจฐเจŸ เจจเฉ‚เฉฐ เจตเฉ€ เจจเจฟเจฐเจงเจพเจฐเจฟเจค เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ เจœเฉ‹ เจธเฉเจฃเฉ‡เจ—เจพ PBCchangeSource. PBCchangeSource, เจคเจฐเฉ€เจ•เฉ‡ เจจเจพเจฒ, เจนเจฟเฉฑเจธเจพ เจนเฉˆ เจฌเจฟเจฒเจกเจฎเจพเจธเจŸเจฐ-เจ. เจ‡เจธ เจตเจฟเจงเฉ€ เจจเฉ‚เฉฐ เจ‡เจœเจพเจœเจผเจค เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉ‹เจตเฉ‡เจ—เฉ€ เจชเจฐเจฌเฉฐเจงเจ•-a เจธเจฐเจตเจฐ 'เจคเฉ‡ เจœเจฟเฉฑเจฅเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจธเจฅเจฟเจค เจนเฉˆเฅค เจคเฉเจนเจพเจจเฉ‚เฉฐ เจชเจนเจฟเจฒเจพเจ‚ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจฆเจพ เจฌเฉˆเจ•เจ…เฉฑเจช เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉ‹เจตเฉ‡เจ—เฉ€เฅค

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"]))

เจธเจผเจกเจฟเจŠเจฒเจฐ - เจ‡เจน เจ‡เฉฑเจ• เจ…เจœเจฟเจนเจพ เจคเฉฑเจค เจนเฉˆ เจœเฉ‹ เจ‡เฉฑเจ• เจŸเจฐเจฟเฉฑเจ—เจฐ เจตเจœเฉ‹เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ เจœเฉ‹ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเฉ€ เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€ เจ…เจคเฉ‡ เจŸเฉˆเจธเจŸเจฟเฉฐเจ— เจฆเฉ€ เจชเฉ‚เจฐเฉ€ เจฒเฉœเฉ€ เจจเฉ‚เฉฐ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจฆเจพ เจนเฉˆเฅค
เจฌเจฟเจฒเจกเจฌเฉ‹เจŸ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจจเจฟเจฐเฉฐเจคเจฐ เจเจ•เฉ€เจ•เจฐเจฃ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเฉ€ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจฃ

เจ‰เจน เจฌเจฆเจฒเจพเจ… เจœเฉ‹ เจฐเจฟเจ•เจพเจฐเจก เจ•เฉ€เจคเฉ‡ เจ—เจ เจธเจจ เจคเจฌเจฆเฉ€เจฒเฉ€_เจธเจฐเฉ‹เจค, เจ•เฉฐเจฎ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจตเจฟเฉฑเจš เจคเจฌเจฆเฉ€เจฒ เจฌเจฟเจฒเจกเจฌเฉ‹เจŸ- เจ‡เฉฑเจ• เจ‡เจคเจฐเจพเจœเจผ เจ•เจฐเจจ เจฒเจˆ เจฌเจฆเจฒเฉ‹ เจ…เจคเฉ‡ เจนเฉเจฃ เจนเจฐ เจธเจผเฉˆเจกเจฟเจŠเจฒเจฐ เจ‰เจนเจจเจพเจ‚ เจฆเฉ‡ เจ…เจงเจพเจฐ เจคเฉ‡, เจ‡เจน เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจจ เจฒเจˆ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆเฅค เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจ‡เจน เจ‡เจน เจตเฉ€ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เจฐเจฆเจพ เจนเฉˆ เจ•เจฟ เจ‡เจนเจจเจพเจ‚ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจ•เจคเจพเจฐ เจตเจฟเฉฑเจš เจ•เจฆเฉ‹เจ‚ เจคเจฌเจฆเฉ€เจฒ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจ‡เฉฑเจ• เจตเจธเจคเฉ‚ เจฌเจฟเจฒเจกเจฐ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจ•เจคเจพเจฐ เจธเจŸเฉ‹เจฐ เจ•เจฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจฎเฉŒเจœเฉ‚เจฆเจพ เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€ เจฆเฉ€ เจธเจฅเจฟเจคเฉ€ เจจเฉ‚เฉฐ เจตเฉฑเจ–เจฐเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡ เจŸเจฐเฉˆเจ• เจ•เจฐเจฆเจพ เจนเฉˆ เจ•เจพเจฎเจพ-เจˆ. เจฌเจฟเจฒเจกเจฐ 'เจคเฉ‡ เจฎเฉŒเจœเฉ‚เจฆ เจนเฉˆ เจฌเจฟเจฒเจกเจฎเจพเจธเจŸเจฐ-e เจ…เจคเฉ‡ 'เจคเฉ‡ เจ•เจพเจฎเจพ-เจˆ. เจจเจพเจฒ เจญเฉ‡เจœเจฆเจพ เจนเฉˆ เจฌเจฟเจฒเจกเจฎเจพเจธเจŸเจฐ- เจ‡เฉฑเจ• 'เจคเฉ‡ เจ•เจพเจฎเจพ- เจ…เจคเฉ‡ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจ–เจพเจธ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ - เจ•เจฆเจฎเจพเจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจฒเฉœเฉ€ เจœเจฟเจธเจฆเฉ€ เจชเจพเจฒเจฃเจพ เจ•เฉ€เจคเฉ€ เจœเจพเจฃเฉ€ เจšเจพเจนเฉ€เจฆเฉ€ เจนเฉˆเฅค
เจ…เจธเฉ€เจ‚ เจฆเฉ‡เจ–เจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจฎเฉŒเจœเฉ‚เจฆเจพ เจ‰เจฆเจพเจนเจฐเจฃ เจตเจฟเฉฑเจš เจ…เจœเจฟเจนเจพ เจนเฉˆ เจธเจผเจกเจฟเจŠเจฒเจฐ 2 เจŸเฉเจ•เฉœเฉ‡ เจฌเจฃเจพเจ เจ—เจ เจนเจจเฅค เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจนเจฐเฉ‡เจ• เจฆเฉ€ เจ†เจชเจฃเฉ€ เจ•เจฟเจธเจฎ เจนเฉˆ.

เจธเจฟเฉฐเจ—เจฒเจฌเฉเจฐเจพเจ‚เจš เจธเจผเฉˆเจกเจฟเจŠเจฒเจฐ - เจ…เจจเฉเจธเฉ‚เจšเฉ€ 'เจคเฉ‡ เจธเจญ เจคเฉ‹เจ‚ เจชเฉเจฐเจธเจฟเฉฑเจง เจ•เจฒเจพเจธเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ•เฅค เจ‡เจน เจ‡เฉฑเจ• เจธเจผเจพเจ–เจพ เจจเฉ‚เฉฐ เจฆเฉ‡เจ–เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เจธ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจฐเจฟเจ•เจพเจฐเจก เจ•เฉ€เจคเฉ€ เจคเจฌเจฆเฉ€เจฒเฉ€ เจฆเฉเจ†เจฐเจพ เจšเจพเจฒเฉ‚ เจนเฉเฉฐเจฆเจพ เจนเฉˆเฅค เจœเจฆเฉ‹เจ‚ เจ‰เจน เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจฆเฉ‡เจ–เจฆเจพ เจนเฉˆ, เจคเจพเจ‚ เจ‰เจน เจฌเจฟเจฒเจก เจฌเฉ‡เจจเจคเฉ€ เจญเฉ‡เจœเจฃ เจตเจฟเฉฑเจš เจฆเฉ‡เจฐเฉ€ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆ (เจตเจฟเจธเจผเฉ‡เจธเจผ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ เจตเจฟเฉฑเจš เจจเจฟเจฐเจงเจพเจฐเจค เจฎเจฟเจ†เจฆ เจฒเจˆ เจฎเฉเจฒเจคเจตเฉ€ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆ เจŸเฉเจฐเฉ€ เจธเจŸเฉˆเจฌเจฒ เจŸเจพเจˆเจฎเจฐ) เจตเจฟเจš เจจเจพเจฎ เจ…เจจเฉเจธเฉ‚เจšเฉ€ เจฆเจพ เจจเจพเจฎ เจธเฉˆเฉฑเจŸ เจ•เจฐเจฆเจพ เจนเฉˆ เจœเจฟเจธ เจตเจฟเฉฑเจš เจชเฉเจฐเจฆเจฐเจธเจผเจฟเจค เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพ เจฌเจฟเจฒเจกเจฌเฉ‹เจŸ- เจตเฉˆเฉฑเจฌ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ. IN เจซเจฟเจฒเจŸเจฐ เจฌเจฆเจฒเฉ‹ เจ‡เฉฑเจ• เจซเจฟเจฒเจŸเจฐ เจธเฉˆเจŸ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจœเจฟเจธ เจจเฉ‚เฉฐ เจชเจพเจธ เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจธเจผเจพเจ–เจพ เจตเจฟเฉฑเจš เจ•เจฟเจนเฉœเฉ€เจ†เจ‚ เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจ‰เจธเจพเจฐเฉ€ เจฒเจˆ เจฌเฉ‡เจจเจคเฉ€ เจญเฉ‡เจœเจฃ เจฒเจˆ เจ•เจพเจฐเจœเจ•เฉเจฐเจฎ เจจเฉ‚เฉฐ เจชเฉเจฐเฉ‹เจ‚เจชเจŸ เจ•เจฐเจฆเฉ€เจ†เจ‚ เจนเจจเฅค IN เจฌเจฟเจฒเจกเจฐ เจฆเฉ‡ เจจเจพเจฎ เจจเจพเจฎ เจฆเจฐเจธเจพเจ‡เจ† เจ—เจฟเจ† เจนเฉˆ เจฌเจฟเจฒเจกเจฐ-a, เจœเจฟเจธ เจจเฉ‚เฉฐ เจ…เจธเฉ€เจ‚ เจฅเฉ‹เฉœเฉ€ เจฆเฉ‡เจฐ เจฌเจพเจ…เจฆ เจธเฉˆเจŸ เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค เจธเจพเจกเฉ‡ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš เจจเจพเจฎ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจจเจพเจฎ เจฆเฉ‡ เจธเจฎเจพเจจ เจนเฉ‹เจตเฉ‡เจ—เจพ: เจคเฉเจนเจพเจกเจพ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ.

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

PS เจจเฉฐเจฌเจฐ 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": "."}))

เจชเฉ€เจฐเฉ€เจ…เจกเจฟเจ• เจฌเจฟเจฒเจก เจŸเจพเจˆเจฎเจฐ เจ‡เจธ เจฎเจฟเจ†เจฆ เจฆเจพ เจธเจฎเจพเจ‚ เจธเจ•เจฟเฉฐเจŸเจพเจ‚ เจตเจฟเฉฑเจš เจจเจฟเจธเจผเจšเจฟเจค เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจฌเจฟเจฒเจก เจซเฉˆเจ•เจŸเจฐเฉ€ เจ‡เฉฑเจ• เจ–เจพเจธ เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ, เจœเฉ‹ เจซเจฟเจฐ เจฌเจฟเจฒเจกเจฐ เจจเฉ‚เฉฐ เจญเฉ‡เจœเจฆเจพ เจนเฉˆ เจ•เจพเจฎเจพ. The เจฌเจฟเจฒเจก เจซเฉˆเจ•เจŸเจฐเฉ€ เจชเจพเจฒเจฃ เจ•เฉ€เจคเฉ‡ เจœเจพเจฃ เจตเจพเจฒเฉ‡ เจ•เจฆเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจฆเจฐเจธเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ เจ•เจพเจฎเจพ-y. เจตเจฟเจงเฉ€ เจจเฉ‚เฉฐ เจ•เจพเจฒ เจ•เจฐเจ•เฉ‡ เจ•เจฆเจฎ เจœเฉ‹เฉœเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ addStep

เจ‡เจธ เจ‰เจฆเจพเจนเจฐเจจ เจตเจฟเฉฑเจš เจชเจนเจฟเจฒเจพ เจœเฉ‹เฉœเจฟเจ† เจ—เจฟเจ† เจ•เจฆเจฎ เจนเฉˆ git เจธเจพเจซเจผ -d -f -f -xเจซเจฟเจฐ git เจšเฉˆเจ•เจ†เจ‰เจŸ. เจ‡เจน เจ•เจพเจฐเจตเจพเจˆเจ†เจ‚ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจ—เจˆเจ†เจ‚ เจนเจจ เจขเฉฐเจ— เจนเฉˆ, เจœเฉ‹ เจธเจชเจธเจผเจŸ เจคเฉŒเจฐ 'เจคเฉ‡ เจจเจนเฉ€เจ‚ เจฆเฉฑเจธเจฟเจ† เจ—เจฟเจ† เจนเฉˆ เจชเจฐ เจ‡เฉฑเจ• เจกเจฟเจซเฉŒเจฒเจŸ เจฎเฉเฉฑเจฒ เจจเฉ‚เฉฐ เจฆเจฐเจธเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ เจคเจพเจœเจผเจพ. เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ เจฎเฉ‹เจก = 'เจตเจงเจพเจˆ' เจฆเจฐเจธเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ เจ•เจฟ เจซเจพเจˆเจฒเจพเจ‚ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจคเฉ‹เจ‚ เจนเจจ เจœเจฟเฉฑเจฅเฉ‡ chechout, เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจคเฉ‹เจ‚ เจ—เฉเฉฐเจฎ เจนเฉ‹เจฃ เจฆเฉ‡ เจฆเฉŒเจฐเจพเจจ, เจ…เจ›เฉ‚เจค เจฐเจนเฉ‡เฅค

เจฆเฉ‚เจœเจพ เจœเฉ‹เฉœเจฟเจ† เจ—เจฟเจ† เจ•เจฆเจฎ เจธเจ•เฉเจฐเจฟเจชเจŸ เจจเฉ‚เฉฐ เจ•เจพเจฒ เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ เจฎเฉเจ•เฉฑเจฆเจฎเฉ‡ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ เจฆเฉ‡ เจจเจพเจฒ เจธเจค เจธเฉเจฐเฉ€ เจ…เจ•เจพเจฒ เจชเจพเจธเฉ‡ 'เจคเฉ‡ เจ•เจพเจฎเจพ- เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจคเฉ‹เจ‚ เจ /home/habr/worker/yourProject/build เจ‡เจจเจตเจพเจ‡เจฐเจฎเฉˆเจ‚เจŸ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ PATHONPATH=... เจจเจพเจฒ, เจคเฉเจธเฉ€เจ‚ เจ†เจชเจฃเฉ€เจ†เจ‚ เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจฒเจฟเจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจชเจพเจธเฉ‡ 'เจคเฉ‡ เจšเจฒเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจ•เจพเจฎเจพ- เจนเจฐ เจ•เจฆเจฎ util.ShellCommand. เจ‡เจน เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจจเฉ‚เฉฐ เจธเจฟเฉฑเจงเฉ‡ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจฐเฉฑเจ–เจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจซเจฟเจฐ 'เจคเฉ‡ chechout-e เจ‰เจน เจตเจฟเฉฑเจš เจกเจฟเฉฑเจ— เจœเจพเจตเฉ‡เจ—เจพ /home/habr/worker/yourProject/build. เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจซเจฟเจฐ เจฆเฉ‹ "เจชเจฐ" เจนเจจ:

  1. เจ•เจพเจฎเจพ เจ‡เฉฑเจ• เจ•เฉเฉฐเจœเฉ€ เจจเจพเจฒ เจฌเจฃเจพเจ‡เจ† เจœเจพเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ --เจ‰เจฎเจพเจธเจ• เจคเจพเจ‚ เจ•เจฟ เจ‡เจน เจฌเจพเจ…เจฆ เจตเจฟเฉฑเจš เจซเจพเจ‚เจธเฉ€ เจฆเฉ‡ เจ…เจงเจฟเจ•เจพเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฒเฉŒเจ• เจจเจพ เจ•เจฐเฉ‡ เจ•เจฎเจฐเจพ เจ›เฉฑเจก เจฆเจฟเจ“-เจฆ.
  2. 'เจคเฉ‡ git เจงเฉฑเจ•เจพ-e เจ‡เจนเจจเจพเจ‚ เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจธเฉฐเจชเฉฑเจคเฉ€ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ เจšเจฒเจพเจ‰เจฃเจฏเฉ‹เจ—เจ‡เจธ เจฒเจˆ เจฌเจพเจ…เจฆ เจตเจฟเฉฑเจš chechout-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. เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจ–เฉเจฆ เจ•เจฟเจธเฉ‡ เจ•เจฟเจธเจฎ เจฆเฉ‡ เจ•เจฒเจพเจ‰เจก เจตเจฟเฉฑเจš เจธเจฅเจฟเจค เจนเฉ‹เจตเฉ‡เจ—เฉ€เฅค เจ‡เฉฑเจฅเฉ‡ เจ‡เจธ เจฌเฉฑเจฆเจฒ เจฆเจพ เจชเจคเจพ เจนเฉˆ svn.host/svn/yourProject/trunk. เจฌเฉฑเจฆเจฒ เจนเฉ‡เจ  svn เจ‡เฉฑเจ• เจ–เจพเจคเจพ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจจเจพเจฎ เจนเฉˆ: เจ‰เจชเจญเฉ‹เจ—เฉ€ เจจเฉ‚เฉฐ, เจชเจพเจธเจตเจฐเจก: เจชเจพเจธเจตเจฐเจก. เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจœเฉ‹ เจ•เจฆเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจฆเจฐเจธเจพเจ‰เจ‚เจฆเฉ€เจ†เจ‚ เจนเจจ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ-a เจฆเฉ€ เจธเจผเจพเจ–เจพ เจตเจฟเฉฑเจš เจตเฉ€ เจนเฉ‹เจตเฉ‡เจ—เฉ€ svn, เจ‡เฉฑเจ• เจตเฉฑเจ–เจฐเฉ‡ เจซเฉ‹เจฒเจกเจฐ เจตเจฟเฉฑเจš buildbot/worker_linux. เจ‡เจน เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจ•เฉ€เจคเฉ€ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพ เจฆเฉ‡ เจจเจพเจฒ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจธเจฅเจฟเจค เจนเจจ เจšเฉฑเจฒเจฃเจฏเฉ‹เจ—.

เจฌเจฟเจฒเจกเจฎเจพเจธเจŸเจฐ ะธ เจ•เจพเจฎเจพ เจ‰เจธเฉ‡ เจฎเฉ‡เจœเจผเจฌเจพเจจ 'เจคเฉ‡ เจšเจฒเจพเจ“ project.host .เจฌเจฟเจฒเจกเจฎเจพเจธเจŸเจฐ เจ‡เจธ เจฆเฉ€เจ†เจ‚ เจซเจพเจˆเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจซเฉ‹เจฒเจกเจฐ เจตเจฟเฉฑเจš เจธเจŸเฉ‹เจฐ เจ•เจฐเจฆเจพ เจนเฉˆ /เจ˜เจฐ/เจนเฉˆเจฌเจฐ/เจฎเจพเจธเจŸเจฐ. เจ•เจพเจฎเจพ เจ‡เจธ เจจเฉ‚เฉฐ เจนเฉ‡เจ  เจฆเจฟเฉฑเจคเฉ‡ เจฎเจพเจฐเจ— เจตเจฟเฉฑเจš เจธเจŸเฉ‹เจฐ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ /เจ˜เจฐ/เจนเจพเจฌเจฐ/เจ•เจฐเจฎเจšเจพเจฐเฉ€. เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจธเฉฐเจšเจพเจฐ เจฌเจฟเจฒเจกเจฎเจพเจธเจŸเจฐ-a เจ…เจคเฉ‡ เจ•เจพเจฎเจพ-a เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจฆเฉ‡ เจ…เจจเฉเจธเจพเจฐ เจชเฉ‹เจฐเจŸ 4000 เจฆเฉเจ†เจฐเจพ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจฌเจฟเจฒเจกเจฌเฉ‹เจŸ-a, เจ‡เจน เจนเฉˆ 'pb' เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒเฅค

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

เจตเฉˆเฉฑเจฌ เจกเจฟเจธเจชเจฒเฉ‡ เจฌเจฟเจฒเจกเจฌเฉ‹เจŸ เจ…เจธเฉ€เจ‚ เจ‡เจธ เจฒเจˆ เจชเฉ‹เจฐเจŸ 80 เจจเจพเจฒ เจœเฉเฉœเจพเจ‚เจ—เฉ‡ project.host. Apatch เจจเฉ‚เฉฐ เจ‡เฉฐเจธเจŸเจพเจฒ เจ•เจฐเจจเจพ เจœเจผเจฐเฉ‚เจฐเฉ€ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจฆเฉ‡ เจนเจฟเฉฑเจธเฉ‡ เจตเจœเฉ‹เจ‚ เจฎเจฐเฉ‹เฉœเจฟเจ† เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจ‡เฉฑเจ• เจตเฉˆเฉฑเจฌ เจธเจฐเจตเจฐ เจนเฉˆ, เจฌเจฟเจฒเจกเจฌเฉ‹เจŸ เจ‡เจธ เจจเฉ‚เฉฐ เจตเจฐเจคเจฆเจพ เจนเฉˆ.

เจฒเจˆ เจ…เฉฐเจฆเจฐเฉ‚เจจเฉ€ เจœเจพเจฃเจ•เจพเจฐเฉ€ เจธเจŸเฉ‹เจฐ เจ•เจฐเจจ เจฒเจˆ เจฌเจฟเจฒเจกเจฌเฉ‹เจŸ เจ…เจธเฉ€เจ‚ เจตเจฐเจคเจพเจ‚เจ—เฉ‡ sqlite.

เจฎเฉ‡เจฒเจฟเฉฐเจ— เจฒเจˆ เจ‡เฉฑเจ• เจนเฉ‹เจธเจŸ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ smtp.your.domain - เจ‡เจน เจฎเฉ‡เจฒ เจคเฉ‹เจ‚ เจšเจฟเฉฑเจ เฉ€เจ†เจ‚ เจญเฉ‡เจœเจฃ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ [เจˆเจฎเฉ‡เจฒ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค] เจชเฉเจฐเจฎเจพเจฃเจฟเจ•เจคเจพ เจฆเฉ‡ เจฌเจฟเจจเจพเจ‚. เจฎเฉ‡เจœเจผเจฌเจพเจจ 'เจคเฉ‡ เจตเฉ€.SMTP ' เจชเฉ‹เจธเจŸ 1025 'เจคเฉ‡ เจฎเจฟเฉฐเจŸ เจธเฉเจฃเฉ‡ เจœเจพ เจฐเจนเฉ‡ เจนเจจเฅค

เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจฆเฉ‹ เจฒเฉ‹เจ• เจนเจจ: เจชเจฐเจฌเฉฐเจงเจ• ะธ เจ‰เจชเจญเฉ‹เจ—เฉ€ เจจเฉ‚เฉฐ. admin เจชเฉเจฐเจธเจผเจพเจธเจ• เจฌเจฟเจฒเจกเจฌเฉ‹เจŸ. เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจตเจšเจจเจฌเฉฑเจง เจตเจฟเจ…เจ•เจคเฉ€ เจนเฉˆ เจ•เจฎเจฟเจŸ เจ•เจฐเฉ‹-เจธ.

เจฆเฉเจ†เจฐเจพ เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจŸเฉ‡เจฌเจฒ เจซเจพเจˆเจฒ เจคเจฟเจ†เจฐ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ เจชเจพเจˆเจ‡เฉฐเจธเจŸเจพเจฒเจฐ. เจฆเฉเจ†เจฐเจพ เจฆเจธเจคเจพเจตเฉ‡เจœเจผ เจคเจฟเจ†เจฐ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ doxygen.

เจ‡เจธ เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจฒเจˆ เจฎเฉˆเจ‚ เจ‡เจน เจฒเจฟเจ–เจฟเจ†: 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 ะฒ /เจ˜เจฐ/เจนเฉˆเจฌเจฐ/เจฎเจพเจธเจŸเจฐ.

เจ…เจ—เจฒเจพ เจ•เจฆเจฎ เจธเฉ‡เจตเจพ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจจเจพ เจนเฉˆ เจฌเจฟเจฒเจกเจฎเจพเจธเจŸเจฐaa


sudo buildbot start /home/habr/master

เจซเจฟเจฐ เจธเฉ‡เจตเจพ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเฉ‹ เจ•เจพเจฎเจพ-a


buildbot-worker start /home/habr/worker

เจคเจฟเจ†เจฐ! เจนเฉเจฃ เจฌเจฟเจฒเจกเจฌเฉ‹เจŸ เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจŸเจฐเฉˆเจ• เจ•เจฐเฉ‡เจ—เจพ เจ…เจคเฉ‡ เจŸเจฐเจฟเฉฑเจ—เจฐ เจ•เจฐเฉ‡เจ—เจพ เจ•เจฎเจฟเจŸ เจ•เจฐเฉ‹-y เจตเจฟเฉฑเจš svn, เจ‰เจชเจฐเฉ‹เจ•เจค เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฌเจฃเจพเจ‰เจฃ เจ…เจคเฉ‡ เจŸเฉˆเจธเจŸ เจ•เจฐเจจ เจฆเฉ‡ เจ•เจฆเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉ‚เจฐเจพ เจ•เจฐเจจเจพเฅค

เจนเฉ‡เจ เจพเจ‚ เจฎเฉˆเจ‚ เจ‰เจชเจฐเฉ‹เจ•เจค เจฆเฉ€เจ†เจ‚ เจ•เฉเจ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจพเจ‚เจ—เจพ master.cfg.

6.1 เจคเฉเจนเจพเจกเฉ‡ master.cfg เจฆเฉ‡ เจฐเจธเจคเฉ‡ 'เจคเฉ‡


เจฒเจฟเจ–เจฃ เจตเฉ‡เจฒเฉ‡ เจฎเฉ‡เจฐเฉ€ master.cfg เจฌเจนเฉเจค เจธเจพเจฐเฉ€เจ†เจ‚ เจ—เจฒเจคเฉ€เจ†เจ‚ เจนเฉ‹เจฃเจ—เฉ€เจ†เจ‚, เจ‡เจธ เจฒเจˆ เจฒเฉŒเจ— เจซเจพเจˆเจฒ เจจเฉ‚เฉฐ เจชเฉœเฉเจนเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉ‹เจตเฉ‡เจ—เฉ€เฅค เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจธเจŸเฉ‹เจฐ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจฌเจฟเจฒเจกเจฎเจพเจธเจŸเจฐ-EC เจชเฉ‚เจฐเจจ เจฎเจพเจฐเจ— /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_alwaystrunk เจจเจฟเจฏเจฎ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เจฐเจฆเจพ เจนเฉˆ: เจซเฉ‹เจฒเจกเจฐ เจฌเจฃเจคเจฐ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจคเฉ‹เฉœเจจเจพ เจนเฉˆ svn เจธเจผเจพเจ–เจพเจตเจพเจ‚ 'เจคเฉ‡. เจ‰เจน เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจฐเจฟเจธเจผเจคเฉ‡เจฆเจพเจฐ เจฎเจพเจฐเจ— เจตเฉ€ เจชเฉ‡เจธเจผ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ‡เจธเจฆเฉ€ เจตเจพเจฐเฉ€ เจตเจฟเฉฑเจš 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]

เจ‰เจน เจธเฉเจจเฉ‡เจนเฉ‡ เจญเฉ‡เจœ เจธเจ•เจฆเจพ เจนเฉˆ เจตเฉฑเจ–-เจตเฉฑเจ– เจคเจฐเฉ€เจ•เฉ‡.

เจฎเฉ‡เจฒ เจจเฉ‹เจŸเฉ€เจซเจพเจ‡เจฐ เจธเฉ‚เจšเจจเจพเจตเจพเจ‚ เจญเฉ‡เจœเจฃ เจฒเจˆ เจˆเจฎเฉ‡เจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจŸเฉˆเจ‚เจชเจฒเฉ‡เจŸ_html เจจเจฟเจŠเจœเจผเจฒเฉˆเจŸเจฐ เจฒเจˆ เจŸเฉˆเจ•เจธเจŸ เจŸเฉˆเจฎเจชเจฒเฉ‡เจŸ เจธเฉˆเฉฑเจŸ เจ•เจฐเจฆเจพ เจนเฉˆเฅค HTML เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจฎเจพเจฐเจ•เจ…เฉฑเจช เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค เจ‡เจธ เจจเฉ‚เฉฐ เจ‡เฉฐเจœเจฃ เจฆเฉเจ†เจฐเจพ เจธเฉ‹เจงเจฟเจ† เจ—เจฟเจ† เจนเฉˆ jinja2 (เจจเจพเจฒ เจคเฉเจฒเจจเจพ เจ•เฉ€เจคเฉ€ เจœเจพ เจธเจ•เจฆเฉ€ เจนเฉˆ django). เจฌเจฟเจฒเจกเจฌเฉ‹เจŸ เจตเจฟเฉฑเจš เจตเฉ‡เจฐเฉ€เจเจฌเจฒเจพเจ‚ เจฆเจพ เจ‡เฉฑเจ• เจธเจฎเฉ‚เจน เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจœเจฟเจจเฉเจนเจพเจ‚ เจฆเฉ‡ เจฎเฉเฉฑเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจธเฉเจจเฉ‡เจนเจพ เจŸเฉˆเจ•เจธเจŸ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฆเฉŒเจฐเจพเจจ เจŸเฉˆเจ‚เจชเจฒเฉ‡เจŸ เจตเจฟเฉฑเจš เจฌเจฆเจฒ เจฆเจฟเฉฑเจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจ‡เจน เจตเฉ‡เจฐเฉ€เจเจฌเจฒ {{ เจกเจฌเจฒ เจ•เจฐเจฒเฉ€ เจฌเจฐเฉ‡เจธ }} เจตเจฟเฉฑเจš เจฌเฉฐเจฆ เจนเจจเฅค เจ‰เจฆเจพเจนเจฐเจฃ เจฒเจˆ, เจธเจพเจฐ เจชเฉ‚เจฐเฉ‡ เจนเฉ‹เจ เจ“เจชเจฐเฉ‡เจธเจผเจจเจพเจ‚ เจฆเฉ€ เจธเจฅเจฟเจคเฉ€ เจจเฉ‚เฉฐ เจฆเจฐเจธเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ, เจฏเจพเจจเฉ€ เจธเจซเจฒเจคเจพ เจœเจพเจ‚ เจ…เจธเจซเจฒเจคเจพเฅค เจ เจชเฉเจฐเจพเจœเฉˆเจ•เจŸ เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจ•เจฐเฉ‡เจ—เจพ เจคเฉเจนเจพเจกเจพ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ. เจ‡เจธ เจฒเจˆ, เจ•เฉฐเจŸเจฐเฉ‹เจฒ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ jinja2, เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจฌเจฟเจฒเจกเจฌเฉ‹เจŸ-a เจ…เจคเฉ‡ python เจธเจŸเฉเจฐเจฟเฉฐเจ— เจซเจพเจฐเจฎเฉˆเจŸเจฟเฉฐเจ— เจŸเฉ‚เจฒ, เจคเฉเจธเฉ€เจ‚ เจ•เจพเจซเจผเฉ€ เจœเจพเจฃเจ•เจพเจฐเฉ€ เจญเจฐเจชเฉ‚เจฐ เจธเฉเจจเฉ‡เจนเจพ เจฌเจฃเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

เจฎเฉ‡เจฒ เจจเฉ‹เจŸเฉ€เจซเจพเจ‡เจฐ เจนเฉ‡เจ  เจฒเจฟเจ–เฉ€เจ†เจ‚ เจฆเจฒเฉ€เจฒเจพเจ‚ เจธเจผเจพเจฎเจฒ เจนเจจเฅค

addr เจคเฉ‹เจ‚ - เจ‰เจน เจชเจคเจพ เจœเจฟเจธ เจคเฉ‹เจ‚ เจนเจฐ เจ•เฉ‹เจˆ เจจเจฟเจŠเจœเจผเจฒเฉˆเจŸเจฐ เจชเฉเจฐเจพเจชเจค เจ•เจฐเฉ‡เจ—เจพเฅค

InterestedUsers เจจเฉ‚เฉฐ เจญเฉ‡เจœเฉ‹=เจธเฉฑเจšเจพ เจฎเจพเจฒเจ• เจ…เจคเฉ‡ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจธเฉเจจเฉ‡เจนเจพ เจญเฉ‡เจœเจฆเจพ เจนเฉˆ เจœเจฟเจธเจจเฉ‡ เจฌเจฃเจพเจ‡เจ† เจนเฉˆ เจ•เจฎเจฟเจŸ เจ•เจฐเฉ‹.

เจเจพเจ‚เจ•เจจเจพ โ€” เจ‡เฉฑเจ• เจชเจฟเจ›เฉ‡เจคเจฐ เจœเฉ‹ เจจเจฟเจŠเจœเจผเจฒเฉˆเจŸเจฐ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจตเจพเจฒเฉ‡ เจ‰เจชเจญเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจฆเฉ‡ เจจเจพเจตเจพเจ‚ เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจ•เฉ€เจคเจพ เจœเจพเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค เจ‡เจธ เจฒเจˆ เจชเจฐเจฌเฉฐเจงเจ• เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจชเจคเฉ‡ 'เจคเฉ‡ เจจเจฟเจŠเจœเจผเจฒเฉˆเจŸเจฐ เจ•เจฟเจตเฉ‡เจ‚ เจชเฉเจฐเจพเจชเจค เจ•เจฐเฉ‡เจ—เจพ [เจˆเจฎเฉ‡เจฒ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค].

relayhost เจนเฉ‹เจธเจŸ-เจจเจพเจ‚ เจจเฉ‚เฉฐ เจฆเจฐเจธเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ เจœเจฟเจธ 'เจคเฉ‡ เจธเจฐเจตเจฐ เจ–เฉ‹เจฒเฉเจนเจฟเจ† เจ—เจฟเจ† เจนเฉˆ SMTP, เจ‡เฉฑเจ• smptPort เจธเฉเจฃเจจ เจตเจพเจฒเจพ เจชเฉ‹เจฐเจŸ เจจเฉฐเจฌเจฐ เจฆเฉฑเจธเจฆเจพ เจนเฉˆ SMTP เจธเจฐเจตเจฐ

เจฎเฉ‹เจก="เจšเฉ‡เจคเจพเจตเจจเฉ€" เจ•เจนเจฟเฉฐเจฆเจพ เจนเฉˆ เจ•เจฟ เจฎเฉ‡เจฒเจฟเฉฐเจ— เจธเจฟเจฐเจซ เจคเจพเจ‚ เจนเฉ€ เจ•เฉ€เจคเฉ€ เจœเจพเจฃเฉ€ เจšเจพเจนเฉ€เจฆเฉ€ เจนเฉˆ เจœเฉ‡เจ•เจฐ เจ˜เฉฑเจŸเฉ‹ เจ˜เฉฑเจŸ เจ‡เฉฑเจ• เจ•เจฆเจฎ เจนเฉˆ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ-a, เจœเฉ‹ เจธเจฅเจฟเจคเฉ€ เจฆเฉ€ เจ…เจธเจซเจฒเจคเจพ เจœเจพเจ‚ เจšเฉ‡เจคเจพเจตเจจเฉ€ เจฆเฉ‡ เจจเจพเจฒ เจ–เจคเจฎ เจนเฉ‹เจ‡เจ†เฅค เจธเจซเจฒเจคเจพ เจฆเฉ‡ เจฎเจพเจฎเจฒเฉ‡ เจตเจฟเฉฑเจš, เจ‡เฉฑเจ• เจจเจฟเจŠเจœเจผเจฒเฉˆเจŸเจฐ เจญเฉ‡เจœเจฃ เจฆเฉ€ เจ•เฉ‹เจˆ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆ.

เจตเจพเจงเฉ‚ เจชเฉเจฐเจพเจชเจคเจ•เจฐเจคเจพ เจฎเจพเจฒเจ• เจ…เจคเฉ‡ เจ‰เจธ เจตเจฟเจ…เจ•เจคเฉ€ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ เจœเจฟเจจเฉเจนเจพเจ‚ เจจเฉ‚เฉฐ เจกเจพเจ• เจญเฉ‡เจœเฉ€ เจœเจพเจฃเฉ€ เจšเจพเจนเฉ€เจฆเฉ€ เจนเฉˆ เจ‰เจนเจจเจพเจ‚ เจฆเฉ€ เจธเฉ‚เจšเฉ€ เจธเจผเจพเจฎเจฒ เจ•เจฐเจฆเฉ€ เจนเฉˆ เจ•เจฎเจฟเจŸ เจ•เจฐเฉ‹.

เจธเฉเจจเฉ‡เจนเจพ เจซเจพเจฐเจฎเฉˆเจŸเจฐ เจ‡เฉฑเจ• เจตเจธเจคเฉ‚ เจนเฉˆ เจœเฉ‹ เจธเฉเจจเฉ‡เจนเจพ เจซเจพเจฐเจฎเฉˆเจŸ, เจ‡เจธเจฆเฉ‡ เจŸเฉˆเจ‚เจชเจฒเฉ‡เจŸ, เจ…เจคเฉ‡ เจ‡เจธ เจคเฉ‹เจ‚ เจ‰เจชเจฒเจฌเจง เจตเฉ‡เจฐเฉ€เจเจฌเจฒเจพเจ‚ เจฆเจพ เจ‡เฉฑเจ• เจธเฉˆเฉฑเจŸ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เจฐเจฆเฉ€ เจนเฉˆ jinja2. เจตเจฟเจ•เจฒเจช เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ wantProperties=เจธเฉฑเจšเจพ ะธ wantSteps=เจธเฉฑเจšเจพ เจ‰เจชเจฒเจฌเจง เจตเฉ‡เจฐเฉ€เจเจฌเจฒเจพเจ‚ เจฆเฉ‡ เจ‡เจธ เจธเฉˆเฉฑเจŸ เจจเฉ‚เฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เจฐเฉ‹เฅค

เจจเจพเจฒ['services']=[sendMessageToAll] เจธเฉ‡เจตเจพเจตเจพเจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจธเฉ‚เจšเฉ€ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆ, เจœเจฟเจธ เจตเจฟเฉฑเจš เจธเจพเจกเฉ€ เจนเฉ‹เจตเฉ‡เจ—เฉ€ เจฐเจฟเจชเฉ‹เจฐเจŸเจฐ.

เจ…เจธเฉ€เจ‚ เจ‡เจน เจ•เฉ€เจคเจพ! เจตเจงเจพเจˆเจ†เจ‚

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

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

เจคเฉเจนเจพเจกเฉ‡ เจงเจฟเจ†เจจ เจฒเจˆ เจธเจญ เจฆเจพ เจงเฉฐเจจเจตเจพเจฆเฅค เจ–เฉเจธเจผเจ•เจฟเจธเจฎเจคเฉ€.

เจธเจฐเฉ‹เจค: www.habr.com

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