基于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项目,基本内容如下:


    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创建的流水线,然后就能可视化地看到整个流水线的运行情况了。

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

你可能感兴趣的:(基于Docker搭建JenkinsCICD流程)