本文目標(biāo):使用Windows上安裝的Docker來(lái)安裝和運(yùn)行Jenkins,并搭建基于本地代碼倉(cāng)庫(kù)的CICD流程。要求熟悉Docker,并熟練使用基本的命令。
一、Jenkins的安裝
建議參考官方的英文文檔:Build a Java app with Maven (jenkins.io)需要注意,官方中文文檔比較落后,且按照其教程并不能順利搭建和啟動(dòng)Jenkins。
第一步,確認(rèn)本地Docker已經(jīng)完成安裝,且容器類(lèi)型為L(zhǎng)inux Container,而非Windows Container,這個(gè)可以右擊右下角Docker圖標(biāo)確認(rèn)。
第二步,創(chuàng)建自定義網(wǎng)絡(luò):
docker network create jenkins
第三步,下載docker:dind鏡像并啟動(dòng)容器,該鏡像并非jenkins鏡像,目的是為了能在后續(xù)啟動(dòng)的jenkins容器中能使用docker命令;
docker run
# 自定義容器名稱
--name jenkins-docker
# 后臺(tái)啟動(dòng)
--detach
--privileged
# 使用上一步創(chuàng)建的網(wǎng)絡(luò)
--network jenkins
--network-alias docker
--env DOCKER_TLS_CERTDIR=/certs
--volume jenkins-docker-certs:/certs/client
--volume jenkins-data:/var/jenkins_home
--publish 3000:3000
--publish 5000:5000
--publish 2376:2376
docker:dind
第四步,基于jenkins的官方鏡像制作自定義鏡像。任意位置新建一個(gè)文件夾,然后新建Dockerfile文件,內(nèi)容如下:
FROM jenkins/jenkins:2.361.1-jdk11
USER root
RUN apt-get update && apt-get install -y lsb-release
RUN curl -fsSLo /usr/share/keyrings/docker-archive-keyring.asc \
https://download.docker.com/linux/debian/gpg
RUN echo "deb [arch=$(dpkg --print-architecture) \
signed-by=/usr/share/keyrings/docker-archive-keyring.asc] \
https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
RUN apt-get update && apt-get install -y docker-ce-cli
USER jenkins
RUN jenkins-plugin-cli --plugins "blueocean:1.25.8 docker-workflow:521.v1a_a_dd2073b_2e"
然后在該目錄下執(zhí)行鏡像的制作:
docker build -t my-jenkins-blueocean:220930 .
第五步,基于剛制作的鏡像啟動(dòng)jenkins容器:
docker run
# 自定義容器名稱
--name jenkins-blueocean
# 后臺(tái)啟動(dòng)
--detach
# 加入第二步創(chuàng)建的網(wǎng)絡(luò)
--network jenkins
--env DOCKER_HOST=tcp://docker:2376
--env DOCKER_CERT_PATH=/certs/client
--env DOCKER_TLS_VERIFY=1
--volume jenkins-data:/var/jenkins_home
--volume jenkins-docker-certs:/certs/client:ro
# 指定本機(jī)代碼存放映射到容器內(nèi)部的home目錄下
--volume E:\code\first-java-maven-app:/home
--restart=on-failure
--env JAVA_OPTS="-Dhudson.plugins.git.GitSCM.ALLOW_LOCAL_CHECKOUT=true"
--publish 8080:8080
--publish 50000:50000
my-jenkins-blueocean:220930
到這,如果一切正常,訪問(wèn)localhost:8080就能出現(xiàn)jenkins的界面了。
二、Jenkins的配置
首先訪問(wèn)localhost:8080會(huì)出現(xiàn)jenkins的解鎖界面,初始密碼在該docker容器的啟動(dòng)日志里面:
*************************************************************
*************************************************************
*************************************************************
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
d019a2ca84e94d54aa8e17607c9e1da7
This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
*************************************************************
*************************************************************
*************************************************************
然后會(huì)出現(xiàn)插件安裝界面,由于我們是新手,因此按照建議,安裝推薦的插件。隨后創(chuàng)建第一個(gè)超管賬號(hào),一路確定點(diǎn)擊下去,直至出現(xiàn)Jenkins已就緒的字樣,就代表Jenkins已經(jīng)配置好了。
三、流水線的創(chuàng)建與配置
3.1 準(zhǔn)備代碼倉(cāng)庫(kù)
從start.spring.io上新建一個(gè)SpringBoot項(xiàng)目,基本內(nèi)容如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
@Slf4j
@RestController
public class HelloController {
@RequestMapping("/hello")
public String getHello(){
log.info("hello!!!");
return "hello!";
}
}
然后將該代碼庫(kù)提交到自己的gitlab倉(cāng)庫(kù)里面,此處不是本文重點(diǎn),略過(guò)。
3.2 創(chuàng)建流水線
在Jenkins上新建一個(gè)Job,名稱自定義,此處為first-java-mave-app,類(lèi)型為流水線類(lèi)型,然后下一步進(jìn)入到配置界面,描述信息隨便填寫(xiě),主要是流水線的配置需要填寫(xiě)內(nèi)容如下:
- 定義:選擇
Pipeline script from SCM - SCM類(lèi)型選擇Git
- Repository URL填寫(xiě)代碼倉(cāng)庫(kù)映射到容器中的路徑,此處為
/home/java-cicd-test,然后jenkins會(huì)自動(dòng)校驗(yàn)該目錄是否為一個(gè)代碼倉(cāng)庫(kù)目錄;
其它配置皆保持默認(rèn)不動(dòng),保存即可。
3.3 配置流水線
我們?cè)谏弦徊竭x擇了Pipeline script from SCM,意思就是由代碼倉(cāng)庫(kù)中的jenkinsfile來(lái)定義和配置流水線。在代碼根目錄下新建jenkinsfile,內(nèi)容如下:
pipeline {
agent {
# 使用docker容器作為代理來(lái)執(zhí)行具體的作業(yè)
docker {
# 使用maven的某個(gè)版本鏡像啟動(dòng)一個(gè)臨時(shí)的容器應(yīng)用(建議先docker pull下來(lái)再繼續(xù)后續(xù)操作)
image 'maven:3.8.1-adoptopenjdk-11'
# 將本機(jī)上的maven倉(cāng)庫(kù)掛載到maven臨時(shí)容器中,避免每次構(gòu)建maven都去下載依賴
args '-v D:/maven-repo:/root/.m2'
}
}
stages {
stage('Build') {
steps {
# 該階段需要執(zhí)行的任務(wù)
sh 'mvn -B -DskipTests clean package'
}
}
}
}
然后需要暫存和提交到本地倉(cāng)庫(kù)中。
我們回到Jenkins的網(wǎng)頁(yè)上,打開(kāi)Blue Ocean,點(diǎn)擊執(zhí)行3.2創(chuàng)建的流水線,然后就能可視化地看到整個(gè)流水線的運(yùn)行情況了。



如果本地沒(méi)有下載過(guò)maven鏡像,那么此處會(huì)運(yùn)行很久,因?yàn)槟J(rèn)是從DockerHub下載,國(guó)內(nèi)速度會(huì)比較慢,等個(gè)半小時(shí)一小時(shí)都正常,可以在如下位置修改Docker Registry的地址,改為從國(guó)內(nèi)的鏡像倉(cāng)庫(kù)下載,該地址可以從阿里云中獲取自己特定的地址:容器鏡像服務(wù) (aliyun.com)

按照官方的教程,此處流水線就可以執(zhí)行成功了,后面是增加test和deploy的階段,但是這步驟實(shí)際實(shí)驗(yàn)下來(lái),卡在兩個(gè)地方:
maven鏡像即使外部docker pull下來(lái)了,此處還是會(huì)重復(fù)下載,等待時(shí)間超級(jí)長(zhǎng),無(wú)法忍受;
-
即使鏡像下載完畢,在啟動(dòng)容器的時(shí)候會(huì)報(bào)錯(cuò):
java.io.IOException: Failed to run image 'maven:3.8.1-adoptopenjdk-11'. Error: docker: Error response from daemon: invalid mode: /root/.m2.
由于這兩個(gè)問(wèn)題的困擾,花費(fèi)的時(shí)間也不確定,因此先暫停在這里,先嘗試使用非Docker的方式來(lái)用Jenkins搭建CICD,參見(jiàn)下一篇。