写这篇文章是对之前搭建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. 130_传析阅管理系统accdb64位版本

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 几年前笔者针对家居门店的进销存.人员管理.工资管理.任务系统.门店经营盈亏管理.销售分析.考勤请假等息息相关的业务基于Ac ...

  2. 学习Java的第十七天——大数字运算

    学习内容:大数字运算 代码实现: package 数字处理类; import java.math.BigInteger; public class BigIntegerDemo { public st ...

  3. 【万字长文】使用 LSM Tree 思想实现一个 KV 数据库

    目录 设计思路 何为 LSM-Treee 参考资料 整体结构 内存表 WAL SSTable 的结构 SSTable 元素和索引的结构 SSTable Tree 内存中的 SSTable 数据查找过程 ...

  4. Vue2-组件通讯传值

    Vue2组件通讯传值 方法 Slot插槽--父向子内容分发,子组件只读 mixin混入--定义公共变量或方法,mixin数据不共享,组件中mixin实例互不影响 provide+inject--依赖注 ...

  5. Activate-or-Not:learning-customized-activation

    关于activate-or-Not的PPT paper code step1 step2 step3 step4 step5 step6 step7 step8 step9 step10

  6. C# 与LINQ有关的语言特性

    1.隐式类型 我们知道强类型语言 C  C++ C#  Java 对变量的定义前必须要确定这个变量是什么类型的   例如  string str="abc";    int num ...

  7. 一个恢复CSI挂载信息的解决方法

    一个恢复CSI挂载信息的解决方法 问题描述 之前有做过一个华为OBS 的CSI插件,其基本运作原理如下图所示.CSI插件Pod挂载了主机的/var/lib/kubelet/pods目录,当创建挂载Pv ...

  8. C++:小包包的玩具

    小包包的玩具 时间限制 : 1.000 sec        内存限制 : 128 MB 题目描述: 小包包最讨厌的是整理他自己的玩具,为此,他制造了一个伟大的发明:玩具传送门!利用这个传送门,他可以 ...

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

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

  10. 以脚本形式运行python库

    技术背景 当我们尝试运行python的帮助文档时,会看到如下这样的一个说明: $ python3 -h usage: python3 [option] ... [-c cmd | -m mod | f ...