Bài viết hướng dẫn tuỳ biến image jenkins docker, bổ sung thêm các plugin cần thiết, cấu hình sẳn Jenkins pipeline. Phần source code của bài đăng này được lưu ở đây
Dockerfile
Bạn sẽ bắt đầu với việc tuỳ chỉnh jenkins docker với Dockerfile
FROM jenkins/jenkins:lts ENV JAVA_OPTS -Djenkins.install.runSetupWizard=false -Dhudson.footerURL=https://devopsify.co/tag/jenkins ENV CASC_JENKINS_CONFIG /var/jenkins_home/casc.yaml # Set default executors COPY --chown=jenkins:jenkins executors.groovy /usr/share/jenkins/ref/init.groovy.d/executors.groovy # Install plugin COPY plugins.txt /usr/share/jenkins/ref/plugins.txt RUN /usr/local/bin/install-plugins.sh < /usr/share/jenkins/ref/plugins.txt # Configure Jenkins COPY casc.yaml /var/jenkins_home/casc.yaml
Giải thích sơ qua về phần dockerfile này, nó được build dựa trên image base là jenkins/jenkins:lts.
ENV JAVA_OPTS -Djenkins.install.runSetupWizard=false -Dhudson.footerURL=http://opsify.co phần này dùng để bỏ qua bước setup cho lần đầu khởi động và url cho site jenkins.ENV CASC_JENKINS_CONFIG /var/jenkins_home/casc.yaml đặt cấu hình jenkins bằng vị trí của file casc.yaml (config as code) file này xác định tất cả cấu hình cảu jenkins.
Cài đặt plugins
Để cài đặt sản plugin cho jenkins, bạn cần phải tạo một file plugins.txt và đặt nó vào thư mục /usr/share/jenkins/ref/plugins.txt, sau đó dùng lệnh
để tiến hành cài đặt.Bạn có thể tuỳ ý thêm hoặc bớt plugins mà bạn cần.
Build image
Để build image bạn có thể clone source code về (link ở trên) tại thư mục làm việc chạy lệnh: docker build -t opsify/jenkins .
kiểm tra image vừa build xong bằng lệnh:
Cấu hình pipeline mẫu
Bạn sẻ tạo một container thứ 2, container này sẻ chứa script import pipeline. Script sẻ được thực thi thông qua jenkins-cli, để tìm hiểu thêm về jenkins-cli bạn có thể tham khảo ở đây.
Dockerfile cho jenkins-cli
FROM eclipse-temurin:11.0.12_7-jdk-focal RUN mkdir -p /opt ADD jenkins-cli.jar /opt/jenkins-cli.jar # Configure Jenkins pipline ADD ./jobconfigs /opt/jobconfigs ADD ./createjobs.sh /opt/createjobs.sh
giải thích sơ về dockerfile này, image này cần jenkins-cli(jenkins-cli.jar), file script(createjobs.sh), file cấu hình job(jobconfigs) được thêm vào thông qua lệnh ADD.
File script tự động thêm job
#!/bin/bash jobconfigs_dir=/opt/jobconfigs while true; do for file in $jobconfigs_dir/*.xml; do filename=$(basename ${file} .xml) filename="${filename%.*}" java -jar /opt/jenkins-cli.jar -s http://jenkins:8080 -auth ${JENKINS_ADMIN_ID}:${JENKINS_ADMIN_PASSWORD} create-job ${filename}< $jobconfigs_dir/${filename}.xml done RET=$? if [ ${RET} == 4 ] ; then break fi done
giải thích sơ :), sao cứ sơ hoài vậy?? thì chi tiết để bạn đọc tìm hiểu chứ. Script này sẻ dùng một vòng lặp nó sẻ liên tục chạy command tạo pipeline, vì jenkins khởi động lên sẻ tốn thời gian, tuỳ thuộc vào cấu hình máy tính, máy chạy nhanh máy thì chạy chậm. chạy đến khi nào lệnh được thực thi thì dừng.
Build image jenkins-cli
truy cập vào thư muc đã clone về chạy lệnh: docker build -t opsify/jenkins_cli -f jenkins_setup/Dockerfile ./jenkins_setup
Thế tại sao lại cần có container thứ hai?
Chắc chắn sẻ có bạn thắc mắc với câu hỏi như vậy, vì bản chất container sinh ra chỉ chạy duy nhất một tiến trình, gọi là tiến trình chủ đạo, sau khi job được thêm vào, bạn có thể tắt container jenkins-cli này đi mà không gặp vấn đề gì, hoặc bạn có nhu cầu thêm job thì cũng không cần build lại container jenkins-server.
Chạy với docker-compose
Trong file này bạn sẻ đặt hai container là jenkins-server và jenkins-cli vào cùng một network, cáu hình user/pass cho jenkins site thông qua biến môi trường:
JENKINS_ADMIN_ID/JENKINS_ADMIN_PASSWORDchạy file script trong container jenkin-cli:command: bash /opt/createjobs.sh.
version: '3' services: jenkins: image: opsify/jenkins container_name: jenkins_server restart: unless-stopped environment: - JENKINS_ADMIN_ID=admin - JENKINS_ADMIN_PASSWORD=password ports: - 8080:8080 networks: - jenkins setup_jenkins: image: opsify/jenkins_cli environment: - JENKINS_ADMIN_ID=admin - JENKINS_ADMIN_PASSWORD=password container_name: setup_jenkins command: bash /opt/createjobs.sh networks: - jenkins networks: jenkins: driver: bridge
chạy lệnh sau để khởi động container: docker-compose up -d