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: 安装部署略. 服务器免密 ...
随机推荐
- pip下载更改为清华镜像
step1: + 在user(用户)下新建一文件夹再在该文件夹下新建pip.ini文件 + 例如:user/pip/pip.ini + tips:如果未打开在查看里的隐藏扩展名记得打开 step2: ...
- 使用docker搭建jupyter notebook / jupyterlab
说明 由于官方镜像实在是不怎么好用,所以我自己做了一个优化过的jupyter notebook的镜像 notebook_hub,使用我这个镜像搭建容器非常简单,下面就基于这个notebook_hub来 ...
- Java内存分析——JavaSE基础
内存分析 堆:存放new的对象和数组,可以被所有线程共享,不会存放别的对象引用 栈 存放基本变量类型(会包含这个基本类型的具体数值) 引用对象的变量(会存放这个引用在堆里的具体地址) 方法区(属于堆的 ...
- Spring Security整合企业微信的扫码登录,企微的API震惊到我了
本文代码: https://gitee.com/felord/spring-security-oauth2-tutorial/tree/wwopen/ 现在很多企业都接入了企业微信,作为私域社群工具, ...
- 【Redis】哨兵初始化和主观下线
在的redis启动函数main(server.c文件)中,对哨兵模式进行了检查,如果是哨兵模式,将调用initSentinelConfig和initSentinel进行初始化,initServer函数 ...
- Python if-else的简单表示
常见写法 a = 1 b = 1 c = 2 if a == b: print("true") elif a == c: print("false") else ...
- 使用http://start.spring.io/构建maven微服务项目的几个坑及eclipse构建spring boot微服务项目
一,使用http://start.spring.io/构建maven微服务项目 本来嘛,直接构建的项目导入时没有任何问题的导入就可以运行,可是最近构建好项目,然后导入,种种报错 1.导入之后POM报错 ...
- 11.Firewalld防火墙
Firewalld防火墙 目录 Firewalld防火墙 Firewalld概述 Firewalld Firewalld和iptables的关系 netfilter Firewalld/iptable ...
- 搭建SVN服务器-腾讯云
检查服务器SVN服务器 svn --version 出现版本号说明已安装 安装SVN yum install subversion 创建版本库 svnadmin create /opt/svn/rep ...
- js 表面使用 表面学习 -输出
JavaScript 能够以不同方式"显示"数据: 使用 window.alert() 写入警告框 使用 document.write() 写入 HTML 输出 使用 innerH ...