前言
通过jenkins来实现从开发到提交到代码库从而触发jenkins自动打包maven项目,把打包好的jar包上传到资源服务器中,最后从资源服务器拿到jar包后部署到项目服务器中
1,通过docker部署jenkins项目
docker run --name jenkins -p 8080:8080 -u root -v /var/mydata/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker -d --restart always jenkins/jenkins
#--name :给运行的docker起一个名字,这里叫jenkins
#-p:指定端口,第一个8080是项目运行的端口,宿主机访问的端口,第二个8080是docker内运行jenkins的端口
# -u :用行jenkins时用root用户运行,如果不指定,则默认用的是jenkins用户,jenkins用户默认权限不足,如果要在jenkins中使用宿主机上的docker命令会提示没有权限
# -v :数据持久化,把docker内部的目录映射到宿主机上的目录,这里是把docker上的/var/jenkins_home数据和配置相关的目录映射到宿主机的/var/mydata/jenkins_home这个目录,两个目录的数据就可以共享
# -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker :把宿主机执行docker命令的目录映射到jenkins上的目录,这时就可以在jenkins上执行docker命令
#-d :后台运行docker
# --restart always :重启服务器后自动启用docker项目
#jenkins/jenkins :jenkins的镜像源名称,可以通过docker search xxx查询对应镜像的版本进行下载启用对应的镜像
docker 启用后可以用命令 docker logs -f xxx,查看对应docker的日志,xxx代表的是docker的启用的名称或id
启用docker后 输入宿主机上的IP:8080访问jenkins
2,安装对应的插件
-
Gitee Plugin:提交代码到gitee时可以触发jenkins自动构建
-
Maven Integration plugin :maven项目需要的插件
-
publish-over-ssh:打包好的包上传到远程服务器
搜索对应插件名称进行安装即可,安装好之后重启jenkins
3,配置对应的环境
在系统设置中配置gitee
在系统配置中配置Publish over SSH远程资源服务器,配置maven打包后上传到的资源服务器
方法一:通过key去连接,(推荐,安全)
#生成rsa密钥,回车
ssh-keygen -t rsa
#把公钥内容追加到认证文件中
cat id_rsa.pub >> authorized_keys
#授权
chmod 700 /root/.ssh
chmod 700 /root/.ssh/id_rsa
chmod 700 /root/.ssh/id_rsa.pub
chmod 600 authorized_keys
在 /root/.ssh 目录下生成两个密钥文件,需要把公钥追加到authorized_keys中:
id_rsa:私钥
id_rsa.pub:公钥
2、把 id_rsa 私钥内容添加到 Publish over SSH 的 key 中
- 配置的key是为了链接资源服务所需要的秘钥
- 在资源服务器上,使用命令生成秘钥ssh-keygen -t rsa
- 生成的秘钥在/root/.ssh下有对应秘钥id_rsa是私钥,id_rsa.pub是公钥,复制id_rsa中的秘钥粘贴到jenkins中的key字段中
-
配置SSH Servers的值,SSH Servers配置的是需要连接的资源服务器的IP和登录的账号和资源服务需要存放资源的目录
-
Name:随便起一个名字
-
Hostname:资源服务器对一个的ip
-
Username:资源服务器对应的账号
-
Remote Directory:远程存放资源的目录
- 配置好ssh后点击Test Configuration提示Success,说明链接成功
方法二:通过服务器连接密码,不安全
- 在系统工具中配置maven的settings的路径
- 安装maven环境
4,新建一个maven项目
gitee链接是在系统配置中配置的gitee
源码管理git是添加项目的git地址和对应的账户
Gitee WebHook 密码是在对应项目的gitee配置中找到Gitee WebHook ,添加jenkins生成的密码,配置后就可以实现提交代码后自动触发jenkins部署
勾选Delete workspace before build starts后,每次部署都会删除对应的工程下的所有内容
配置maven,选择对应的maven版本执行的打包命令以及pom文件的
- maven版本就是在系统配置中安装的的那个maven
- 目录:clean package -Dmaven.test.skip=true:执行打包操作,clean是清除之前打包的target文件,package 进行打包成jar包,-Dmaven.test.skip=true跳过执行test测试中的脚本
- pom.xml:配置需要指定的pom.xml的文件,配置的是项目pom所在的位置,当前位置是在工程所在的位置,也就是pom文件所在的目录,所以只需要配置pom.xml即可
配置打包好的jar包需要发送的远程服务器
- SSH Server:系统配置中配置的SSH Server的名称,点击高级出现Transfers等字段
- Source files:需要把那个文件发送到远程服务器,这里需要发送的打包好的jar包 ,打包好的jar包在target/目录下,所以配置的是target/*.jar,如果需要发送多个文件到资源服务器,可以用逗号隔开配置多个
- Remove prefix:上传后需要去除的路径。这里需要去除target
- Remote directory:远程的目录,就是在远程服务器上存放的jar所在的目录,位置是在系统配置的目录前提下的下级目录,之前系统配置的是/var/mydata/,这里配置的是maven,此时上传jar包后,就在var/mydata/maven目录下
- 勾选Verbose output in console,就是在执行的时候控制台打印日志
- Exec command在这个添加shell脚本用来启用jar包
问题汇总
- 使用jenkins执行shell脚本时,如果有nohup命令时,需要加上
BUILD_ID=dontKillMe
jenkins默认会在构建完成后,杀掉构建过程中由shell命令触发的衍生进程。
jenkins根据BUILD_ID识别某个进程是否为构建过程的衍生进程,故修改BUILD_ID后,jenkins就无法识别是否为衍生进程,则此进程能在后台保留运行。
结论就是Jenkins程序只负责运行伪命令行nuhup 命令,并不保证是否成功运行 nuhup后面的命令。
- 使用cp命令时,cp -rf xxx xxx 需要强制覆盖已有的文件,每次都会提示,用在jenkins时无法复制替换
原因是linux中的直接使用cp命令默认使用的是 cp -i,所以会每次提示
要不提示就用绝对路径的cp命令,此时用的就是cp 所以加上-rf就可以强制覆盖且不用提示
/bin/cp -rf xxxx xxxx
评论前必须登录!
注册