2017-02-12 38 views
8

Tôi muốn triển khai một nền tảng tích hợp liên tục dựa trên Jenkins. Vì tôi có nhiều loại dự án khác nhau (PHP/Symfony, nút, góc cạnh,…) và khi tôi muốn các thử nghiệm này chạy cả cục bộ lẫn trên Jenkins, tôi đã nghĩ đến việc sử dụng các vùng chứa Dockers.Chạy thử nghiệm Jenkins trong vùng chứa Docker xây dựng từ dockerfile trong codebase

Quá trình Tôi đang nhắm đến là:

  • Yêu cầu hợp nhất được mở ra trên Github/Gitlab
  • Một webhook thông báo Jenkins được yêu cầu hợp nhất
  • Jenkins kéo repo, xây dựng các container và chạy một kịch bản lệnh shell để thực hiện các kiểm tra
  • Khi các thử nghiệm kết thúc, Jenkins lấy kết quả từ một trong các thùng chứa (thông qua một khối lượng dùng chung) và xử lý các kết quả.

Tôi không muốn Jenkins nằm trong thùng chứa.

Với loại quá trình này, tôi hy vọng có thể chạy rất dễ dàng các bài kiểm tra trên mỗi máy phát triển với một cái gì đó như một docker-composer up và sau đó trong một trong các container ./tests all.

Tôi không quen lắm với Jenkins. Tôi đã đọc rất nhiều tài liệu, nhưng hầu hết trong số họ gợi ý định nghĩa các nô lệ Jenkins cho từng loại dự án trước. Tôi muốn mọi thứ trở nên năng động nhất có thể và yêu cầu ít cấu hình trên Jenkins càng tốt.

Tôi sẽ đánh giá cao mô tả quy trình thử nghiệm của bạn nếu bạn đã từng triển khai điều gì đó tương tự. Nếu bạn nghĩ rằng những gì tôi đang hướng tới là không thể, tôi cũng sẽ đánh giá cao nếu bạn có thể giải thích cho tôi tại sao.

Trả lời

3

Thiết lập tôi đề xuất là Docker trong Docker.

Cơ sở là hình ảnh Docker có nguồn gốc, mở rộng hình ảnh jenkins:2.x bằng cách thêm ứng dụng dòng lệnh Docker. Các Jenkins được bắt đầu như một container với thư mục nhà của nó (một thư mục ví dụ/var/jenkins_home gắn từ Docker host) và Docker socket file để có thể bắt đầu Docker container từ Jenkins build jobs.

docker run -d --name jenkins -v /var/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock ... <yourDerivedJenkinsImage> 

Để kiểm tra, nếu thiết lập này đang làm việc chỉ thực hiện lệnh sau đây sau khi bắt đầu container Jenkins:

docker exec jenkins docker version 

Nếu "phiên bản Docker" đầu ra không KHÔNG show:

Trình nền tảng docker có chạy trên máy chủ này không?

Mọi thứ đều ổn.

Trong công việc xây dựng của bạn, bạn có thể định cấu hình quy trình bạn đã đề cập ở trên. Hãy để Jenkins chỉ cần kiểm tra kho lưu trữ. Kho lưu trữ phải chứa các tập lệnh xây dựng và thử nghiệm của bạn.

Sử dụng công việc tạo hình tự do có thực thi trình bao.Việc thực thi trình bao có thể trông giống như sau:

docker run --rm --volumes-from jenkins <yourImageToBuildAndTestTheProject> bash $WORKSPACE/<pathToYourProjectWithinTheGitRepository>/build.sh 

Lệnh này chỉ cần bắt đầu một thùng chứa mới (để xây dựng và/hoặc thử nghiệm dự án của bạn) với khối lượng từ jenkins. Điều đó có nghĩa là kho lưu trữ nhân bản sẽ có sẵn dưới $ WORKSPACE. Vì vậy, nếu bạn chạy "bash $ WORKSPACE/<pathToYourProjectWithinTheGitRepository> /build.sh" dự án của bạn sẽ được xây dựng trong một vùng chứa "yourImageToBuildAndTestTheProject". Sau khi chạy điều này, bạn có thể bắt đầu các thùng chứa khác để kiểm tra tích hợp hoặc kết hợp điều này với "docker-compose" bằng cách cài đặt nó trên hình ảnh Jenkins có nguồn gốc.

Ưu điểm là cấu hình tối thiểu mà bạn có trong Jenkins - chỉ cấu hình SCM để nhân bản kho lưu trữ GIT là bắt buộc. Vì mỗi công việc Jenkins sử dụng trình khách Docker trực tiếp, bạn có thể sử dụng cho từng dự án một hoặc hình ảnh Docker để xây dựng và/hoặc kiểm tra, cấu hình Jenkins thêm WITHOUT.

Nếu bạn cần cấu hình bổ sung, ví dụ: Khóa SSH hoặc cài đặt Maven, chỉ cần đặt chúng trên máy chủ Docker và khởi động thùng chứa Jenkins với khối lượng bổ sung, chứa các tệp cấu hình đó.

Sử dụng tùy chọn Docker này trong thời hạn thực hiện hợp đồng xây dựng vỏ công việc của bạn:

--volumes-from jenkins 

Tự động thêm không gian làm việc và cấu hình file cho mỗi hợp đồng xây dựng công việc của bạn.

Các vấn đề liên quan