写这篇文章是对之前搭建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部署服务到远程服务器的更多相关文章

  1. IntelliJ IDEA自动部署项目至远程服务器与传统部署项目至远程服务器的区别

    每次开发Java项目时,对于所有Java开发人员来说,最枯燥的不是修改代码,而是实时将自己的代码上传至远程服务器,进行测试或者部署,本人最初开发也是这样,通过使用Xshell 5,WinSCP等工具对 ...

  2. 部署webservice到远程服务器

    在本地编写好webservice后并在本机验证正确后,在本地发布后,直接将发布时设置的文件夹复制到远程服务器上,在远程服务器的IIS上默认网站->新建虚拟目录->设置别名->物理路径 ...

  3. 使用IDEA部署项目到远程服务器

    1.选择Tools -> Deployment -> Configuration... 2.配置连接信息,Linux服务器一般都选择SFTP 3.配置本地上传文件路径.远程上传文件路径 4 ...

  4. AntDeploy一键发布netcore3.0Windows服务到远程服务器

    *:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !impor ...

  5. 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 ...

  6. git一键部署代码到远程服务器(linux)(采坑总结)

    原来一直使用FileZilla来代码部署,去年使用git,代码版本管理,真TM好用,一起回顾下历程! 一. 代码部署方式及思路: 1. 使用FTP/SFTP工具,上传代码 2. git人工部署.1. ...

  7. jenkins+saltstack+pipeline 部署springcloud 多模块jar包

    在jenkins上安装salt-master, pipeline{ agent{       node{               label 'master'               cust ...

  8. IDEA部署项目到远程服务器

    一.idea安装阿里插件Alibaba Cloud Toolkit 二.添加Host 三.应用部署 四.修改源程序重新部署 五.查看实时日志 欲买桂花同载酒,终不似,少年游

  9. [转]利用Jenkins的Pipeline实现集群自动化部署SpringBoot项目

    环境准备 Git: 安装部署使用略. Jenkins: 2.46.2版本安装部署略(修改jenkins执行用户为root,省得配置权限) JDK: 安装部署略. Maven: 安装部署略. 服务器免密 ...

随机推荐

  1. 好客租房12-JSX的注意点

    1.4注意点 1React元素的属性名使用驼峰式命名法 2特殊属性名 class-className for->htmlFor 3没有子节点可以用单标签表示 4使用小括号包裹jsx const ...

  2. Android 子线程 UI 操作真的不可以?

    作者:vivo 互联网大前端团队- Zhang Xichen 一.背景及问题 某 SDK 有 PopupWindow 弹窗及动效,由于业务场景要求,对于 App 而言,SDK 的弹窗弹出时机具有随机性 ...

  3. 做一个能对标阿里云的前端APM工具(下)

    上篇请访问这里做一个能对标阿里云的前端APM工具(上) 样本多样性问题 上一小节中的实施方案是微观的,即单次性的.具体的.但是从宏观上看,我需要保证性能测试是公允的,符合大众预期的.为了达到这种效果, ...

  4. Win10系统下怎么让局域网内其他电脑通过IP访问网站

    最近,有位win10系统用户在电脑上制作好网站后,希望能让局域网内的其他电脑通过IP直接访问自己电脑的网站,以便得到更好地测试效果.可是,该用户操作了很久都没成功.那么,我们如何配置win10电脑的I ...

  5. jQuery基础入门+购物车案例详解

    jQuery是一个快速.简洁的JavaScript代码库(或JavaScript框架).jQuery设计的宗旨是"write Less,Do More",即倡导写更少的代码,做更多 ...

  6. 详解TCP四次挥手(断开TCP连接过程)

    在讲述TCP四次挥手,即断开TCP连接的过程之前,需要先介绍一下TCP协议的包结构. TCP协议包结构: 这里只对涉及到四次挥手过程的字段做解释 (1) 序号(Sequence number) 我们通 ...

  7. 线性求 $i^i$ 的做法

    线性求 \(i^i\) 的做法 方便起见,我们记 \(f_i=i^i\),\(i\) 的最小质因子为 \(p=\mathrm{minp}(i)\),第 \(i\) 个质数为 \(\mathrm{pr} ...

  8. springcloud-- Alibaba-nacos--支持的几种服务消费方式

    通过<Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现>一文的学习,我们已经学会如何使用Nacos来实现服务的注册与发现,同时也介绍如何通过LoadBal ...

  9. java面试:关于public static void main(String[] args)是什么意思?

    它是作为JAVA中的主函数,所有java程序的运行起点就是这个方法,除了args这个名字可以不一样外,其他必须是这样. 主函数的一般写法如下: public static void main(Stri ...

  10. 想学设计模式、想搞架构设计,先学学UML系统建模吧您

    UML系统建模 1 概述 1.1 课程概述 汇集UML及其相关的一些话题 回顾UML相关的符号与概念 以电商订单相关业务为例,借助UML完成系统建模 将UML变成提升建模效率,表达架构思想的工具 1. ...