草庐IT

基于Docker搭建JenkinsCICD流程

文景大大 2023-09-30 原文

本文目标:使用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,参见下一篇。

有关基于Docker搭建JenkinsCICD流程的更多相关文章

  1. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  2. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  3. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  4. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  5. ruby-on-rails - (Ruby,Rails) 基于角色的身份验证和用户管理...? - 2

    我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源

  6. ruby - 在 Rakefile 中动态生成 Rake 测试任务(基于现有的测试文件) - 2

    我正在根据Rakefile中的现有测试文件动态生成测试任务。假设您有各种以模式命名的单元测试文件test_.rb.所以我正在做的是创建一个以“测试”命名空间内的文件名命名的任务。使用下面的代码,我可以用raketest:调用所有测试require'rake/testtask'task:default=>'test:all'namespace:testdodesc"Runalltests"Rake::TestTask.new(:all)do|t|t.test_files=FileList['test_*.rb']endFileList['test_*.rb'].eachdo|task|n

  7. ruby - 如何使用 Ruby 基于字母数字字符串生成颜色? - 2

    我想要像“嘿那里”这样的东西变成,例如,#316583。我希望将任意长度的字符串“归结”为十六进制颜色。我不知道从哪里开始。我在想,每个字符串的MD5散列都是不同的-但如何将该散列转换为十六进制颜色数字? 最佳答案 你可以只取几位前几位:require'digest/md5'color=Digest::MD5.hexdigest('Mytext')[0..5] 关于ruby-如何使用Ruby基于字母数字字符串生成颜色?,我们在StackOverflow上找到一个类似的问题:

  8. 【自动驾驶环境感知项目】——基于Paddle3D的点云障碍物检测 - 2

    文章目录1.自动驾驶实战:基于Paddle3D的点云障碍物检测1.1环境信息1.2准备点云数据1.3安装Paddle3D1.4模型训练1.5模型评估1.6模型导出1.7模型部署效果附录show_lidar_pred_on_image.py1.自动驾驶实战:基于Paddle3D的点云障碍物检测项目地址——自动驾驶实战:基于Paddle3D的点云障碍物检测课程地址——自动驾驶感知系统揭秘1.1环境信息硬件信息CPU:2核AI加速卡:v100总显存:16GB总内存:16GB总硬盘:100GB环境配置Python:3.7.4框架信息框架版本:PaddlePaddle2.4.0(项目默认框架版本为2.3

  9. ruby-on-rails - 私有(private) gem 没有安装在 docker 中 - 2

    我正在尝试使用docker运行一个Rails应用程序。通过github的sshurl安装的gem很少,如下所示:Gemfilegem'swagger-docs',:git=>'git@github.com:xyz/swagger-docs.git',:branch=>'my_branch'我在docker中添加了keys,它能够克隆所需的repo并从git安装gem。DockerfileRUNmkdir-p/root/.sshCOPY./id_rsa/root/.ssh/id_rsaRUNchmod700/root/.ssh/id_rsaRUNssh-keygen-f/root/.ss

  10. ruby-on-rails - 将 Heroku 环境变量传输到 Docker 实例 - 2

    我在Heroku上构建了一个必须在Docker容器内运行的RoR应用程序。为此,我使用officialDockerfile.因为它在Heroku中很常见,所以我需要一些附加组件才能使这个应用程序完全运行。在生产中,变量DATABASE_URL在我的应用程序中可用。但是,如果我尝试其他一些使用环境变量(在我的例子中是Mailtrap)的加载项,变量不会在运行时复制到实例中。所以我的问题很简单:如何让docker实例在Heroku上执行时知道环境变量?您可能会问,我已经知道我们可以在docker-compose.yml中指定一个environment指令。我想避免这种情况,以便能够通过项目

随机推荐