本文目标:使用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项目,基本内容如下:
org.springframework.boot
spring-boot-starter-web
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
@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创建的流水线,然后就能可视化地看到整个流水线的运行情况了。
如果本地没有下载过maven镜像,那么此处会运行很久,因为默认是从DockerHub下载,国内速度会比较慢,等个半小时一小时都正常,可以在如下位置修改Docker Registry的地址,改为从国内的镜像仓库下载,该地址可以从阿里云中获取自己特定的地址:容器镜像服务 (aliyun.com)
按照官方的教程,此处流水线就可以执行成功了,后面是增加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,参见下一篇。