本文目标:使用Windows上安装的Docker来安装和运行Jenkins,并搭建基于本地代码仓库的CICD流程。要求熟悉Docker,并熟练使用基本的命令。
建议参考官方的英文文档: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的界面了。
首先访问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已经配置好了。
从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仓库里面,此处不是本文重点,略过。
在Jenkins上新建一个Job,名称自定义,此处为first-java-mave-app,类型为流水线类型,然后下一步进入到配置界面,描述信息随便填写,主要是流水线的配置需要填写内容如下:
Pipeline script from SCM
/home/java-cicd-test,然后jenkins会自动校验该目录是否为一个代码仓库目录;其它配置皆保持默认不动,保存即可。
我们在上一步选择了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,参见下一篇。
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/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
我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源
我正在根据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
我想要像“嘿那里”这样的东西变成,例如,#316583。我希望将任意长度的字符串“归结”为十六进制颜色。我不知道从哪里开始。我在想,每个字符串的MD5散列都是不同的-但如何将该散列转换为十六进制颜色数字? 最佳答案 你可以只取几位前几位:require'digest/md5'color=Digest::MD5.hexdigest('Mytext')[0..5] 关于ruby-如何使用Ruby基于字母数字字符串生成颜色?,我们在StackOverflow上找到一个类似的问题:
文章目录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
我正在尝试使用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
我在Heroku上构建了一个必须在Docker容器内运行的RoR应用程序。为此,我使用officialDockerfile.因为它在Heroku中很常见,所以我需要一些附加组件才能使这个应用程序完全运行。在生产中,变量DATABASE_URL在我的应用程序中可用。但是,如果我尝试其他一些使用环境变量(在我的例子中是Mailtrap)的加载项,变量不会在运行时复制到实例中。所以我的问题很简单:如何让docker实例在Heroku上执行时知道环境变量?您可能会问,我已经知道我们可以在docker-compose.yml中指定一个environment指令。我想避免这种情况,以便能够通过项目