Hello anh em! Dạo gần đây mình vừa build môi trường Jenkins thay thế Bamboo cho đỡ tốn kém.

Thế nhưng cu Jenkins này free nên gặp nhiều vấn đề linh tinh lắm, hôm nay mình sẽ nêu lên 1 vài vấn đề về jenkins và mình đã gặp cũng như các vấn đề của các Plugin mà mình đang sử dụng.

I. Cài đặt plugin mặc định

Ban đầu, khi xây dựng DockerImage cho Jenkins mình cũng chẳng biết là nó cần những plugin gì, ở lần start up đầu tiên thì nó sẽ chuyển hướng đến một màn hình để cài plugin như thế này

Thoạt đầu, có thể thấy Jenkins khá tiện lợi trong khoản support cài những plugin cần thiết cho người lần đầu tiếp xúc.  (ngon cơm luôn 😋😋😋)

Sau đó có thể bạn sẽ cần phải cài thêm nhiều plugin khác trong thời gian sử dụng.

Lúc này mới là lúc sinh ra vấn đề nè...

Nhỡ chúng ta cần di chuyển server Jenkins này, và build lại container mới thì sẽ cài plugin lại từ đầu à :( .

Vậy là chúng ta sẽ cài toàn bộ những plugin cần thiết vào trong docker image luôn.

May mắn thay, để lấy được danh sách các plugin đang sử dụng thì chúng ta có thể  dùng công cụ script của Jenkins http://<jenkins-url>/script

Đoạn code sau thực thi sẽ cho ra list các plugin nè các bro

Jenkins.instance.pluginManager.plugins.each{ plugin -> println ("${plugin.getShortName()}:${plugin.getVersion()}") }

Cuối cùng sẽ có kết quả như sau

Anh em  có thể tham khảo ở đây để build Image Jenkins https://blog.vietnamlab.vn/dong-goi-phien-ban-jenkins-cua-rieng-ban/

II. Tài khoản admin mặc định

Khi Start-up Jenkins lần đầu tiên, Jenkins sẽ chuyển đến 1 màn hình cho phép tạo tài khoản admin để có thể thực hiện các chức năng. (tiện luôn 👍)

Nhưng mà dùng lâu đến lúc bảo trì, chuyển server lại phải tạo lại à 😔😔😔

Vậy làm thế nào nếu chuyển server không phải tạo lại tài khoản admin không?

Mình có đọc được là khi Start-up Jenkins, Jenkins sẽ execute những file default Groovy ( tham khảo thêm ở https://www.jenkins.io/doc/book/managing/groovy-hook-scripts/ để biết về các hook của Jenkins nhé anh em ) , Vì vậy mình đã tạo 1 file groovy có nội dung như sau

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()

Thế là khi build mới Jenkins trên server nào đó là có sẵn tài khoản admin rồi

( Mình cũng chưa biết quyết định này là đúng hay sai nữa, nhưng hiện tại thì chưa có vấn đề gì 😂😂😂)

III. Time zome mặc định

Time zone mặc định của Jenkins la UTC, việc sai múi giờ có thể ảnh hưởng đến  log và gặp khó khăn trong quá trình điều tra nếu có lỗi xảy ra.

Giống như việc ta đang ở Việt Nam và theo dõi một sự kiện sẽ xảy ra lúc 7h ở London, vậy là ta phải bật TV vào lúc 14h

Chi cần set lại Environment là có thể thay đổi được timezone tùy ý, trong config của docker-compose có thể dễ dàng cấu hình environment như sau :

environment:
  TZ: Asia/Tokyo

IV. Sử dụng CDATA để viết job builder

Khi sử dụng Jenkins, bạn có thể định nghĩa job file (job.xml) sau đó đẩy lên server Khi sử dụng những ký tự đặc biệt cần encode

ví dụ:

" -> &quot
' -> &apos
& -> &amp
< -> &lt
< -> &gt

Code gì mà vất vả thế nhỉ  😂😂😂

Lúc này thì code sẽ khó đọc và khó chỉnh sữa, vì vậy có thể dùng CDATA để viết file job như sau

<command><![CDATA[
cd ~/abc
git checkout master && git pull
]]></command>

V. Kết bài

Đây là 1 vài vấn đề mình đã gặp phải khi xây dựng môi trường Jenkins và còn nhiều vấn đề khác mình sẽ tiếp tục chia sẻ sau 😋