本文目標(biāo):使用Windows上安裝的Docker來安裝和運行Jenkins较店,并搭建基于本地代碼倉庫的CICD流程。要求熟悉Docker容燕,并熟練使用基本的命令梁呈。
一、Jenkins的安裝
建議參考官方的英文文檔:Build a Java app with Maven (jenkins.io)需要注意缰趋,官方中文文檔比較落后捧杉,且按照其教程并不能順利搭建和啟動Jenkins。
第一步秘血,確認本地Docker已經(jīng)完成安裝味抖,且容器類型為Linux Container,而非Windows Container灰粮,這個可以右擊右下角Docker圖標(biāo)確認仔涩。
第二步,創(chuàng)建自定義網(wǎng)絡(luò):
docker network create jenkins
第三步粘舟,下載docker:dind鏡像并啟動容器熔脂,該鏡像并非jenkins鏡像,目的是為了能在后續(xù)啟動的jenkins容器中能使用docker命令柑肴;
docker run
# 自定義容器名稱
--name jenkins-docker
# 后臺啟動
--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的官方鏡像制作自定義鏡像。任意位置新建一個文件夾晰骑,然后新建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 .
第五步,基于剛制作的鏡像啟動jenkins容器:
docker run
# 自定義容器名稱
--name jenkins-blueocean
# 后臺啟動
--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
# 指定本機代碼存放映射到容器內(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
到這硕舆,如果一切正常秽荞,訪問localhost:8080
就能出現(xiàn)jenkins的界面了。
二抚官、Jenkins的配置
首先訪問localhost:8080
會出現(xiàn)jenkins的解鎖界面扬跋,初始密碼在該docker容器的啟動日志里面:
*************************************************************
*************************************************************
*************************************************************
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
*************************************************************
*************************************************************
*************************************************************
然后會出現(xiàn)插件安裝界面,由于我們是新手凌节,因此按照建議钦听,安裝推薦的插件。隨后創(chuàng)建第一個超管賬號倍奢,一路確定點擊下去彪见,直至出現(xiàn)Jenkins已就緒的字樣,就代表Jenkins已經(jīng)配置好了娱挨。
三余指、流水線的創(chuàng)建與配置
3.1 準(zhǔn)備代碼倉庫
從start.spring.io
上新建一個SpringBoot項目,基本內(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!";
}
}
然后將該代碼庫提交到自己的gitlab倉庫里面,此處不是本文重點酵镜,略過碉碉。
3.2 創(chuàng)建流水線
在Jenkins上新建一個Job,名稱自定義淮韭,此處為first-java-mave-app
垢粮,類型為流水線類型,然后下一步進入到配置界面靠粪,描述信息隨便填寫蜡吧,主要是流水線的配置需要填寫內(nèi)容如下:
- 定義:選擇
Pipeline script from SCM
- SCM類型選擇Git
- Repository URL填寫代碼倉庫映射到容器中的路徑,此處為
/home/java-cicd-test
占键,然后jenkins會自動校驗該目錄是否為一個代碼倉庫目錄昔善;
其它配置皆保持默認不動,保存即可畔乙。
3.3 配置流水線
我們在上一步選擇了Pipeline script from SCM
君仆,意思就是由代碼倉庫中的jenkinsfile來定義和配置流水線。在代碼根目錄下新建jenkinsfile牲距,內(nèi)容如下:
pipeline {
agent {
# 使用docker容器作為代理來執(zhí)行具體的作業(yè)
docker {
# 使用maven的某個版本鏡像啟動一個臨時的容器應(yīng)用(建議先docker pull下來再繼續(xù)后續(xù)操作)
image 'maven:3.8.1-adoptopenjdk-11'
# 將本機上的maven倉庫掛載到maven臨時容器中返咱,避免每次構(gòu)建maven都去下載依賴
args '-v D:/maven-repo:/root/.m2'
}
}
stages {
stage('Build') {
steps {
# 該階段需要執(zhí)行的任務(wù)
sh 'mvn -B -DskipTests clean package'
}
}
}
}
然后需要暫存和提交到本地倉庫中。
我們回到Jenkins的網(wǎng)頁上牍鞠,打開Blue Ocean咖摹,點擊執(zhí)行3.2創(chuàng)建的流水線,然后就能可視化地看到整個流水線的運行情況了难述。
如果本地沒有下載過maven鏡像萤晴,那么此處會運行很久,因為默認是從DockerHub下載龄广,國內(nèi)速度會比較慢硫眯,等個半小時一小時都正常蕴侧,可以在如下位置修改Docker Registry的地址择同,改為從國內(nèi)的鏡像倉庫下載,該地址可以從阿里云中獲取自己特定的地址:容器鏡像服務(wù) (aliyun.com)
按照官方的教程净宵,此處流水線就可以執(zhí)行成功了敲才,后面是增加test和deploy的階段,但是這步驟實際實驗下來择葡,卡在兩個地方:
maven鏡像即使外部docker pull下來了紧武,此處還是會重復(fù)下載,等待時間超級長敏储,無法忍受阻星;
-
即使鏡像下載完畢,在啟動容器的時候會報錯:
java.io.IOException: Failed to run image 'maven:3.8.1-adoptopenjdk-11'. Error: docker: Error response from daemon: invalid mode: /root/.m2.
由于這兩個問題的困擾,花費的時間也不確定妥箕,因此先暫停在這里滥酥,先嘗試使用非Docker的方式來用Jenkins搭建CICD,參見下一篇畦幢。