前言:
1、Jenkins实现打包部署项目是自动化运维部署的基本知识,本章只为学习之用,对熟悉Jenkins流程有一定的帮助。
2、生产上强烈不建议部署Jenkins到Docker容器,切记!
总体流程
1、Jenkins - 2、拉取githup中仓库代码 - 3、打包Maven项目为Docker镜像文件 - 4、上传到目标服务器 - 5、执行目标服务器内的shell脚本,启动Docke容器
安装jdk1.8.0_261到宿主机
此处我们把jdk1.8.0_261安装到/home/calebit/Desktop/soft/jdk18/
目录下。
mkdir -p /home/calebit/Desktop/soft/jdk18/
cd /home/calebit/Desktop/soft/jdk18/
下载jdk过程略...
解压步骤略...
例:
unzip xxx.tar.gz
tar -zcxf xxx.tar.gz
安装 maven3.6.3到宿主机
1、此处我们把maven3.6.3安装到/home/calebit/Desktop/soft/
mkdir -p /home/calebit/Desktop/soft/
cd /home/calebit/Desktop/soft/
2、解压步骤略...
3、配置maven中央仓库地址,进入本地maven解压目录的 配置文件conf
目录:
cd /home/calebit/Desktop/soft/apache-maven-3.6.3/conf
4、由于maven默认中央仓库下载比较慢,我们可以更改maven仓库为阿里云中央仓库地址,我们可以 编辑 apache-maven-3.6.3/conf/settings.xml
文件, 更改本地仓库地址和增加阿里云中央仓库地址:
cp settings.xml settings.xml_bak
vim settings.xml
打开localRepository
节点,并且配置仓库目录/mydata/mavenRepository
,localRepository 的配置,可以理解成是Maven下载远程仓库的jar包存放到本地仓库的路径,此处配置成/mydata/mavenRepository
,后面我们可以通过增加挂载文件夹的方式,来和我们宿主机共享这个仓库。
<localRepository>/mydata/mavenRepository</localRepository>
在mirrors节点下增加以下内容
<mirrors>
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
</mirrors>
此处为了jenkins打包时候不再去中央仓库拉取jar包,如果我们在我们自己的Idea中打包过我们要发布的SpringBoot项目的话,我们就可以把本地的maven仓库文件(全部文件)上传到宿主机
/mydata/mavenRepository
目录下。这样Jenkins打包的时候,就不需要再次去中央仓库拉取需要的jar包了,加快了打包时间,拷贝过程略...
开启Docker Remote API
1、编辑 /lib/systemd/system/docker.service
,在ExecStart后开启。
vim /lib/systemd/system/docker.service
找到 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
后面添加-H tcp://0.0.0.0:2375
。。。。。
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
。。。。。
2、重新加载配置文件
systemctl daemon-reload
systemctl restart docker
3、关闭防火墙 或者 开启防火墙的端口
centos 开启防火墙端口:
#关闭防火墙
systemctl stop firewalld.service
# 禁止firewall开机启动
systemctl disable firewalld.service
# 或者允许固定端口
firewall-cmd --zone=public --add-port=2375/tcp --permanent
firewall-cmd --reload
ubantu 关闭防火墙
#关闭防火墙
sudo ufw disable
# 或者允许固定端口
sudo ufw allow 2375
#查看防火墙状态
sudo ufw status
以下正文开始...
Docker环境下安装Jenkins
本文自动拉取到的jenkins为Jenkins 2.249.1版本(2020年9月30日)。其他版本过低的话,可能初始化Jenkins插件的时候,会报一些版本过低的错误。会提示你升级Jenkins版本。
1、拉取最新的Jenkins的docker镜像
docker pull jenkins/jenkins:lts
2、 启动Jenkins容器
docker run -p 8080:8080 -p 50000:5000 --name jenkins \
-u root \
-v /mydata/jenkins_home:/var/jenkins_home \
-v /home/calebit/Desktop/soft/apache-maven-3.6.3:/maven/apache-maven-3.6.3 \
-v /home/calebit/Desktop/soft/jdk18/jdk1.8.0_261/:/jdk/jdk1.8.0_261 \
-v /mydata/mavenRepository:/mydata/mavenRepository \
-d jenkins/jenkins:lts
其中:
a、挂载目录/mydata/mavenRepository
为后面需要用到的 maven 仓库地址
b、挂载目录/mydata/jenkins_home
为 jenkins 安装配置文件地址
c、挂载目录/home/calebit/Desktop/soft/apache-maven-3.6.3
需提前下载好本地maven解压到宿主机/home/calebit/Desktop/soft/apache-maven-3.6.3
目录
d、挂载目录/home/calebit/Desktop/soft/jdk18/jdk1.8.0_261/
为 宿主机本地jdk目录。需提前下载解压到该目录
3、查看 jenkins初始密码(第一次访问jenkins需要用到这个管理员密码)
docker logs jenkins
## 本次测试,日志中的初始密码为:85d429ac39ee468e9d9d92776ee7c47f
配置jenkins
参考:
https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247484270&idx=1&sn=92bc35f7568e061059e58af919e75bde&scene=21#wechat_redirect
1、访问 htttp://192.168.23.135:8080
Please wait while Jenkins is getting ready to work ...
Your browser will reload automatically when Jenkins is ready.
等待启动完成,会提示输入管理员密码。此密码通过以下命令查看。
docker logs jenkins
2、输入日志里面获取的管理员密码:85d429ac39ee468e9d9d92776ee7c47f
3、首次进入jenkins需要下载推荐插件,点击左边第一项【安装推荐的插件】等待过程有点长,请耐心等待...
等待插件下载完成后,进入下一步。
4、创建一个管理员账号 admin
/ admin
..
5、输入实例配置url:htttp://192.168.23.135:8080
6、配置【全局工具配置】
【首页】-【系统管理】-【全局工具配置】-【JDK】-【jdk安装】-【新增JDK】
JDK别名:jdk1.8
JAVA_HOME:/jdk/jdk1.8.0_261
(注意,此处若出现 xxxx is not a directory on the Jenkins master (but perhaps it exists on some agents) 请确保挂载目录是否出错,如果出错,请参考附录内第3条新增挂载目录
),如果正确,此处可以不用勾选[自动安装]
同理。下拉该页面,配置 maven
【Maven】-【Maven安装】-【新增Maven】
Maven Name:Maven3.6.3
MAVEN_HOME:/maven/apache-maven-3.6.3
配置完毕,点击【保存】按钮保存。
7、安装ssh 插件
【首页】-【系统管理】-【插件管理】-【可选插件】里面搜索 和安装 Publish Over SSH
及 SSH plugin
插件,安装完毕,勾选重启jenkins ,重启即可。
8、配置【系统配置】
【首页】-【系统管理】-【系统配置】-【SSH remote hosts】-[SSH sites]新增加配置ssh登陆凭证
此步骤的主要作用是jenkins 打包镜像后,能够远程去登陆和执行脚本文件
Hostname:192.168.23.135
(需要登陆的服务器)
Port:22
(ssh登陆端口)
Credentials:登陆账号和密码(此处点击[添加]
按钮增加一个)
9、配置【Publish over SSH】
【首页】-【系统管理】-【系统配置】-【Publish over SSH】-[SSH Servers]
SSH Server Name:192.168.23.135
(随便起)
Hostname:192.168.23.135
Username:root
Remote Directory: /root
此处用密码登陆,需点击【高级】按钮,勾选【Use password authentication, or use a different key】
Passphrase / Password :root
编辑完成,点击【Test configuration】显示[success]即可,否则请验证密码
准备项目
主备一个SpringBoot项目,项目主要结构如下:
项目源码地址:https://github.com/liuxianzhong/jenkins-docker-demo
pom.xm
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
....
<!-- docker-maven-plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<imageName>docker-demo/${project.artifactId}:${project.version}</imageName>
<dockerHost>http://192.168.23.135:2375</dockerHost>
<baseImage>java:8</baseImage>
<entryPoint>["java", "-jar","/${project.build.finalName}.jar"]
</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
根据自己的IP更改 <dockerHost>http://192.168.23.135:2375
</dockerHost> 这个IP
DockerController.java
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DockerController {
static Log log = LogFactory.getLog(DockerController.class);
@RequestMapping("/")
public String index() {
log.info("Hello Jenkins Docker!");
return "Hello Jenkins Docker!";
}
}
配置启动脚本:
新增 jenkins启动容器的脚本文件 jenkins-docker-demo.sh
,到 /mydata/sh/
目录下
mkdir -p /mydata/sh/
cd /mydata/sh/
vim jenkins-docker-demo.sh
加入以下内容,并且保存
#!/usr/bin/env bash
app_name='jenkins-docker-demo'
docker stop ${app_name}
echo ----stop container success ----
docker rm ${app_name}
echo ----rm container success ----
echo ----clear old images... -----
clearImagesList=$(docker images -f "dangling=true" -q)
if [ ! -n "$clearImagesList" ]; then
echo "no images need clean up."
else
docker rmi $(docker images -f "dangling=true" -q)
echo "clear old images success"
fi
docker run -p 8990:8990 --name ${app_name} \
-v /etc/localtime:/etc/localtime \
-v /home/developer/app/logs/:/home/developer/app/logs/ \
-d docker-demo/${app_name}:1.0.0
echo ----start container success----
该脚本的主要功能是,自动启动 我们的镜像。
需要赋予jenkins-docker-demo.sh
脚本 可执行权限(很重要!,否则SpringBoot能打包上传成镜像,但可能启动不了容器):
chmod +x ./jenkins-docker-demo.sh
为了顺利启动Jenkins,(可能启动Jenkin时报错如下)(很重要!,否则可能启动不了容器):
touch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission denied
Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
这里是没有权限问题,需要执行:sudo chown -R 1000:1000 /mydata/jenkins_home
Jenkins新建项目
【首页】-【新建任务】-[输入一个任务名称] 下面输入:jenkins-docker-demo
, 选择【构建一个自由风格的软件项目】后点击【确定】
[源码管理]-[git]:
Repositories:
Repository URL: https://github.com/liuxianzhong/jenkins-docker-demo.git
(笔者可以自己搭建gitlab或者克隆该项目到自己的git仓库)
Credentials: (点击[添加
]按钮添加自己的git登陆账号和密码)
【构建】-【增加构建步骤】-【调用顶层Maven目标】
Maven 版本:Maven3.6.3(此处下拉选择之前配置的Maven3.6.3)
目标:package clean
【构建】-【增加构建步骤】-【Execute shell script on remote host using ssh】
SSH site: 下拉选择之前配置的 root@192.168.23.135
Command:/mydata/sh/jenkins-docker-demo.sh
(执行脚本路径)
构建
【首页】-【我的视图】-【jenkins-docker-demo】-【立即构建】
查看- [控制台输出] 内日志,提示
Successfully built 53900b85314d
Successfully tagged docker-demo/jenkins-docker-demo:1.0.0
[INFO] Built docker-demo/jenkins-docker-demo:1.0.0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 30.265 s
[INFO] Finished at: 2020-09-30T02:28:07Z
[INFO] ------------------------------------------------------------------------
[SSH] script:
/mydata/sh/jenkins-docker-demo.sh
[SSH] executing...
Error response from daemon: No such container: jenkins-docker-demo
Error: No such container: jenkins-docker-demo
----stop container success ----
----rm container success ----
----clear old images... -----
no images need clean up.
50d4402203ef2041a80ad943183113cd9b357f558c1118bdf9044203e8721549
----start container success----
[SSH] completed
[SSH] exit-status: 0
Finished: SUCCESS
访问
访问 http://192.168.23.135:8990/
如果返回:
Hello Jenkins Docker!
则整个部署成功!!
后记:
一、本文章仅供学习之用,生产环境强烈不建议把jenkins部署成docker容器。
二、githup地址:https://github.com/liuxianzhong/jenkins-docker-demo
三、 动态添加挂载目录 到固定的容器id
此处演示把本地的/mydata/mavenRepository
目录,挂载到jenkins容器的/mydata/mavenRepository
1、查询到 容器ID
docker ps -a
#记录 containerID
2、停止docker
systemctl stop docker
3、编辑容器文件hostconfig.json
cd /var/lib/docker/containers/容器id
cp hostconfig.json hostconfig.json_bak
vim hostconfig.json
添加以下内容到节点Binds:[]
,"/mydata/mavenRepository:/mydata/mavenRepository"
:
前为宿主机目录,:
后为容器目录。
4、编辑容器文件config.v2.json
cp config.v2.json config.v2.json_bak
vim config.v2.json
添加以下内容到节点MountPoints:[]
内(最好是格式化成一行,此处是为了好编辑)
,"/mydata/mavenRepository":{
"Source": "/mydata/mavenRepository",
"Destination": "/mydata/mavenRepository",
"RW": true,
"Name": "",
"Driver": "",
"Type": "bind",
"Propagation": "rprivate",
"Spec": {
"Type": "bind",
"Source": "/mydata/mavenRepository",
"Target": "/mydata/mavenRepository"
},
"SkipMountpointCreation": false
}
5、重启docker
systemctl start docker
四、原文参考地址:
五、对于自动化运维的东西还很多,目前主流的有K8s + Rancher + Jenkins/Jib的Idea插件+ Harbor + Git/GitLab(webhook:参考https://blog.csdn.net/qq_21768483/article/details/80177920
)等等,学无止境。希望本文对正在学习的你有一点点帮助。
六、重复造轮子的工作毫无意义,站在巨人的肩膀上能让人看得更远,我们能做的就是学习、学习、再学习!来,干了这碗鸡汤!!