Jenkins, một automation server được viết bằng Java, có lẽ là được dùng nhiều nhất bởi các enterprise để thực thi continuous integration (CI). Với kiến trúc mở rộng bằng plugin, cơ chế distributed build và dễ cấu hình thông qua Web UI, Jenkins rất được ưa chuộng và hầu như có thể được dùng cho mọi loại project.
Cài đặt Jenkins trên localhost
Jenkins có thể cài đặt trên hệ điều hành khác nhau. Tuy nhiên, trong bài viết này chúng ta sẽ sử dụng các Linux distro (chẳng hạn Ubuntu hay Fedora) như một ví dụ.
- Cài đặt JDK 8 hoặc 11. Tùy thuộc vào hệ điều hành sẽ có cách cài khác nhau, ví dụ trên Ubuntu 18.04:
$ sudo apt update $ sudo apt install openjdk-11-jdk-headless
- Tải Apache Tomcat và giải nén nó vào một thư mục nào đó.
- Tải jenkins.war (phiên bản LTS) về máy và chuyển nó vào thư mục
webapps/của tomcat. - Di chuyển vào thư mục
bin/của tomcat, chạy lệnh./startup.shđể khởi động tomcat. - Mở trình duyệt và gõ
http://localhost:8080/jenkinsvào thanh địa chỉ để khởi động Jenkins. - Sau khi Jenkins khởi động hoàn tất, màn hình Unlock Jenkins sẽ xuất hiện. Sao chép password như hướng dẫn trên màn hình và dán vào Administrator password để đi đến bước kế tiếp.
- Sau khi unlock, sẽ đến bước cài đặt các plugin. Click vào Install suggested plugins.
- Sau khi cài đặt các plugin hoàn tất, sẽ đến bước Create First Admin User. Cái này có thể điền tùy thích, chẳng hạn:
- Username:
admin - Password:
admin - Full name:
ADMIN - Email address:
admin@example.com
- Username:
- Bước cuối cùng để mặc định. Quá trình cài đặt hoàn tất.
Tạo một job và thực hiện một build
Bây giờ hãy làm quen với Jenkins bằng cách tạo một job. Job được cấu hình với các step cần phải chạy trong quá trình build. Trên Jenkins có nhiều loại job, tuy nhiên chúng ta sẽ bắt đầu với Freestyle job, mà là phổ biến và được sử dụng nhiều nhất trên Jenkins.
Tại màn hình trang chủ của Jenkins, click vào New Item để tạo một job mới:
- Đặt tên cho job mới là
Demo. - Chọn Freestyle project và click OK.
Sau khi tạo job thành công, chúng ta sẽ được redirect tới trang config cho job. Ở đây có khá nhiều config option, tuy nhiên ở đây sẽ bắt đầu với một Build step và một Post-build action đơn giản:
- Kéo xuống phần Build, click vào Add build step và chọn Execute shell.
- Điền vào đoạn script sau:
printenv | sort
- Tại phần Post-build actions, click Add post-build action và chọn Delete workspace when build is done.
- Click Save và chúng ta sẽ được redirect về status page của job. Tại đây click Build Now. Một build mới sẽ được thực hiện và xuất hiện trong phần Build history.
- Click vào build đầu tiền vừa được chạy và chọn Console Output, chúng ta sẽ thấy toàn bộ output của build.
Phần chính của một build chính là các build step, là bất kì tác vụ nào mà chúng ta muốn thực hiện. Ở trên chúng ta đã thực thi một shell script mà in ra các biến môi trường. Sau khi các build step hoàn tất, dù success hay fail, một post-build action sẽ luôn được chạy để thực hiện các tác vụ như cleanup, record test results, archive artifacts, v.v. Ở trên chúng ta đã xóa workspace (là nơi chứa toàn bộ dữ liệu cần thiết trong quá trình build) sau khi build.
Một chú ý quan trọng khác, đó là một vài biến môi trường mà Jenkins cung cấp sẵn cho chúng ta trong mọi shell session trong quá trình build. Một số biến có thể kể đến là:
JENKINS_URLJENKINS_HOME(thư mục chứa toàn bộ các dữ liệu của Jenkins (configuration files, jobs, builds, v.v.))BUILD_URLBUILD_NUMBERJOB_URLJOB_NAMEWORKSPACE(thư mục có chứa toàn bộ dữ liệu cần thiết trong quá trình build)
Các biến này có thể dễ dàng được xem trong phần console output của build vừa được thực hiện.
Ngoài ra, Jenkins có một hệ thống built-in help khá tiện dụng trong các phần config. Click vào icon help (dấu ?) bên cạnh một config option để biết thêm thông tin về nó. Bằng cách này, chúng ta có thể tìm hiểu thêm các config option khác của một job một cách dễ dàng.
Tạo một slave và thực hiện một distributed build
Để có thể thực hiện một distributed build, chúng ta cần một slave (hay agent). Có thể làm như sau trên localhost:
- Cài đặt một máy ảo Linux distro (ví dụ Ubuntu) sử dụng VirtualBox. Máy ảo này sẽ đóng vai trò như slave. Chú ý là cần setup máy ảo với username giống như máy host và cũng cần phải đảm bảo nó được cài đặt JDK (cùng version với máy host Jenkins) và SSH.
- Setup static IP cho máy ảo vừa được cài đặt (xem tại đây) để nó có thể ping được từ máy host.
- Trên máy host (máy chạy Jenkins), tạo ssh private/public key (nếu chưa có) với lệnh
ssh-keygenvà sau đó copy public key vào máy slave với lệnhssh-copy-id guest-static-ip(ví dụssh-copy-id 192.168.56.100). - Tại Jenkins Dashboard, vào Manage Jenkins -> Manage Nodes -> New Node để tạo một slave mới. Đặt tên cho nó, ví dụ
slave1. Sau đó tới trang config cho slave, điền vào các thông tin sau (click vào icon help bên cạnh config option để hiểu rõ hơn về nó):- Remote root directory: ví dụ
/home/username/jenkins(thayusernamebằng username của máy host đang chạy Jenkins). - Labels: ví dụ
slave(nếu có nhiều label thì các label này cách nhau bằng khoảng trắng). - Host:
guest-static-ip(ví dụ192.168.56.100). - Credentials: Click chọn Add để add một credential.
- Ở mục Kind, chọn SSH username with private key.
- Ở mục Username, điền username là username của máy host đang chạy Jenkins.
- Và ở mục Private key, copy private key từ máy host (
cat ~/.ssh/id_rsa | xclip -selection clipboard) và paste vào. - Click Add để hoàn tất.
Sau đó chọn credential vừa được add và click Save.
- Remote root directory: ví dụ
-
Chúng ta sẽ thấy một slave xuất hiện trong danh sách slave. Click vào nó và Launch agent.
Bây giờ quay lại config job Demo, ở mục General, tick vào Restrict where this project can be run và điền vào label slave. Khi chạy lại job này, chúng ta sẽ thấy nó được build trên máy slave1 thay vì master, vì máy này được gán label slave.
Tạo một View
View là một cách để nhóm các job có liên quan vào chung một nơi để dễ quản lí. Tại trang chủ của Jenkins, click vào New View và tạo một List View với tên Demo. Sau khi tạo xong, tới trang config của view, ở mục Job Filters -> Jobs, tick vào job Demo. Save lại và một tab với tên Demo sẽ xuất hiện ở dashboard của Jenkins.
Chúng ta có thể thêm nhiều job vào view tùy thích bằng cách trên hoặc nếu các job có cùng pattern, chúng ta có thể dùng regular expression để thêm (xem config option Use a regular expression to include jobs into the view của view).
Cài đặt một plugin
Jenkins có một hệ thống plugin khá lớn, mỗi plugin có một công dụng và mục đích riêng của nó. Tại trang chủ của Jenkins, click vào Manage Jenkins -> Manage Plugins, chọn tab Available và chúng ta sẽ thấy một danh sách các plugin. Một vài plugin phổ biến đã được cài đặt trong quá trình cài đặt Jenkins. Một vài các plugin thông dụng khác sau đây mà chúng ta có thể thử:
- Validating String Parameter.
- Extended Choice Parameter.
- Sectioned View.
- Nested View.
- AnsiColor.
- Embeddable Build Status.
- Modern status.
Mỗi một plugin đều có documentation của riêng nó nên đảm bảo đọc kĩ nó và sau đó áp dụng.
TL;DR
Trên đây là một số ghi chép tổng quan về Jenkins automation server. Nó là một hệ thống lớn với rất nhiều chi tiết cần phải được tìm hiểu thêm. Rất may hệ thống built-in help thông qua Web UI của Jenkins khá tốt nên chúng ta hoàn toàn có thể khám phá nó. Ngoài ra documentation của Jenkins và CloudBees cũng là các nguồn tài liệu nên đọc.
Điểm làm nên khác biệt của Jenkins đó chính là hệ thống plugin. Mỗi plugin sẽ cung cấp thêm một chức năng cho Jenkins, và chúng ta cần áp dụng nó một cách phù hợp.
Về vấn đề quản lí các phần khác của Jenkins, có thể xem Managin Jenkins.
Và một số nguồn tham khảo hữu ích khác: