基于Docker搭建JenkinsCICD流程

本文目標(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)建的流水線,然后就能可視化地看到整個流水線的運行情況了难述。

jenkins運行流水線
jenkins流水線執(zhí)行步驟
jenkins流水線查看每個步驟的運行詳情

如果本地沒有下載過maven鏡像萤晴,那么此處會運行很久,因為默認是從DockerHub下載龄广,國內(nèi)速度會比較慢硫眯,等個半小時一小時都正常蕴侧,可以在如下位置修改Docker Registry的地址择同,改為從國內(nèi)的鏡像倉庫下載,該地址可以從阿里云中獲取自己特定的地址:容器鏡像服務(wù) (aliyun.com)

jenkins修改Docker鏡像下載地址

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末坎吻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子宇葱,更是在濱河造成了極大的恐慌瘦真,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件黍瞧,死亡現(xiàn)場離奇詭異诸尽,居然都是意外死亡,警方通過查閱死者的電腦和手機雷逆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門弦讽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人膀哲,你說我怎么就攤上這事往产。” “怎么了某宪?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵仿村,是天一觀的道長。 經(jīng)常有香客問我兴喂,道長蔼囊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任衣迷,我火速辦了婚禮畏鼓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘壶谒。我一直安慰自己云矫,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布汗菜。 她就那樣靜靜地躺著让禀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪陨界。 梳的紋絲不亂的頭發(fā)上巡揍,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音菌瘪,去河邊找鬼腮敌。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的糜工。 我是一名探鬼主播斗这,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼啤斗!你這毒婦竟也來了表箭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤钮莲,失蹤者是張志新(化名)和其女友劉穎免钻,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體崔拥,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡极舔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了链瓦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拆魏。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖慈俯,靈堂內(nèi)的尸體忽然破棺而出渤刃,到底是詐尸還是另有隱情,我是刑警寧澤贴膘,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布卖子,位于F島的核電站,受9級特大地震影響刑峡,放射性物質(zhì)發(fā)生泄漏洋闽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一突梦、第九天 我趴在偏房一處隱蔽的房頂上張望诫舅。 院中可真熱鬧,春花似錦宫患、人聲如沸刊懈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俏讹。三九已至当宴,卻和暖如春畜吊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背户矢。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工玲献, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓捌年,卻偏偏與公主長得像瓢娜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子礼预,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容