基于Docker搭建JenkinsCICD流程

本文目標(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)行情況了。

jenkins運(yùn)行流水線
jenkins流水線執(zhí)行步驟
jenkins流水線查看每個(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)

jenkins修改Docker鏡像下載地址

按照官方的教程,此處流水線就可以執(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)下一篇。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容