Một ví dụ về triển khai Tích hợp liên tục bằng BuildBot

Một ví dụ về triển khai Tích hợp liên tục bằng BuildBot
(Ảnh của Máy vi tính từ Pixabay)

Hi!

Tên tôi là Evgeniy Cherkin, Tôi là lập trình viên trong nhóm phát triển tại một công ty khai thác mỏ Đa hình.

Khi bắt đầu bất kỳ dự án lớn nào, bạn bắt đầu nghĩ: “Sử dụng phần mềm nào là tốt nhất để phục vụ dự án đó?” Một dự án CNTT trải qua một số giai đoạn trước khi phát hành phiên bản tiếp theo. Thật tốt khi chuỗi các công đoạn này được tự động hóa. Quá trình tự động phát hành phiên bản mới của dự án CNTT được gọi là Hội nhập liên tục. BuildBot hóa ra lại là trợ thủ đắc lực cho chúng tôi trong việc thực hiện quá trình này.

Trong bài viết này tôi quyết định cung cấp một cái nhìn tổng quan về các khả năng BuildBot. Phần mềm này có khả năng gì? Làm thế nào để tiếp cận anh ấy và làm thế nào để xây dựng MỐI QUAN HỆ LÀM VIỆC HIỆU QUẢ bình thường với anh ấy? Bạn có thể tự mình áp dụng kinh nghiệm của chúng tôi bằng cách tạo một dịch vụ hoạt động để xây dựng và thử nghiệm dự án trên máy của bạn.

nội dung

nội dung

1. Tại sao lại là BuildBot?
2. Concept dẫn dắt bởi BuildMaster
3. Cài đặt
4. Những bước đầu tiên

5. Cấu hình. Công thức từng bước

5.1 BuildmasterConfig
công nhân 5.2
5.3 thay đổi_nguồn
5.4 bộ lập lịch

5.5 Nhà máy xây dựng
5.6 nhà xây dựng

6. Ví dụ về cấu hình của riêng bạn

6.1 Trên đường tới master.cfg của bạn
6.2 Làm việc với svn
6.3 Thư gửi bạn: phóng viên được quyền khai báo

Chúng ta làm được rồi! Chúc mừng

1. Tại sao lại là BuildBot?

Trước đây trên habr-e tôi đã xem qua các bài viết về việc triển khai Hội nhập liên tục sử dụng BuildBot. Ví dụ, Cái này Tôi thấy nó có nhiều thông tin nhất. Có một ví dụ khác - đơn giản hơn. Những bài viết này có thể được dày dạn ví dụ từ hướng dẫnnày sau đó, bằng tiếng Anh. Chiếc coupe tạo nên một điểm khởi đầu tốt. Sau khi đọc những bài viết này, có thể bạn sẽ ngay lập tức muốn thứ gì đó trên BuildBot làm.

Dừng lại! Có ai thực sự sử dụng nó trong các dự án của họ? Hóa ra là có nhiều đã áp dụng nó vào công việc của mình. Có thể được tìm thấy ví dụ sử dụng BuildBot và trong kho lưu trữ mã của Google.

Vậy logic của việc mọi người sử dụng là gì Buildbot? Rốt cuộc, có những công cụ khác: Kiểm soát hành trình и Jenkins. Tôi sẽ trả lời theo cách này. Đối với hầu hết các nhiệm vụ Jenkins và sự thật sẽ là đủ. Đến lượt nó, BuildBot - thích ứng hơn, trong khi các vấn đề được giải quyết ở đó đơn giản như trong Jenkins. Sự lựa chọn là của bạn. Nhưng vì chúng tôi đang tìm kiếm một công cụ cho một dự án mục tiêu đang phát triển, tại sao không chọn một công cụ cho phép, bắt đầu từ các bước đơn giản, có được một hệ thống xây dựng có khả năng tương tác và giao diện độc đáo.

Đối với những người có dự án mục tiêu được viết bằng python, câu hỏi đặt ra là: “Tại sao không chọn một hệ thống tích hợp có giao diện rõ ràng về ngôn ngữ được sử dụng trong dự án?” Và bây giờ là lúc trình bày những lợi ích BuildBot.

Vì vậy, “bộ tứ nhạc cụ” của chúng tôi. Đối với bản thân tôi, tôi đã xác định được bốn đặc điểm BuildBot:

  1. Nó là một framework mã nguồn mở theo giấy phép GPL
  2. Đây là việc sử dụng python làm công cụ cấu hình và mô tả các hành động cần thiết
  3. Đây là cơ hội để nhận được phản hồi từ máy nơi quá trình lắp ráp diễn ra
  4. Cuối cùng, đây là những yêu cầu tối thiểu đối với Máy chủ. Việc triển khai yêu cầu python và twist, đồng thời không yêu cầu máy ảo và máy java.

2. Concept dẫn dắt bởi BuildMaster

Một ví dụ về triển khai Tích hợp liên tục bằng BuildBot

Trọng tâm của kiến ​​trúc phân phối nhiệm vụ là BuildMaster. Đó là một dịch vụ:

  • theo dõi những thay đổi trong cây nguồn dự án
  • gửi các lệnh cần được thực thi bởi dịch vụ Worker để xây dựng dự án và kiểm tra nó
  • thông báo người dùng về kết quả của hành động được thực hiện

BuildMaster được cấu hình qua tập tin master.cfg. Tập tin này nằm trong thư mục gốc BuildMaster. Sau này tôi sẽ chỉ ra cách tạo root này. Bản thân tập tin master.cfg chứa tập lệnh python sử dụng các cuộc gọi BuildBot.

Đối tượng quan trọng nhất tiếp theo BuildBot Nó có một cái tên Công nhân. Dịch vụ này có thể được khởi chạy trên một máy chủ khác có hệ điều hành khác hoặc có thể trên máy chủ có hệ điều hành khác. BuildMaster. Nó cũng có thể tồn tại trong một môi trường ảo được chuẩn bị đặc biệt với các gói và biến riêng. Những môi trường ảo này có thể được chuẩn bị bằng các tiện ích python như ảoenv, venv.

BuildMaster truyền lệnh tới mọi người Công nhân-y, và đến lượt anh ấy, hoàn thành chúng. Nghĩa là, hóa ra quá trình xây dựng và thử nghiệm một dự án có thể tiếp tục Công nhân-e chạy Windows và trên một Worker khác chạy Linux.

Thủ tục thanh toán mã nguồn dự án xuất hiện trên mỗi Công nhân-e.

3. Cài đặt

Vì vậy, hãy đi thôi. Tôi sẽ sử dụng Ubuntu 18.04 làm máy chủ. Tôi sẽ đặt một cái lên đó BuildMaster-a và một Công nhân-Một. Nhưng trước tiên bạn cần cài đặt python3.7:

sudo apt-get update
sudo apt-get install python3.7

Đối với những người cần python3.7.2 thay vì 3.7.1, bạn có thể làm như sau:


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

Bước tiếp theo là cài đặt Đã tweet и BuildBot, cũng như các gói cho phép bạn sử dụng chức năng bổ sung BuildBot-Một.


/*Все что под 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. Những bước đầu tiên

Thời gian để tạo BuildMaster. Nó sẽ ở trong thư mục của chúng tôi /home/habr/master.

mkdir master
buildbot create-master master # Собственно сдесь и создаем

Bước tiếp theo. Hãy tạo ra Công nhân. Nó sẽ ở trong thư mục của chúng tôi /nhà/thợ làm/công nhân.

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

Khi bạn chạy Công nhân, thì theo mặc định nó sẽ tạo trong /nhà/thợ làm/công nhân thư mục có tên của dự án, được chỉ định trong master.cfg. Và trong thư mục có tên project nó sẽ tạo một thư mục xây dựng, và sẽ tiếp tục làm điều đó thanh toán. Thư mục làm việc cho Công nhân-và nó sẽ trở thành một thư mục /home/habr/yourProject/build.

"Chìa khóa vàng
Và bây giờ nội dung tôi đã viết ở đoạn trước: một kịch bản Bậc thầy sẽ yêu cầu từ Công nhân-và thực hiện từ xa trong thư mục này sẽ không được thực thi vì tập lệnh không có quyền chạy. Để khắc phục tình trạng này, bạn sẽ cần một chìa khóa --umask=0o22, cấm ghi vào thư mục này nhưng sẽ giữ quyền khởi chạy. Và đó là tất cả những gì chúng ta cần.

BuildMaster и Công nhân thiết lập mối liên hệ với nhau. Nó xảy ra rằng nó vỡ ra và Công nhân chờ đợi một thời gian để nhận được phản hồi từ BuildMaster-MỘT. Nếu không có phản hồi, kết nối sẽ được khởi động lại. Chìa khóa --keepalive=60 chỉ cần chỉ ra thời gian sau đó kết nối khởi động lại.

5. Cấu hình. Công thức từng bước

Cấu hình BuildMaster được thực hiện ở phía bên của máy nơi chúng tôi thực hiện lệnh tạo-chủ. Trong trường hợp của chúng tôi, đây là một thư mục /home/habr/master. Tập tin cấu hình master.cfg chưa tồn tại, nhưng bản thân lệnh đã tạo tệp master.cmg.sample. Bạn cần đổi tên nó thành master.cfg.sample в master.cfg

mv master.cfg.sample master.cfg

Hãy mở cái này master.cfg. Và hãy xem nó bao gồm những gì. Và sau đó, hãy thử tạo tệp cấu hình của riêng chúng ta.

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 — từ điển cơ bản của tập tin cấu hình. Nó phải được bao gồm trong tập tin cấu hình. Để dễ sử dụng, bí danh được giới thiệu trong mã cấu hình "c". Tiêu đề chìa khóa в c["keyFromDist"] là các phần tử cố định để tương tác với BuildMaster. Đối với mỗi khóa, đối tượng tương ứng được thay thế làm giá trị.

công nhân 5.2

c['workers'] = [worker.Worker("example-worker", "pass")]

Lần này chúng tôi chỉ ra BuildMaster-y danh sách Công nhân-S. Riêng tôi Công nhân chúng tôi tạo ra trên đây, chỉ ra bạn-công nhân-tên и mật khẩu. Bây giờ họ cần phải được chỉ định thay thế công nhân mẫu mực и vượt qua .

5.3 thay đổi_nguồn

c['change_source'] = []
c['change_source'].append(changes.GitPoller(
                            'git://github.com/buildbot/hello-world.git',
                             workdir='gitpoller-workdir', branch='master',
                             pollInterval=300))                

Bằng phím thay đổi nguồn từ điển c, chúng tôi có quyền truy cập vào danh sách nơi chúng tôi muốn đặt một đối tượng thăm dò kho lưu trữ bằng mã nguồn của dự án. Ví dụ này sử dụng kho lưu trữ Git được thăm dò theo các khoảng thời gian nhất định.

Đối số đầu tiên là đường dẫn đến kho lưu trữ của bạn.

thư ký làm việc đại diện cho đường dẫn đến thư mục ở bên cạnh Công nhân-a liên quan đến đường dẫn /home/habr/worker/yourProject/build git sẽ lưu trữ phiên bản cục bộ của kho lưu trữ.

địa điể̀m chọn lựa chứa một nhánh cụ thể trong kho lưu trữ cần được theo dõi.

Khoảng thăm dò chứa số giây sau đó BuildMaster sẽ thăm dò kho lưu trữ để thay đổi.

Có một số phương pháp để theo dõi các thay đổi đối với kho lưu trữ của dự án.

Phương pháp đơn giản nhất là Bỏ phiếu, ngụ ý rằng BuildMaster thăm dò định kỳ máy chủ với kho lưu trữ. Nếu như cam kết phản ánh những thay đổi trong kho lưu trữ, sau đó BuildMaster sẽ tạo một đối tượng bên trong với một chút độ trễ Thay đổi và gửi nó đến người xử lý sự kiện Scheduler, sẽ khởi động các bước xây dựng và thử nghiệm dự án trên Công nhân-e. Trong số các bước này sẽ được chỉ định cập nhật kho. Chính xác là vào Công nhânĐiều này sẽ tạo một bản sao cục bộ của kho lưu trữ. Chi tiết của quá trình này sẽ được trình bày bên dưới trong hai phần tiếp theo. (5.4 и 5.5).

Một phương pháp thậm chí còn tinh tế hơn để theo dõi các thay đổi đối với kho lưu trữ là gửi tin nhắn trực tiếp từ máy chủ lưu trữ nó tới BuildMaster- về việc thay đổi mã nguồn dự án. Trong trường hợp này, ngay khi nhà phát triển thực hiện cam kết, máy chủ chứa kho dự án sẽ gửi tin nhắn BuildMaster-y. Và đến lượt anh ta sẽ chặn nó bằng cách tạo ra một vật thể Nguồn PBChange. Tiếp theo, đối tượng này sẽ được chuyển tới Scheduler, kích hoạt các bước để xây dựng dự án và thử nghiệm nó. Một phần quan trọng của phương pháp này là làm việc với móc-server script trong kho lưu trữ. Trong kịch bản móc-a, chịu trách nhiệm xử lý các hành động khi cam kết-e, bạn cần gọi tiện ích sự trao đổi và chỉ định địa chỉ mạng BuildMaster-MỘT. Bạn cũng cần chỉ định cổng mạng sẽ lắng nghe Nguồn PBChange. Nguồn PBChange, nhân tiện, là một phần BuildMaster-MỘT. Phương pháp này sẽ yêu cầu sự cho phép quản trị viên-a trên máy chủ nơi chứa kho lưu trữ dự án. Trước tiên bạn sẽ cần tạo một bản sao lưu của kho lưu trữ.

5.4 bộ lập lịch


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

lịch trình – đây là yếu tố đóng vai trò là yếu tố kích hoạt bắt đầu toàn bộ chuỗi lắp ráp và thử nghiệm của dự án.
Một ví dụ về triển khai Tích hợp liên tục bằng BuildBot

Những thay đổi đó được ghi lại thay đổi nguồn, biến đổi trong quá trình làm việc BuildBot-a để phản đối Thay đổi và bây giờ mỗi máy cạo râu dựa trên chúng, nó xây dựng các yêu cầu để bắt đầu quá trình xây dựng dự án. Tuy nhiên, nó cũng xác định thời điểm các yêu cầu này được chuyển tiếp vào hàng đợi. Một đối tượng Xây dựng lưu trữ một hàng đợi các yêu cầu và theo dõi trạng thái của tập hợp hiện tại trên một ngăn riêng biệt Công nhân-và. Xây dựng tồn tại trên BuildMaster-e và tiếp tục Công nhân-e. Anh ấy gửi với BuildMaster-a trên Công nhân-và đã cụ thể rồi xây dựng - một loạt các bước phải được tuân theo.
Chúng ta thấy rằng trong ví dụ hiện tại như vậy lịch trình 2 mảnh được tạo ra. Hơn nữa, mỗi loại đều có loại riêng.

Trình lập lịch đơn nhánh – một trong những lớp học phổ biến nhất trong lịch trình. Nó theo dõi một nhánh và được kích hoạt bởi một thay đổi được ghi lại trong nhánh đó. Khi thấy các thay đổi, anh ta có thể trì hoãn việc gửi yêu cầu xây dựng (hoãn lại trong khoảng thời gian được chỉ định trong tham số đặc biệt câyỔn địnhHẹn giờ). TRONG tên đặt tên của lịch trình sẽ được hiển thị trong BuildBot-giao diện web. TRONG Thay đổi bộ lọc một bộ lọc được thiết lập, sau khi vượt qua những thay đổi nào trong nhánh sẽ nhắc lịch gửi yêu cầu xây dựng. TRONG tên người xây dựng tên được chỉ định xây dựng-a, chúng ta sẽ thiết lập sau. Tên trong trường hợp của chúng tôi sẽ giống với tên dự án: dự án của bạn.

Trình lập lịch bắt buộc một điều rất đơn giản. Loại lịch trình này được kích hoạt bằng một cú click chuột qua BuildBot-giao diện web. Các tham số có cùng bản chất như trong Trình lập lịch đơn nhánh.

PS số 3. Có lẽ nó sẽ có ích
Định kỳ là một lịch trình chạy với tần suất cố định theo thời gian nhất định. Cuộc gọi trông giống như thế này


from buildbot.plugins import schedulers
nightly = schedulers.Periodic(name="daily",
                              builderNames=["full-solaris"],
                              periodicBuildTimer=24*60*60)
c['schedulers'] = [nightly]                    

5.5 Nhà máy xây dựng


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": "."}))

định kỳBuildTimer chỉ định thời gian của chu kỳ này tính bằng giây.

Xây dựngNhà máy tạo ra một cái cụ thể xây dựng, sau đó xây dựng gửi tới Công nhân. Trong Xây dựngNhà máy nêu các bước cần thực hiện Công nhân-y. Các bước được thêm vào bằng cách gọi phương thức thêm bước

Bước bổ sung đầu tiên trong ví dụ này là git sạch -d -f -f –x, sau đó thanh toán git. Những hành động này được bao gồm trong tham số phương pháp, không được nêu rõ ràng nhưng hàm ý một giá trị mặc định tươi... Tham số chế độ='gia tăng' chỉ ra rằng các tập tin đến từ thư mục chứa chechout, mặc dù bị thiếu trong kho lưu trữ nhưng vẫn còn nguyên.

Bước bổ sung thứ hai là gọi tập lệnh thử nghiệm với tham số xin chào ở bên Công nhân-a từ thư mục /home/habr/worker/yourProject/build với biến môi trường PATHONPATH=... Do đó, bạn có thể viết các tập lệnh của riêng mình và thực thi chúng ở bên cạnh Công nhân-a mỗi bước util.ShellCommand. Các tập lệnh này có thể được đặt trực tiếp vào kho lưu trữ. Sau đó tại chechout-e họ sẽ rơi vào /home/habr/worker/yourProject/build. Tuy nhiên, sau đó có hai chữ “nhưng”:

  1. Công nhân phải được tạo bằng khóa --umask để nó không chặn quyền thực thi sau thanh toán-Một.
  2. Khi đẩy git-e của các tập lệnh này bạn cần chỉ định thuộc tính có thể hành quyết đượcđể sau này chechout-e không mất quyền thực thi tập lệnh Git.

5.6 nhà xây dựng


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

về cái gì Xây dựng đã nói đây. Bây giờ tôi sẽ cho bạn biết chi tiết hơn về cách tạo ra nó. BuilderConfig là một nhà xây dựng xây dựng. Những nhà thiết kế như vậy ở c['người xây dựng'] bạn có thể chỉ định một số vì đây là một bảng các đối tượng xây dựng kiểu. Bây giờ hãy viết lại ví dụ từ BuildBot, đưa nó đến gần hơn với nhiệm vụ của chúng tôi.


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

Bây giờ tôi sẽ cho bạn biết về các thông số BuilderConfig.

tên chỉ định tên xây dựng-Một. Ở đây chúng tôi đặt tên cho nó dự án của bạn... Điều này có nghĩa là trên Công nhân- chính con đường này sẽ được tạo ra /home/habr/worker/yourProject/build. máy cạo râu tìm kiếm xây dựng chỉ bằng cái tên này.

tên công nhân chứa tờ Công nhân-S. Mỗi thứ đó phải được thêm vào c['công nhân'].

nhà máy - cụ thể xây dựng, mà nó được liên kết xây dựng. Anh ta sẽ gửi đồ vật xây dựng trên Công nhân để hoàn thành tất cả các bước có trong này xây dựng-Một.

6. Ví dụ về cấu hình của riêng bạn

Đây là kiến ​​trúc dự án mẫu mà tôi đề xuất triển khai thông qua BuildBot
.

Chúng tôi sẽ sử dụng làm hệ thống kiểm soát phiên bản svn. Bản thân kho lưu trữ sẽ được đặt trong một loại đám mây nào đó. Đây là địa chỉ của đám mây này svn.host/svn/yourProject/trunk. Trong đám mây bên dưới svn có một tên người dùng tài khoản: người sử dụng, mật khẩu: mật khẩu. Các tập lệnh đại diện cho các bước xây dựng-a cũng sẽ ở trong nhánh svn, trong một thư mục riêng buildbot/worker_linux. Các tập lệnh này được đặt trong kho lưu trữ với thuộc tính đã lưu thực thi được.

BuildMaster и Công nhân chạy trên cùng một máy chủ dự án.host .BuildMaster lưu trữ các tập tin của nó trong một thư mục /home/habr/master. Công nhân nó được lưu trữ trong đường dẫn sau /nhà/thợ làm/công nhân. Quá trình giao tiếp BuildMaster-a và Công nhân-a được thực hiện qua cổng 4000 theo giao thức BuildBot-a, đó là 'pb' giao thức.

Dự án mục tiêu được viết hoàn toàn bằng Python. Nhiệm vụ là theo dõi các thay đổi của nó, tạo tệp thực thi, tạo tài liệu và tiến hành kiểm tra. Trong trường hợp thất bại, tất cả các nhà phát triển cần gửi thông báo qua email cho biết có một hành động không thành công.

Hiển thị web BuildBot chúng tôi sẽ kết nối với cổng 80 để dự án.host. Không cần thiết phải cài đặt Apache. Là một phần của thư viện xoắn đã có một máy chủ web, BuildBot sử dụng nó.

Để lưu trữ thông tin nội bộ cho BuildBot chúng tôi sẽ sử dụng sqlite.

Cần có máy chủ để gửi thư smtp.your.domain - nó cho phép gửi thư từ thư [email được bảo vệ] không có xác thực. Ngoài ra trên máy chủ 'smtp ' Biên bản đang được nghe ở bưu điện 1025.

Có hai người tham gia vào quá trình này: quản trị viên и người sử dụng. quản trị viên quản trị BuildBot. người dùng là người cam kết cam kết-S.

Tệp thực thi được tạo thông qua trình cài đặt py. Tài liệu được tạo thông qua khí oxy.

Đối với kiến ​​trúc này tôi đã viết điều này: 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"
}

Đầu tiên bạn cần để tạo BuildMaster-a và Công nhân-Một. Sau đó dán tập tin này master.cfg в /home/habr/master.

Bước tiếp theo là bắt đầu dịch vụ BuildMasteraa


sudo buildbot start /home/habr/master

Sau đó bắt đầu dịch vụ Công nhân-a


buildbot-worker start /home/habr/worker

Sẵn sàng! Hiện nay Buildbot sẽ theo dõi những thay đổi và kích hoạt cam kết-y trong svn, thực hiện các bước xây dựng và thử nghiệm một dự án với kiến ​​trúc trên.

Dưới đây tôi sẽ mô tả một số tính năng của các điều trên chính chủ.cfg.

6.1 Trên đường tới master.cfg của bạn


Trong khi viết của tôi master.cfg Sẽ có nhiều lỗi xảy ra nên việc đọc tệp nhật ký sẽ được yêu cầu. Nó được lưu trữ dưới dạng BuildMaster-ec đường dẫn tuyệt đối /home/habr/master/twistd.log, và ở bên cạnh Công nhân-a với đường dẫn tuyệt đối /home/habr/worker/twistd.log. Khi bạn đọc lỗi và sửa nó, bạn sẽ cần phải khởi động lại dịch vụ BuildMaster-Một. Đây là cách nó được thực hiện:


sudo buildbot stop /home/habr/master
sudo buildbot upgrade-master /home/habr/master
sudo buildbot start /home/habr/master

6.2 Làm việc với 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)

Để bắt đầu, chúng ta hãy xem svn_poller. Đây vẫn là giao diện cũ, thường xuyên thăm dò kho lưu trữ mỗi phút một lần. Trong trường hợp này svn_poller chỉ truy cập vào chi nhánh thân cây. Thông số bí ẩn Split_file=util.svn.split_file_alwaystrunk đặt ra các quy tắc: cách chia nhỏ cấu trúc thư mục svn trên cành. Ông cũng cung cấp cho họ những con đường tương đối. Đến lượt nó chia_file_alwaystrunk đơn giản hóa quy trình bằng cách nói rằng kho lưu trữ chỉ chứa thân cây.

В Lập lịch chỉ ra Thay đổi bộ lọcai thấy Không áp dụng và liên kết một chi nhánh với nó thân cây theo một hiệp hội nhất định thông qua chia_file_alwaystrunk. Đáp lại những thay đổi trong thân cây, Ra mắt xây dựng với tên dự án của bạn.

tài sản ở đây cần thiết để quản trị viên nhận được danh sách gửi thư về kết quả xây dựng và thử nghiệm với tư cách là chủ sở hữu của quy trình.

Bươc xây dựng-a thanh toán có khả năng xóa hoàn toàn mọi tệp nằm trong phiên bản cục bộ của kho lưu trữ Công nhân-MỘT. Và sau đó làm đầy đủ cập nhật svn. Chế độ được cấu hình thông qua tham số chế độ=đầy đủ, phương thức=tươi... Tham số tạm dừngOnTailure nói rằng nếu cập nhật svn sẽ được thực thi với lỗi, khi đó toàn bộ quá trình xây dựng và thử nghiệm sẽ bị tạm dừng vì các hành động tiếp theo không có ý nghĩa.

6.3 Thư gửi bạn: phóng viên được quyền khai báo


phóng viên là dịch vụ gửi thông báo qua email.


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]

Anh ấy có thể gửi tin nhắn những cách khác.

Trình thông báo thư sử dụng email để gửi thông báo.

mẫu_html đặt mẫu văn bản cho bản tin. HTML được sử dụng để tạo đánh dấu. Nó được sửa đổi bởi động cơ jinja2 (có thể so sánh với django). BuildBot có một tập hợp các biến có giá trị được thay thế vào mẫu trong quá trình tạo văn bản tin nhắn. Các biến này được đặt trong {{ dấu ngoặc nhọn đôi }}. Ví dụ, tóm tắt hiển thị trạng thái của các hoạt động đã hoàn thành, nghĩa là thành công hay thất bại. MỘT dự án sẽ xuất ra dự án của bạn. Vì vậy, việc sử dụng các lệnh điều khiển trong jinja2, biến BuildBot-a và các công cụ định dạng chuỗi python, bạn có thể tạo một thông báo khá nhiều thông tin.

Trình thông báo thư chứa các đối số sau đây.

từaddr – địa chỉ mà mọi người sẽ nhận được bản tin.

sendToInterestedNgười dùng=True gửi tin nhắn tới chủ sở hữu và người dùng đã thực hiện cam kết.

tra cứu — một hậu tố phải được thêm vào tên của người dùng nhận bản tin. Vì thế quản trị viên người dùng sẽ nhận được bản tin tại địa chỉ như thế nào [email được bảo vệ].

máy chủ chuyển tiếp chỉ định tên máy chủ mà máy chủ được mở smtp, Một smptPort chỉ định số cổng nghe smtp máy chủ.

chế độ="cảnh báo" nói rằng việc gửi thư chỉ nên được thực hiện nếu có ít nhất một bước xây dựng-a, kết thúc bằng trạng thái lỗi hoặc cảnh báo. Trong trường hợp thành công, không cần phải gửi bản tin.

người nhận thêm chứa danh sách những người sẽ được gửi thư ngoài chủ sở hữu và người thực hiện việc gửi thư. cam kết.

tin nhắnFormatter là một đối tượng chỉ định định dạng thông báo, mẫu của nó và một tập hợp các biến có sẵn từ jinja2. Các tùy chọn như wantProperties=Đúng и muốnSteps=Đúng xác định tập hợp các biến có sẵn này.

với['services']=[sendMessageToAll] cung cấp một danh sách các dịch vụ, trong đó dịch vụ của chúng tôi sẽ phóng viên.

Chúng ta làm được rồi! Chúc mừng

Chúng tôi đã tạo cấu hình của riêng mình và thấy chức năng mà nó có thể thực hiện được. BuildBot. Tôi nghĩ điều này là đủ để hiểu liệu công cụ này có cần thiết để tạo dự án của bạn hay không. Bạn có quan tâm đến anh ấy không? Nó sẽ hữu ích cho bạn chứ? Anh ấy có thoải mái khi làm việc cùng không? Vậy thì tôi không viết bài này một cách vô ích.

Và xa hơn. Tôi muốn cộng đồng chuyên nghiệp sử dụng BuildBot, trở nên rộng hơn, sách hướng dẫn được dịch và thậm chí còn có nhiều ví dụ hơn.

Cảm ơn tất cả các bạn đã quan tâm. Chúc may mắn.

Nguồn: www.habr.com

Thêm một lời nhận xét