Cài Jenkins trên Linux
Cài Jenkins LTS và Java 21 từ repository chính thức trên Debian, Ubuntu, RHEL hoặc Fedora, sau đó vận hành service an toàn.
Phạm vi hướng dẫn
Bài này cài Jenkins controller bằng package chính thức và quản lý bằng systemd. Các lệnh dùng release line LTS phù hợp cho người mới và đa số môi trường production.
Mục lục
- 1. Chọn Jenkins LTS và Java
- 2. Yêu cầu hệ thống và chuẩn bị
- 3. Cài Jenkins từ repository chính thức
- 4. Khởi động và mở cổng 8080
- 5. Unlock Jenkins và hoàn tất thiết lập
- 6. Vận hành service và đường dẫn quan trọng
- 7. Cập nhật Jenkins an toàn
- 8. Gỡ cài đặt
- 9. Hardening cơ bản cho production
- 10. Troubleshooting
- 11. Bước tiếp theo
- Checklist hoàn thành
- Tài liệu tham khảo
1. Chọn Jenkins LTS và Java
1.1 Chọn Jenkins LTS
Jenkins phát hành theo hai release line:
| Release line | Đặc điểm | Nên dùng khi |
|---|---|---|
| LTS | Nhận một bản ổn định mới theo chu kỳ và có hướng dẫn nâng cấp riêng | Lab, học tập và đa số hệ thống production |
| Weekly | Nhận tính năng và thay đổi sớm hơn | Thử nghiệm tính năng mới hoặc phát triển plugin |
Hướng dẫn này dùng repository debian-stable và rpm-stable. Package manager sẽ cài bản LTS hiện hành từ Jenkins, nên không cần hard-code số phiên bản vào lệnh.
Khuyến nghị
Dùng LTS cho controller. Trước mỗi lần nâng cấp, đọc changelog, LTS Upgrade Guide và yêu cầu Java của phiên bản đích.
1.2 Chọn Java 21
Jenkins chạy trên Java, nhưng Java dùng để chạy controller không bắt buộc phải giống JDK dùng để build ứng dụng. Theo hướng dẫn cài Linux hiện hành của Jenkins, hãy dùng OpenJDK 21 làm runtime mặc định.
Kiểm tra Java sau khi cài:
java -versionKết quả phải cho thấy major version 21. Không tiếp tục nếu lệnh không tồn tại hoặc đang trỏ tới một Java không được phiên bản Jenkins đích hỗ trợ.
Cài Java trước Jenkins trên Debian và Ubuntu
Jenkins khuyến nghị cài Java trước. Nếu cài Jenkins trước rồi mới thêm Java, service có thể báo failed to find a valid Java installation.
2. Yêu cầu hệ thống và chuẩn bị
2.1 Tài nguyên phần cứng
Mức tối thiểu chính thức chỉ phù hợp để Jenkins khởi động:
- RAM:
256 MB; - dung lượng đĩa:
1 GB.
Với một nhóm nhỏ, Jenkins khuyến nghị điểm khởi đầu:
- RAM:
4 GBtrở lên; - dung lượng đĩa:
50 GBtrở lên.
Dung lượng thực tế phụ thuộc số plugin, job, build history và artifact. Controller production nên dành tài nguyên cho điều phối, giao diện và lưu cấu hình. Không chạy workload build nặng trực tiếp trên controller; hãy dùng agent riêng.
2.2 Điều kiện trước khi cài
Máy chủ cần có:
- bản Linux 64-bit còn được nhà cung cấp hỗ trợ;
systemd;- tài khoản có quyền
sudo; - DNS và kết nối HTTPS ra
pkg.jenkins.io; - port TCP
8080chưa bị process khác chiếm; - đồng hồ hệ thống đồng bộ;
- đủ dung lượng cho
/var/lib/jenkins; - một trình duyệt trên máy quản trị để hoàn tất setup wizard.
Kiểm tra nhanh hệ điều hành, kiến trúc, bộ nhớ, đĩa và port:
cat /etc/os-release
uname -m
free -h
df -h /var/lib 2>/dev/null || df -h /
sudo ss -ltnp | grep ':8080' || trueNếu dòng cuối không in kết quả, thường chưa có process lắng nghe trên port 8080.
Không cài trên hệ điều hành đã hết vòng đời
Jenkins chỉ hỗ trợ đầy đủ các bản Linux còn được nhà cung cấp hệ điều hành duy trì. Production cần kế hoạch vá OS, Java, Jenkins core và plugin độc lập nhưng phối hợp với nhau.
3. Cài Jenkins từ repository chính thức
Chọn đúng tab cho hệ điều hành. Các lệnh chỉ cấu hình LTS repository chính thức.
1. Cài Java 21 và công cụ tải key
sudo apt update
sudo apt install fontconfig openjdk-21-jre wget
java -versionNếu distribution repository không có openjdk-21-jre, hãy cài JRE/JDK 21 từ nhà cung cấp được Jenkins hỗ trợ, chẳng hạn Eclipse Temurin, rồi chạy lại java -version. Không thay bằng Java cũ chỉ để lệnh cài thành công.
2. Thêm signing key và LTS repository
sudo install -m 0755 -d /etc/apt/keyrings
sudo wget -O /etc/apt/keyrings/jenkins-keyring.asc \
https://pkg.jenkins.io/debian-stable/jenkins.io-2026.key
sudo chmod 0644 /etc/apt/keyrings/jenkins-keyring.asc
echo "deb [signed-by=/etc/apt/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian-stable binary/" \
| sudo tee /etc/apt/sources.list.d/jenkins.list > /dev/nullKey hiện hành có fingerprint:
5E38 6EAD B55F 0150 4CAE 8BCF 7198 F4B7 14AB FC68Cú pháp signed-by giới hạn key này cho Jenkins repository. Không dùng apt-key, vì cơ chế đó đã cũ và cấp phạm vi tin cậy rộng hơn cần thiết.
3. Làm mới package index và cài Jenkins
sudo apt update
apt-cache policy jenkins
sudo apt install jenkinsTrong kết quả apt-cache policy, candidate phải đến từ https://pkg.jenkins.io/debian-stable.
Sau khi cài, package tạo user hệ thống jenkins, khai báo service jenkins.service, đặt JENKINS_HOME mặc định tại /var/lib/jenkins và cấu hình HTTP port mặc định là 8080.
4. Khởi động và mở cổng 8080
4.1 Khởi động service
Bật Jenkins ngay bây giờ và tự động khởi động cùng hệ điều hành:
sudo systemctl enable --now jenkins
sudo systemctl is-enabled jenkins
sudo systemctl is-active jenkinsKết quả mong đợi của hai lệnh cuối là enabled và active. Xem trạng thái chi tiết nếu service chưa chạy:
sudo systemctl status jenkins --no-pager --full
sudo journalctl -u jenkins.service -n 100 --no-pager4.2 Cấu hình firewall
Chỉ chạy tab tương ứng nếu firewall đó đang được sử dụng.
Kiểm tra trạng thái rồi mở port cho bài lab:
sudo ufw status verbose
sudo ufw allow 8080/tcp
sudo ufw status numberedNếu máy chạy trên cloud, còn phải cấu hình security group, network security rule hoặc firewall bên ngoài máy chủ.
Production không nên public port 8080
Các lệnh trên mở 8080/tcp theo phạm vi mặc định của firewall. Với production, chỉ cho phép mạng quản trị hoặc reverse proxy truy cập port này. Đặt Jenkins sau HTTPS và không mở 8080 trực tiếp ra Internet.
Jenkins còn có TCP port cho inbound agent, nhưng không cần mở port đó để hoàn thành bài này. Chỉ mở khi bạn đã cấu hình một port cố định và thực sự dùng inbound TCP agent.
4.3 Xác minh Jenkins đang lắng nghe
Trên server:
sudo ss -ltnp | grep ':8080'Nếu có curl, kiểm tra HTTP cục bộ:
curl --head http://127.0.0.1:8080/loginSau đó mở một trong các URL sau trên trình duyệt:
http://localhost:8080
http://SERVER_IP:8080Dùng localhost khi trình duyệt chạy cùng server. Với máy khác, thay SERVER_IP bằng IP hoặc DNS của Jenkins server.
5. Unlock Jenkins và hoàn tất thiết lập
Ở lần khởi động đầu tiên, Jenkins tạo một mật khẩu dùng một lần trong JENKINS_HOME. Đọc mật khẩu trên terminal tin cậy:
sudo cat /var/lib/jenkins/secrets/initialAdminPassword1. Mở trang Unlock Jenkins
Truy cập http://SERVER_IP:8080 và chờ trang Unlock Jenkins xuất hiện.
2. Nhập initial admin password
Dán giá trị vừa đọc vào trường Administrator password, rồi chọn Continue. Không gửi mật khẩu này qua chat, ticket hoặc log dùng chung.
3. Cài plugin có chọn lọc
Người mới có thể chọn Install suggested plugins. Production nên chỉ giữ plugin thực sự cần và đưa plugin vào quy trình cập nhật, kiểm thử, sao lưu.
4. Tạo admin user riêng
Tạo tài khoản quản trị đầu tiên với mật khẩu mạnh. Không tiếp tục dùng tài khoản mặc định hoặc chia sẻ một tài khoản admin cho cả nhóm.
5. Kiểm tra Jenkins URL
Đặt URL đúng với địa chỉ người dùng sẽ truy cập. Nếu sẽ dùng reverse proxy và HTTPS, hoàn thiện cấu hình đó trước khi đưa URL production vào webhook hoặc integration.
Hướng dẫn chi tiết tiếp tục ở trang Thiết lập ban đầu.
6. Vận hành service và đường dẫn quan trọng
6.1 Các lệnh systemd thường dùng
| Mục đích | Lệnh |
|---|---|
| Xem trạng thái | sudo systemctl status jenkins --no-pager --full |
| Khởi động | sudo systemctl start jenkins |
| Dừng | sudo systemctl stop jenkins |
| Khởi động lại | sudo systemctl restart jenkins |
| Bật khi boot | sudo systemctl enable jenkins |
| Xem log gần nhất | sudo journalctl -u jenkins.service -n 100 --no-pager |
| Theo dõi log trực tiếp | sudo journalctl -u jenkins.service -f |
| Xem unit và override | sudo systemctl cat jenkins |
| Xem cấu hình đã áp dụng | sudo systemctl show jenkins --property=Environment |
Package Linux hiện đại ghi console log vào systemd-journald. Vì vậy, hãy dùng journalctl thay vì mặc định đi tìm /var/log/jenkins/jenkins.log.
6.2 Các đường dẫn cần biết
| Đường dẫn | Vai trò | Lưu ý |
|---|---|---|
/var/lib/jenkins | JENKINS_HOME: cấu hình, plugin, job, build history và secret | Phải backup nhất quán; chứa dữ liệu nhạy cảm |
/var/lib/jenkins/secrets/initialAdminPassword | Mật khẩu unlock lần đầu | Chỉ đọc trên terminal tin cậy |
/etc/apt/sources.list.d/jenkins.list | APT repository trên Debian/Ubuntu | Dùng debian-stable trong bài này |
/etc/apt/keyrings/jenkins-keyring.asc | APT signing key dành riêng cho Jenkins | Không thay bằng apt-key |
/etc/yum.repos.d/jenkins.repo | DNF repository trên RHEL/Fedora | Giữ gpgcheck và repo_gpgcheck được bật |
/etc/systemd/system/jenkins.service.d/override.conf | Cấu hình override do quản trị viên tạo | Không bị package upgrade ghi đè |
/lib/systemd/system/jenkins.service | Vendor unit thường gặp trên Debian/Ubuntu | Chỉ đọc; dùng systemctl edit jenkins để override |
/usr/lib/systemd/system/jenkins.service | Vendor unit thường gặp trên RHEL/Fedora | Chỉ đọc; dùng systemctl edit jenkins để override |
systemctl cat jenkins là nguồn chính xác nhất để biết unit file và giá trị đang áp dụng trên chính máy của bạn.
Không sửa trực tiếp vendor unit
File dưới /lib/systemd/system hoặc /usr/lib/systemd/system có thể bị package upgrade thay thế. Luôn tạo drop-in bằng sudo systemctl edit jenkins.
6.3 Thay đổi cổng bằng systemd override
Ví dụ đổi HTTP port từ 8080 sang 8081:
sudo systemctl edit jenkinsNhập nội dung:
[Service]
Environment="JENKINS_PORT=8081"Lưu file, sau đó áp dụng và kiểm tra:
sudo systemctl restart jenkins
sudo systemctl status jenkins --no-pager --full
sudo ss -ltnp | grep ':8081'Đồng thời cập nhật firewall, reverse proxy, health check và Jenkins URL. systemctl edit tự reload unit; nếu tự tạo drop-in bằng công cụ khác, chạy sudo systemctl daemon-reload trước khi restart.
7. Cập nhật Jenkins an toàn
Không cập nhật controller production như một package độc lập mà bỏ qua Java, plugin và khả năng rollback. Quy trình tối thiểu:
- đọc LTS changelog, LTS Upgrade Guide và Java Support Policy;
- kiểm tra plugin quan trọng tương thích với bản đích;
- thông báo maintenance window và dừng nhận build mới;
- backup toàn bộ
/var/lib/jenkins, bao gồm secret, rồi kiểm tra khả năng restore; - ghi lại package version, Java version và danh sách plugin hiện tại;
- cập nhật trên staging trước nếu Jenkins phục vụ workload quan trọng;
- cập nhật package, theo dõi log và chạy smoke test;
- chỉ nâng plugin theo kế hoạch đã kiểm thử.
Kiểm tra version trước khi cập nhật:
java -version
jenkins --version
sudo systemctl status jenkins --no-pagersudo apt update
apt-cache policy jenkins
sudo apt install --only-upgrade jenkins
sudo systemctl status jenkins --no-pager --fullSau nâng cấp, kiểm tra:
jenkins --version
sudo journalctl -u jenkins.service -n 200 --no-pagerSau đó xác nhận đăng nhập, queue, agent connection, credential integration và một Pipeline đại diện đều hoạt động.
Backup chứa secret
Bản sao JENKINS_HOME có credential và encryption key. Mã hóa backup, giới hạn quyền đọc, tách khỏi server Jenkins và kiểm thử restore định kỳ.
Xem quy trình đầy đủ tại Nâng cấp Jenkins.
8. Gỡ cài đặt
Trước khi gỡ, backup /var/lib/jenkins nếu có khả năng cần khôi phục job, credential hoặc lịch sử build.
sudo systemctl disable --now jenkins
sudo apt remove jenkinsLệnh gỡ package không phải là quy trình xóa dữ liệu an toàn. Sau khi gỡ, kiểm tra riêng các vị trí sau trước khi quyết định lưu trữ hoặc xóa:
sudo test -d /var/lib/jenkins && sudo du -sh /var/lib/jenkins
sudo test -d /etc/systemd/system/jenkins.service.d \
&& sudo ls -la /etc/systemd/system/jenkins.service.dRepository cũng là cấu hình riêng. Chỉ xóa file repository/key nếu máy không còn dùng Jenkins và chính sách vận hành yêu cầu. Không chạy lệnh xóa đệ quy với /var/lib/jenkins cho đến khi đã xác nhận backup, đúng đường dẫn và đúng server.
9. Hardening cơ bản cho production
Checklist tối thiểu trước khi đưa controller vào sử dụng thật:
- Không public port 8080. Chỉ cho reverse proxy hoặc mạng quản trị truy cập.
- Bật HTTPS. Terminate TLS tại reverse proxy/load balancer và cấu hình forwarded headers đúng.
- Giữ authentication và authorization. Tắt anonymous access nếu không có yêu cầu rõ ràng; cấp quyền theo nguyên tắc tối thiểu.
- Không dùng chung admin account. Tích hợp identity provider phù hợp và giữ tài khoản khôi phục được kiểm soát.
- Không chạy build trên controller. Đặt executor của built-in node về
0, dùng agent tách biệt. - Cài ít plugin nhất có thể. Gỡ plugin không dùng và theo dõi security advisory.
- Cập nhật có kiểm thử. Vá OS, Java, Jenkins core và plugin theo maintenance window.
- Backup và restore. Mã hóa bản sao
JENKINS_HOME, lưu ngoài server và diễn tập khôi phục. - Bảo vệ secret. Không đặt password/token trong command line, job log, repository hoặc systemd unit có quyền đọc quá rộng.
- Giám sát. Theo dõi service, disk/inode, heap, queue, executor, agent và lỗi đăng nhập.
- Giới hạn outbound network. Chỉ cho controller/agent truy cập package, plugin, SCM và dịch vụ thực sự cần.
- Không tắt SELinux để chữa lỗi. Đọc AVC denial và bổ sung policy tối thiểu nếu cần.
Khi đặt reverse proxy cùng máy, có thể bind Jenkins vào loopback bằng systemd override:
sudo systemctl edit jenkins[Service]
Environment="JENKINS_OPTS=--httpListenAddress=127.0.0.1"Nếu đã có JENKINS_OPTS, hãy giữ các option hiện tại trên cùng dòng thay vì ghi đè mất chúng. Sau thay đổi:
sudo systemctl restart jenkins
sudo ss -ltnp | grep ':8080'Kết quả phải cho thấy Jenkins chỉ lắng nghe trên 127.0.0.1:8080. Cấu hình reverse proxy trước để tránh mất đường truy cập.
10. Troubleshooting
Bắt đầu bằng bốn lệnh sau thay vì đoán:
sudo systemctl status jenkins --no-pager --full
sudo journalctl -u jenkins.service -b -n 200 --no-pager
java -version
sudo systemctl cat jenkins10.1 Jenkins không khởi động
| Dấu hiệu | Kiểm tra | Hướng xử lý |
|---|---|---|
failed to find a valid Java installation | java -version và sudo -u jenkins java -version | Cài Java 21 được hỗ trợ, kiểm tra PATH/Java override, rồi restart |
UnsupportedClassVersionError hoặc báo Java không hỗ trợ | So sánh Jenkins version với Java Support Policy | Nâng Java lên bản được Jenkins đích hỗ trợ; không hạ Jenkins tùy tiện |
Address already in use | sudo ss -ltnp | grep ':8080' | Dừng process xung đột hoặc đổi JENKINS_PORT, rồi cập nhật firewall/proxy |
| Service timeout khi khởi động | sudo journalctl -u jenkins.service -f | Kiểm tra plugin lỗi, I/O chậm và tài nguyên; không tăng timeout trước khi biết nguyên nhân |
| Process bị kill | `sudo journalctl -k -b | grep -i -E 'oom | killed process'` |
Sau mỗi thay đổi:
sudo systemctl restart jenkins
sudo systemctl is-active jenkins
sudo journalctl -u jenkins.service -n 100 --no-pager10.2 Lỗi repository hoặc signing key
Với Debian/Ubuntu, xác nhận URL và key file:
cat /etc/apt/sources.list.d/jenkins.list
sudo ls -l /etc/apt/keyrings/jenkins-keyring.asc
sudo apt updateSource phải dùng debian-stable, signed-by và HTTPS. Nếu key cũ/hỏng, tải lại từ trang package chính thức. Không bỏ signed-by để né lỗi.
Với RHEL/Fedora:
cat /etc/yum.repos.d/jenkins.repo
sudo dnf clean expire-cache
sudo dnf makecache --refreshGiữ gpgcheck=1 và repo_gpgcheck=1. Nếu fingerprint từ repository không khớp nguồn Jenkins chính thức, dừng cài đặt và xác minh lại DNS, proxy, URL cùng thông báo đổi key của Jenkins.
10.3 Truy cập từ xa thất bại
Chẩn đoán theo thứ tự:
systemctl is-active jenkinsphải trảactive;curl --head http://127.0.0.1:8080/loginphải nhận phản hồi HTTP;ssphải cho thấy Jenkins bind đúng địa chỉ;- firewall trên server phải cho phép nguồn quản trị;
- security group, ACL, load balancer và route bên ngoài phải cho phép kết nối;
- reverse proxy phải chuyển đúng host, port và forwarded headers.
Nếu local truy cập được nhưng remote không được, Jenkins thường đã chạy; lỗi nằm ở bind address hoặc lớp mạng/firewall. Không tắt toàn bộ firewall để kiểm tra trên production.
10.4 Hết dung lượng hoặc lỗi quyền
Kiểm tra filesystem và inode:
df -h /var/lib/jenkins
df -i /var/lib/jenkins
sudo du -xhd1 /var/lib/jenkins | sort -h
sudo ls -ld /var/lib/jenkins
sudo namei -l /var/lib/jenkinsCác nguyên nhân thường gặp:
- build history hoặc artifact tăng không giới hạn;
- workspace/cache nằm trên controller;
- backup được ghi vào cùng filesystem rồi làm đầy đĩa;
- restore bằng
rootlàm sai owner; - mount chứa
JENKINS_HOMEchưa sẵn sàng khi service khởi động.
Không chạy chown -R theo phản xạ. Trước tiên xác định file nào sai owner và vì sao. Package mặc định chạy service bằng user jenkins; quyền thực tế có thể xem bằng:
sudo systemctl show jenkins --property=User,Group,EnvironmentNếu SELinux chặn truy cập, đọc denial thay vì tắt SELinux:
sudo ausearch -m AVC -ts recent11. Bước tiếp theo
Sau khi service ổn định và bạn đã truy cập được trang unlock, tiếp tục theo thứ tự:
Thiết lập ban đầu
Unlock Jenkins, cài plugin và tạo tài khoản quản trị đầu tiên.
Reverse Proxy và TLS
Đưa Jenkins sau HTTPS và không public port 8080.
Hardening controller
Giảm bề mặt tấn công và bảo vệ Jenkins controller.
Jenkins Agent
Tách workload build khỏi controller.
Nâng cấp Jenkins
Lập kế hoạch backup, kiểm tra tương thích và rollback.
Checklist hoàn thành
- Đã chọn Jenkins LTS và cài Java 21 trước Jenkins.
- Repository trỏ đúng
debian-stablehoặcrpm-stablequa HTTPS. - Signing key có fingerprint đúng và kiểm tra chữ ký không bị tắt.
-
jenkins.serviceở trạng tháienabledvàactive. - Jenkins lắng nghe trên port dự kiến.
- Firewall chỉ cho phép phạm vi cần thiết.
- Đã đọc
initialAdminPasswordtrên terminal tin cậy và tạo admin user riêng. - Biết dùng
journalctlvàsystemctl cat jenkinsđể chẩn đoán. - Đã xác định chiến lược backup/restore cho
/var/lib/jenkins. - Production có kế hoạch HTTPS, least privilege, agent riêng và cập nhật định kỳ.