Jenkins使用pipeline部署服务到远程服务器
写这篇文章是对之前搭建Jenkins做的修改和完善,让jenkins更好的为我们服务
Docker搭建Jenkins服务
使用过程中遇到的问题:
为方便部署,打算将jenkins用到的jdk11、maven、gradle工具下载下来(方便以后部署使用),然后挂载到jenkins容器内部
在使用maven打包服务过程中,发现每次构建都要重新下载maven依赖,耗时间耗内存,将jenkins容器内的maven仓库做持久化存储
docker部署jenkins一般是使用jenkins/jenkins:lts-jdk11稳定版镜像,如出现插件下载失败,版本太老,可将容器内jenkins.war替换成最新版
容器时间和宿主机时间同步
docker启动容器限制内存策略。如果不限制会把内存都吃掉。
jenkins构建项目的数据持久化存储
最终的docker搭建jenkins脚本就变成:
docker run --name jenkins -p 8081:8080 -p 50000:50000 \
-u root --privileged=true -m 1G --memory-swap=3G \
-v /home/docker/server/jenkins/data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
-v /home/docker/server/jenkins/m2:/root/.m2 \
-v /home/docker/server/jenkins/gradle:/root/.gradle \
-v /home/docker/server/jenkins/pack/apache-maven-3.5.4:/usr/local/maven \
-v /home/docker/server/jenkins/pack/gradle6.4:/usr/local/gradle \
-v /home/docker/server/jenkins/pack/jdk1.8.0_171:/usr/local/jdk \
-v /home/docker/server/jenkins/pack/jdk-11.0.9:/usr/local/jdk11 \
-v /etc/localtime:/etc/localtime \
-d jenkins/jenkins:lts-jdk11
然后访问jenkins,安装插件:
Locale 汉化插件(如汉化不完全,下载此插件)
Maven Integration 构建maven项目插件
Publish over SSH 使用ssh免密登录到目标服务器
Deploy to container 用于部署war程序到tomcat中
git parameter 选择指定分支进行构建的功能
pipeline 流水线脚本
Pipeline Stage View Plugin 构建过程图示
配置jdk、maven、gradle环境变量
配置应用服务器地址及账号:
系统管理——>系统配置——> Publish over SSH

Pipeline脚本部署服务到远程服务器
新建流水线任务
进入任务配置—参数配置—git参数,选择代码分支
流水线语法—选择sshPublisher: Send build artifacts over SSH
点击生成流水线脚本,复制到任务的流水线脚本中


完整的流水线脚本如下:
#!/usr/bin/env groovy def desc_ip = "10.249.29.22"
def desc_path = "/server/temp"
def app_name = "ll-heat"
def app_file = "${app_name}-0.0.1-SNAPSHOT.jar"
def install_path = "/server/${app_name}"
def target_path = "target/"
def target_file = "target/${app_file}"
def log_file = "${app_name}.log"
def git_address = "https://git.ecashback.com.cn/zhenhongxue/ll-heat.git"
def git_auth = "fe896e04-3743-4931-83f8-32d716461388"
def JAVA_OPTS = "-Xms128m -Xmx256m -Xmn64m -Dfile.encoding=UTF8 -Dspring.profiles.active=test" pipeline {
agent any stages {
stage('拉取代码') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '${branch}']], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_address}"]]])
}
} stage('代码编译') {
steps {
sh """
pwd
JAVA_HOME=/usr/local/jdk
PATH=$JAVA_HOME/bin:/usr/local/maven/bin:$PATH
mvn clean package -Dmaven.test.skip=true
"""
}
} stage('远程启动服务') {
steps {
sshPublisher(publishers: [sshPublisherDesc(configName: "${desc_ip}", transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand:
"""
cd ${install_path}
pwd
ps -ef | grep ll-heat-0.0.1-SNAPSHOT.jar | grep -v grep |awk '{print \$2}' |xargs kill -9
mv ${desc_path}/${app_file} ./
java -jar ${JAVA_OPTS} ${app_file} >${log_file} &
""", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: "${desc_path}", remoteDirectorySDF: false, removePrefix: "${target_path}", sourceFiles: "${target_file}")], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)])
}
}
}
}
pipeline脚本需要注意:变量的使用需要加${},如果是在pipeline语法中生成的语句,变量的使用需要加双引号"${}"
脚本写完后会提示哪里有错误需要怎么改,要注意特殊字符需要转义处理,如'{print \$2}'需要转义
构建过程中遇到的错误:
1、SSH出错:IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:uLW/iHik7jxKZ6IRgRV7pfWAKuBgZGxInXba1aSb8hA.
Please contact your system administrator.
Add correct host key in /home/docker/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/docker/.ssh/known_hosts:3
ECDSA host key for 192.168.1.22 has changed and you have requested strict checking.
Host key verification failed.
原因:控制端保存的被控制端秘钥改变,导致SSH错误
解决方案:需要删除控制端保存的秘钥,然后重新SSH登录
cat ~/.ssh/know_hosts
删除文件中对应的主机和秘钥记录
ssh 192.168.1.22
输入密码就可以了
2、publish over ssh传输文件数为0
SSH: Connecting from host [test-22]
SSH: Connecting with configuration [test-22] ...
SSH: Disconnecting configuration [test-22] ...
SSH: Transferred 0 file(s)
Build step 'Send files or execute commands over SSH' changed build result to SUCCESS
Finished: SUCCESS
原因:源文件的位置没写对

解决:可以在构建日志里看到jenkins运行的位置和jar包位置

因为jenkins运行位置是/var/jenkins_home/workspaces/ll-heat,所以源文件jar包的位置应该写target/ll-heat-0.0.1-SNAPSHOP.jar
Jenkins使用pipeline部署服务到远程服务器的更多相关文章
- IntelliJ IDEA自动部署项目至远程服务器与传统部署项目至远程服务器的区别
每次开发Java项目时,对于所有Java开发人员来说,最枯燥的不是修改代码,而是实时将自己的代码上传至远程服务器,进行测试或者部署,本人最初开发也是这样,通过使用Xshell 5,WinSCP等工具对 ...
- 部署webservice到远程服务器
在本地编写好webservice后并在本机验证正确后,在本地发布后,直接将发布时设置的文件夹复制到远程服务器上,在远程服务器的IIS上默认网站->新建虚拟目录->设置别名->物理路径 ...
- 使用IDEA部署项目到远程服务器
1.选择Tools -> Deployment -> Configuration... 2.配置连接信息,Linux服务器一般都选择SFTP 3.配置本地上传文件路径.远程上传文件路径 4 ...
- AntDeploy一键发布netcore3.0Windows服务到远程服务器
*:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !impor ...
- k8s + docker + Jenkins使用Pipeline部署SpringBoot项目时Jenkins错误集锦
背景 系统版本:CentOS7 Jenkins版本:2.222.1 maven版本:apache-maven-3.6.3 Java版本:jdk1.8.0_231 Git版本:1.8.3.1 docke ...
- git一键部署代码到远程服务器(linux)(采坑总结)
原来一直使用FileZilla来代码部署,去年使用git,代码版本管理,真TM好用,一起回顾下历程! 一. 代码部署方式及思路: 1. 使用FTP/SFTP工具,上传代码 2. git人工部署.1. ...
- jenkins+saltstack+pipeline 部署springcloud 多模块jar包
在jenkins上安装salt-master, pipeline{ agent{ node{ label 'master' cust ...
- IDEA部署项目到远程服务器
一.idea安装阿里插件Alibaba Cloud Toolkit 二.添加Host 三.应用部署 四.修改源程序重新部署 五.查看实时日志 欲买桂花同载酒,终不似,少年游
- [转]利用Jenkins的Pipeline实现集群自动化部署SpringBoot项目
环境准备 Git: 安装部署使用略. Jenkins: 2.46.2版本安装部署略(修改jenkins执行用户为root,省得配置权限) JDK: 安装部署略. Maven: 安装部署略. 服务器免密 ...
随机推荐
- linux篇-linux awstats搭建
1安装lnmp模式 2安装awstats 2# tar xf awstats-6.5.tar.gz 解压下载到/root下的压缩包 mkdir /var/lib/awstats chmod 755 / ...
- MongoDB启动报错:Unrecognized option: storage try 'mongod --help' for more information(已解决)
问题说明: 今天在使用配置文件方式启动MongoDB时,一直启动失败,报错显示:Unrecognized option: storage try 'mongod --help' for more in ...
- vue项目|在弹窗中引入uchart图表子组件不显示
为了解决uchart作为子组件在主组件里引用但不显示的情况,(同样适用于弹窗之中)目前有三种方法. 1-解决方式 1>如果你使用的uchart子组件是从官方拿的例子:进入到uchart子组件将o ...
- python基础知识-day8(模块与包、random、os)
1.模块与包 package:相同的模块代码存储在一个目录下(即包里边会包含多个模块). 包不能存储在文件夹的目录下,模块名称不能使用关键字.(不包含工程文件夹) 2.模块与包的实例 1)在工程文 ...
- .NET6接入Skywalking链路追踪完整流程
一.Skywalking介绍 Skywalking是一款分布式链路追踪组件,什么是链路追踪? 随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求往往需要涉及到多个服务.互联网应用构建在不同的软 ...
- 原生实现.NET5.0+ 自定义日志
一.定义一个静态类 声明一个 ReaderWriterLockSlim 对象 用于并发控制 1 /// <summary> 2 /// IO锁 3 /// </summary> ...
- python小题目练习(六)
需求:编写一个猜数字的小游戏,随机生成1到10(包含1和10)之间的数字作为基准数,玩家每次通过键盘输入一个数字,如果输入的数字跟基准数相同,则闯关成功,否则重新输入,如果玩家输入的是-1,则表示退出 ...
- Python实现循环的最快方式,for和while到底谁更强
写在前面的一些P话: 大家都知道,效率不管是对于工作还是学习都是十分重要的.当然,Python也是需要效率的.众所周知,Python 不是一种执行效率较高的语言.此外在任何语言中,循环都是一种非常消耗 ...
- 排名前三——python 开源 IDE
写在前面的一些P话: Python无处不在 ,似乎它支持从主要网站到桌面实用程序到企业软件的所有功能. Python已经被用来编写流行的软件项目,如dnf / yum,OpenStack,OpenSh ...
- Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait -t nat -I DOCKER -i br-b1938128a963
报错信息:Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait ...

