Hello mấy  bạn! Sau một mùa tiếp xúc với Jenkins trầy chật vật để di chuyển CI/CD của dự án từ Bamboo sang Jenkins thì mình có được một chút kinh nghiệm để giúp những người ít kinh nghiệm và chưa có kinh nghiệm như mình thoải mái hơn trong việc xây dựng một server Jenkins tương đối gọi là đầy đủ chức năng, thuận tiện và dễ sử dụng.

1. Nội dung của blog

Trong bài viết này mình sẽ nói về 2 nội dung sau đây:

  • Quá trình Jenkins khởi động và những thiết lập ban đầu : Trong nội dung này mình sẽ nói sơ về quá trình khởi động của Jenkins và xây dựng image
  • Những plugin nên sử dụng: Nội dung này mình sẽ giới thiệu 1 vài plugin của jenkins mà mình thấy hay ho

2. Quá trình Jenkins khởi động và những thiết lập ban đầu

Trong khi khởi động lần đầu tiên của mình, Jenkins sẽ yêu cầu bạn cài đặt các gói plugin, tài khoản admin, và địa chỉ domain của nó:

sau khi cài đặt xong thì thư mục jenkins-home sẽ trông như thế này :

jenkins-homes/
|-- config.xml 
|-- *.xml
|-- job
|   `-- 'Jenkins job'
|-- init.groovy.d
|   `-- init.groovy

Trong quá trình khởi động Jenkins cài đặt plugin và  đọc các file config.xml, *.xml và các groovy script trong  init.groovy.d để cấu hình mặc định cho jenkins.

Vì vậy, để xây dựng một image cho Jenkins ta có thể dựng một dockerimage file như sau

FROM jenkins/jenkins:lts-jdk11

COPY init.groovy.d /usr/share/jenkins/ref/init.groovy.d

COPY plugins.txt /tmp/plugins.txt

COPY files /files

RUN xargs /usr/local/bin/install-plugins.sh < /tmp/plugins.txt

USER jenkins

file plugins.txt là danh sách các plugin ta dự định sẽ cài đặt cho Jenkins, mình đã cài đặt 53 plugin sau đây cho image của mình

antisamy-markup-formatter:2.1
bouncycastle-api:2.20
build-timeout:1.20
caffeine-api:2.9.1-23.v51c4e2c879c8
cloudbees-folder:6.15
command-launcher:1.2
credentials:2.5
display-url-api:2.3.5
jaxb:2.3.0
jdk-tool:1.0
jsch:0.1.55.2
ldap:2.7
mailer:1.34
matrix-auth:2.6.7
pam-auth:1.6
role-strategy:3.1.1
scm-api:2.6.4
script-security:1.77
ssh-agent:1.23
ssh-credentials:1.19
ssh:2.6.1
sshd:3.0.3
structs:1.23
timestamper:1.13
token-macro:2.15
trilead-api:1.0.13
workflow-api:2.46
workflow-step-api:2.24
workflow-scm-step:2.13
ace-editor:1.1
workflow-support:3.8
workflow-cps:2.93
branch-api:2.6.5
workflow-job:2.41
workflow-multibranch:2.26
apache-httpcomponents-client-4-api:4.5.13-1.0
git-client:3.8.0
git:4.7.2
plugin-util-api:2.4.0
font-awesome-api:5.15.3-4
popper-api:1.16.1-2
jquery3-api:3.6.0-2
bootstrap4-api:4.6.0-3
snakeyaml-api:1.29.1
jackson2-api:2.12.3
popper2-api:2.5.4-3
bootstrap5-api:5.0.2-1
echarts-api:5.1.2-3
checks-api:1.7.2
junit:1.51
jquery:1.12.4-1
git-parameter:0.9.13
configuration-as-code:1.51

Mình cũng tạo 1 default-user.groovy để tạo 1 user admin mặc định cho Jenkins

import jenkins.model.*
import hudson.security.*

def env = System.getenv()

def jenkins = Jenkins.getInstance()
if(!(jenkins.getSecurityRealm() instanceof HudsonPrivateSecurityRealm))
    jenkins.setSecurityRealm(new HudsonPrivateSecurityRealm(false))

if(!(jenkins.getAuthorizationStrategy() instanceof GlobalMatrixAuthorizationStrategy))
    jenkins.setAuthorizationStrategy(new GlobalMatrixAuthorizationStrategy())

def user = jenkins.getSecurityRealm().createAccount(env.JENKINS_USER, env.JENKINS_PASS)
user.save()
jenkins.getAuthorizationStrategy().add(Jenkins.ADMINISTER, env.JENKINS_USER)

jenkins.save()

Bây giờ chúng ta có thể tạo 1 docker-compose truyền thêm các tham số để cấu hình môi trường cho container Jenkins này (Timezone, User, Bỏ qua bước setup khi khởi động)

version: '3.3'
services:
    jenkins:
        image: jenkins/jenkins:lts-jdk11
        container_name: jenkins
        restart: always
        volumes:
            - jenkins_home:/var/jenkins_home
        environment:
            TZ: Asia/Tokyo
            JAVA_OPTS: "-Djenkins.install.runSetupWizard=false" # Start jenkins unlocked
            JENKINS_USER: {{ jenkins_admin }}
            JENKINS_PASS: {{ jenkins_admin_password }}
        extra_hosts:
            - "example.dev:192.168.1.69"
volumes:
    jenkins_home:

Ok gần như là một image khá tốt rồi, các bạn sẽ có 1 image có sẵn plugin có thể tuỳ chỉnh thêm các biến môi trường thông qua docker-compose, bạn có thể đẩy lên docker-hub để dễ dàng đập đi xây lại ở một server khác mà không mất nhiều thời gian.

3. Những plugin nên sử dụng

  • role-strategy:3.1.1

Plugin này thay thế cho phân quyền mặc định của Jenkins theo group và User, mình thấy khá tiện dụng

  • git-parameter:0.9.13

Plugin này cho phép bạn truyền các branch, tag như là 1 parameter vào trong job

  • configuration-as-code:1.51

Plugin này cực bá đạo cho phép bạn config các thứ từ giao diện điều khiển, SSH remote server ... thông qua file xml

credentials:
  system:
    domainCredentials:
    - credentials:
      - basicSSHUserPrivateKey:
          id: "test_id"
          privateKeySource:
            directEntry:
              privateKey: "{AQAAABAAAAaQZk+FjvmavtqBr96eEs6xZyP3dmBEu1Hm7XPvLupRRY5YwSP7bhgxftwd9zVOXUgdPovBhg8X5gdn7XwR6WJ+PJMJ2EF.....}"
          scope: GLOBAL
          username: "test"
jenkins:
  agentProtocols:
  - "JNLP4-connect"
  - "Ping"
  authorizationStrategy:
    roleBased:
      roles:
        global:
        
        ......

OK! Mình vừa mới chia sẻ 1 chút trải nghiệm của mình về Jenkins.

Hy vọng bài viết này sẽ giúp các bạn tiếp cận Jenkins 1 cách tiết kiệm thời gian và hiệu quả.