Thực tiễn tốt nhất để triển khai đa môi trường bằng Jenkins


12

Tôi có 3 môi trường, mỗi môi trường trên Mạng ảo riêng với cấu hình riêng. Tôi có cần phải có 3 trường hợp riêng biệt của Jenkins nếu tôi thực hiện Triển khai liên tục trên mỗi môi trường không? Một số thực tiễn tốt nhất hối tiếc khi triển khai trên một kiến ​​trúc đa môi trường là gì?

Câu trả lời:


5

Đây là một câu hỏi rất hay vì nó là một mô hình chống phổ biến để kết hợp ci/cdcác công cụ với môi trường.

Jenkins là một nhà máy xây dựng. Như vậy, nó hoàn toàn không thể tin được về khái niệm môi trường, hoặc thậm chí là giao hàng.

Ưu tiên tốt nhất là có một số quy trình dàn dựng và / hoặc giao diện (nếu bạn có đủ khả năng: một phần mềm phân phối chuyên dụng).

Quá trình dàn dựng

Bạn nên cố gắng tạo một số loại công việc dàn cho từng môi trường, trong đó bạn sẽ xác định cấu hình của môi trường và gói gói cuối cùng với nó.

Tiếp theo bạn sẽ có công việc giao hàng cho từng môi trường.

Công cụ giao hàng

Để làm được tạo việc làm giai đoạn và giao hàng, bạn có thể sử dụng công cụ scripting rất cơ bản, như shell, nhưng có các công cụ scripting thích nghi hơn, như Ansible, puppet, chef...

Nếu bạn có thể đủ khả năng chi trả, bạn có thể xem xét đầu tư vào một phần mềm triển khai (tôi sẽ đề cập đến một số phần mà tôi đã làm việc trong phần bình luận).

Lưu ý rằng những phần mềm đó quản lý một số loại quy trình dàn dựng môi trường.

Rõ ràng, nó rất có ý nghĩa để kết hợp triển khai phần mềm và kịch bản.

Ngoài các công cụ và môi trường riêng biệt

Vì bạn đã yêu cầu thực hành tốt nhất, nên có vẻ như tôi nên đề cập đến một cách chống mẫu thường thấy khác: ghép các công cụ SCM và quy trình phân phối.

Đó là một cách thực hành rất tốt để lưu trữ cấu hình môi trường (tất nhiên không phải mật khẩu hoặc thông tin bí mật) và chuyển các tập lệnh trực tiếp trong các công cụ SCM (như svnhoặc git...). Tuy nhiên, đó là một thực tế rất tệ để kiểm tra cấu hình môi trường và phát các tập lệnh trực tiếp DURING the go live. Nó có thể đơn giản là không có sẵn khi bạn cần nó.

Giai đoạn trả phòng này nên là một phần của quy trình dàn dựng mà tôi đã đề cập trước đó.

Tiềm năng

Một cách thực hành tốt nhất là các tập lệnh của bạn phải là idem-potent: điều này có nghĩa là bạn sẽ có thể phát các tập lệnh của mình một lần để thực hiện việc dàn dựng và phân phối. Sau đó, bạn sẽ có thể chơi chúng nhiều lần và chúng sẽ không thay đổi trạng thái hệ thống của bạn trừ khi có gì đó bị cấu hình.

Thu nhỏ

Như một thực tiễn tốt nhất cuối cùng, tôi sẽ chia sẻ từ kinh nghiệm trực tiếp đang làm kinh ngạc Jenkins: các đội khác nhau có nhu cầu và cách sử dụng khác nhau của Jenkins. Khi quá nhiều nhóm chia sẻ một Jenkins chung, có thể có vấn đề với tài nguyên. Trường hợp xấu nhất là khi một đội yêu cầu khởi động lại chủ Jenkins trong khi một nhóm khác cần giao hàng.

Lý tưởng là có một Jenkins cho mỗi nhóm hoặc mỗi nhóm các nhóm có cùng mục tiêu và lập kế hoạch phân phối.


3

Tôi vừa mới chuyển từ việc có các công việc tự do của Jenkins và có một công việc riêng biệt cho từng môi trường để sử dụng các đường ống của Jenkins (cú pháp khai báo).

Trong các đường ống Jenkins, chúng tôi có một tệp duy nhất (Jenkinsfile) và xác định các giai đoạn khác nhau cho các môi trường khác nhau (Dev / Staging / Prod) và trong các giai đoạn đó, chúng tôi chỉ xác định hành vi khác nhau cho từng môi trường. Ví dụ: giai đoạn 'Triển khai' của chúng tôi, chúng tôi sẽ triển khai đến một không gian / cụm tên kubernetes khác tùy thuộc vào việc đó là môi trường phát triển hay dàn dựng.

Tôi thích cách tiếp cận này vì bạn chỉ có một Jenkinsfile cho mỗi dự án tồn tại trên tất cả các chi nhánh.


Làm thế nào để bạn làm cho nó triển khai một môi trường cụ thể sau đó? Hay bạn luôn luôn triển khai tất cả chúng cùng nhau?
lkraider

@lkraider cách chúng tôi làm điều này là sử dụng chiến lược phân nhánh tốt trong Đường ống Jenkins và kịch bản. Ví dụ, bạn có thể có tất cả các nhánh phát triển đi đến môi trường dev và tất cả các chủ hoặc bất kỳ nhánh nào khác đi đến giai đoạn hoặc prod. Sau đó, trong Jenkinsfile của bạn, bạn có thể sử dụng câu lệnh "Nếu" như "if (env.BRANCH_NAME == 'Develop')" hoặc "if (env.BRANCH_NAME == 'master')" trong giai đoạn đường ống của bạn. Hãy xem jenkins.io/doc/tutorials/build-a-multibranch-pipeline-project
Toye

2

Câu trả lời ngắn cho câu hỏi của bạn là không. Jenkins không cần phải nói chuyện với môi trường sản xuất của bạn nhưng điều đó có thể nếu bạn cần. Nói cách khác, nếu Jenkins có thể tiếp cận những môi trường này, nó có khả năng có thể tương tác với chúng.

Từ cách tiếp cận thực tiễn tốt nhất, thông thường tôi khuyên bạn nên sử dụng phần mềm sẽ giúp việc triển khai của bạn trở nên đơn giản và có thể lặp lại nhiều nhất có thể (ví dụ: Ansible, Terraform, Cloud Formation hoặc Kubernetes).

Đường ống có khả năng xử lý các mục tiêu song song có nghĩa là bạn có thể xây dựng và triển khai đến cả ba môi trường cùng một lúc nếu bạn chọn.

Bạn có thể muốn làm cho câu hỏi của bạn chính xác hơn hoặc chi tiết hơn để thu thập thêm thông tin phản hồi.


0

Chúng ta có thể sử dụng Jenkinsfile duy nhất cho các môi trường khác nhau. Nhưng chúng ta cần một cái gì đó để phân biệt giữa môi trường này, có thể là biến môi trường hoặc tham số trong công việc được tham số hóa để kiểm soát những gì chúng ta cần làm trong mỗi môi trường. Có thể chúng tôi muốn xây dựng, kiểm tra, thực hiện e2e và đẩy hình ảnh vào một kho lưu trữ trong một môi trường. Sau đó sử dụng cùng một hình ảnh và triển khai trong phần tiếp theo (dàn, có thể) và thực hiện kiểm tra khói. Sau đó sử dụng cùng một hình ảnh để triển khai vào sản xuất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.