基于Docker搭建JenkinsCICD流程

本文目标:使用Windows上安装的Docker来安装和运行Jenkins,并搭建基于本地代码仓库的CICD流程。要求熟悉Docker,并熟练使用基本的命令。

一、Jenkins的安装

建议参考官方的英文文档:Build a Java app with Maven (jenkins.io)需要注意,官方中文文档比较落后,且按照其教程并不能顺利搭建和启动Jenkins。

第一步,确认本地Docker已经完成安装,且容器类型为Linux Container,而非Windows Container,这个可以右击右下角Docker图标确认。

第二步,创建自定义网络:

docker network create jenkins

第三步,下载docker:dind镜像并启动容器,该镜像并非jenkins镜像,目的是为了能在后续启动的jenkins容器中能使用docker命令;

docker run 
# 自定义容器名称
--name jenkins-docker 
# 后台启动
--detach 
--privileged 
# 使用上一步创建的网络
--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文件,内容如下:

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"

然后在该目录下执行镜像的制作:

 docker build -t my-jenkins-blueocean:220930 .

第五步,基于刚制作的镜像启动jenkins容器:

docker run 
# 自定义容器名称
--name jenkins-blueocean 
# 后台启动
--detach 
# 加入第二步创建的网络
--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 
# 指定本机代码存放映射到容器内部的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就能出现jenkins的界面了。

二、Jenkins的配置

首先访问localhost:8080会出现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
*************************************************************
*************************************************************
*************************************************************

然后会出现插件安装界面,由于我们是新手,因此按照建议,安装推荐的插件。随后创建第一个超管账号,一路确定点击下去,直至出现Jenkins已就绪的字样,就代表Jenkins已经配置好了。

三、流水线的创建与配置

3.1 准备代码仓库

start.spring.io上新建一个SpringBoot项目,基本内容如下:

<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 创建流水线

在Jenkins上新建一个Job,名称自定义,此处为first-java-mave-app,类型为流水线类型,然后下一步进入到配置界面,描述信息随便填写,主要是流水线的配置需要填写内容如下:

  • 定义:选择Pipeline script from SCM
  • SCM类型选择Git
  • Repository URL填写代码仓库映射到容器中的路径,此处为/home/java-cicd-test,然后jenkins会自动校验该目录是否为一个代码仓库目录;

其它配置皆保持默认不动,保存即可。

3.3 配置流水线

我们在上一步选择了Pipeline script from SCM,意思就是由代码仓库中的jenkinsfile来定义和配置流水线。在代码根目录下新建jenkinsfile,内容如下:

pipeline {
    agent {
        # 使用docker容器作为代理来执行具体的作业
        docker {
            # 使用maven的某个版本镜像启动一个临时的容器应用(建议先docker pull下来再继续后续操作)
            image 'maven:3.8.1-adoptopenjdk-11'
            # 将本机上的maven仓库挂载到maven临时容器中,避免每次构建maven都去下载依赖
            args '-v D:/maven-repo:/root/.m2'
        }
    }
    stages {
        stage('Build') {
            steps {
                # 该阶段需要执行的任务
                sh 'mvn -B -DskipTests clean package'
            }
        }
    }
}

然后需要暂存和提交到本地仓库中。

我们回到Jenkins的网页上,打开Blue Ocean,点击执行3.2创建的流水线,然后就能可视化地看到整个流水线的运行情况了。

jenkins运行流水线
jenkins流水线执行步骤
jenkins流水线查看每个步骤的运行详情

如果本地没有下载过maven镜像,那么此处会运行很久,因为默认是从DockerHub下载,国内速度会比较慢,等个半小时一小时都正常,可以在如下位置修改Docker Registry的地址,改为从国内的镜像仓库下载,该地址可以从阿里云中获取自己特定的地址:容器镜像服务 (aliyun.com)

jenkins修改Docker镜像下载地址

按照官方的教程,此处流水线就可以执行成功了,后面是增加test和deploy的阶段,但是这步骤实际实验下来,卡在两个地方:

  • maven镜像即使外部docker pull下来了,此处还是会重复下载,等待时间超级长,无法忍受;

  • 即使镜像下载完毕,在启动容器的时候会报错:

    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,参见下一篇。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,417评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,921评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,850评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,945评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,069评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,188评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,239评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,994评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,409评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,735评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,898评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,578评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,205评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,916评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,156评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,722评论 2 363
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,781评论 2 351

推荐阅读更多精彩内容