文章目录

  • 1. 安装部署
    • 1.1 环境准备
    • 1.2 启动与访问
    • 1.3 插件安装
    • 1.4 全局工具配置
    • 1.5 安全配置
    • 1.6 踩坑
  • 2. ssh免密登录
    • 2.1 获取本地客户端机器的公钥
    • 2.2 把生成的公钥发送到对方的主机上去
    • 2.3 测试
    • 2.4 免密登录不生效问题解决
  • 3. 流水线简单例子
    • 3.1 新建任务
    • 3.2 流水线
  • 4. 流水线简单例子
    • 4.1 新建任务
    • 4.2 构建触发器
    • 4.3 流水线

1. 安装部署

1.1 环境准备

本说明是针对使用需要Java 8的Jenkins发行版。还建议使用超过512MB RAM的系统,并且在安装jenkins的服务器先装好以下环境

  • Java 8(JRE或JDK)
  • git
  • maven 3.5+
  • 512MB可用内存
  • 1GB +可用磁盘空间

下载Jenkins:

http://mirrors.jenkins.io/war/latest/jenkins.war

1.2 启动与访问

1.创建启动文件start.sh

nohup  java -Dhudson.util.ProcessTree.disable=true -jar jenkins.war --httpPort=8080 >> nohup.out 2>&1 &

-Dhudson.util.ProcessTree.disable=true 参数意思为:禁止Jenkins在Job构建过程结束后认为将kill掉未执行完的子进程

https://wiki.jenkins.io/display/JENKINS/ProcessTreeKiller

2.启动

sh start.sh

3.访问

http://192.168.28.134:8080

1.3 插件安装

1.首次登录时候的插件安装,进入选择插件安装界面,选择第一个(Install suggested plugins):

2.另外的推荐安装的插件
进入系统管理 -> 插件管理 -> 可选插件

  • Blue Ocean:pipeline流水线的增强插件
  • Gitee Plugin:支持码云的插件
  • Extended Choice Parameter Plug-In:参数化构建参数扩展

1.4 全局工具配置

1.Maven 配置,配置maven的settings.xml路径:

2.Jdk 配置

3.Git 配置

4.Maven 配置

1.5 安全配置

1.配置匿名可读权限

2.取消跨站请求伪造保护

1.6 踩坑

Jenkins中无法启动子进程的解决办法

场景如下:

  • 在Jenkins中新建了一个Job,假设你在一些列Build Step之前/之后,启动了一个进程,打个比方说启动一个Jboss进程。等到Build完成,你去Console Output中查看显示启动成功,甚至PID也有了。但是当你去后台查看的时候,发现其实这个进程根本不存在,并没有启动成功。因为它没有关闭继承的文件描述符,Jenkins在Job构建过程结束后认为Jboss进程未终止,因而将其kill掉了。

解决办法(启动时添加禁用参数):

nohup  java -Dhudson.util.ProcessTree.disable=true -jar jenkins.war --httpPort=8080 >> nohup.out 2>&1 &

2. ssh免密登录

在centos里配置免密登录之后,方便Jenkins通过ssh连接服务器操作

2.1 获取本地客户端机器的公钥

1.先看看是不是已经有了,如果有内容就忽略第二步

cat ~/.ssh/id_rsa.pub

2.如果上一步没有这个文件我们就创建一个,运行下面命令生成(邮箱改成自己的),一路回车就好了

ssh-keygen -t rsa -C "youremail@example.com"

2.2 把生成的公钥发送到对方的主机上去

用ssh-copy-id命令,自动保存在对方主机的/root/.ssh/authorized_keys文件中去,ip地址改成需要免密登录的服务器地址

ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.28.130

2.3 测试

ssh 192.168.28.130

2.4 免密登录不生效问题解决

一般来讲失败的原因有两个:目录文件的权限和目录的属主

1,目录文件的权限

  • .ssh父目录的权限是755(我的是/root),.ssh目录权限是700,authorized_keys文件 600
chmod 755 /root
chmod 700 /root/.ssh
chmod 600 /root/.ssh/authorized_keys

2.目录的属主

  • 如果上面方法还没有解决问题,那可能是.ssh父目录的属主存在问题。
[root@node1 ~]# ls -al .ssh
total 12
drwx------   2 root root    80 Nov  3 10:07 .
drwxr-xr-x. 11 hdfs users 4096 Nov  3 09:38 ..
-rw-------   1 root root     0 Nov  3 10:06 authorized_keys
-rw-------   1 root root  1679 Nov  3 09:38 id_rsa
-rw-r--r--   1 root root   390 Nov  3 09:38 id_rsa.pub
-rw-r--r--   1 root root     0 Nov  3 10:07 known_hosts

这里发现.ssh父目录(…)的属主存在问题,修改如下:

[root@node1 ~]# chown root:root /root
[root@node1 ~]# ls -al .ssh
total 16
drwx------   2 root root   80 Nov  3 10:07 .
drwxr-xr-x. 11 root root 4096 Nov  3 09:38 ..
-rw-------   1 root root 1135 Nov  3 10:11 authorized_keys
-rw-------   1 root root 1679 Nov  3 09:38 id_rsa
-rw-r--r--   1 root root  390 Nov  3 09:38 id_rsa.pub
-rw-r--r--   1 root root    0 Nov  3 10:07 known_hosts

3. 流水线简单例子

Jenkins从根本上讲是一种支持多种自动化模式的自动化引擎。Pipeline在Jenkins上添加了一套强大的自动化工具,支持从简单的连续集成到全面的连续输送Pipeline的用例。通过建模一系列相关任务,用户可以利用Pipeline 的许多功能:

  • 代码:Pipeline以代码的形式实现,通常被检入源代码控制,使团队能够编辑,审查和迭代其传送流程。
  • 耐用:Pipeline可以在计划和计划外重新启动Jenkins管理时同时存在。
  • Pausable:Pipeline可以选择停止并等待人工输入或批准,然后再继续Pipeline运行。
  • 多功能:Pipeline支持复杂的现实世界连续交付要求,包括并行分叉/连接,循环和执行工作的能力。
  • 可扩展:Pipeline插件支持其DSL的自定义扩展 以及与其他插件集成的多个选项。

3.1 新建任务

新建任务 -> 流水线

General:通常情况下默认就行了

构建触发器:如果需要通过git触发构建的话需要勾选触发远程构建和填写身份验证令牌,详细的git触发配置请看 webhook配置。

3.2 流水线

1.选择Pipeline script

2.本项目演示环境的pipeline脚本

下面的脚本仅供参考
是建立在目标服务器和git都已经做了免密登录的环境下

pipeline {agent anyenvironment {REPOSITORY="https://gitee.com/zlt2000/microservices-platform.git"t_dir="/opt/application/microservices-platform"t_ssh="root@120.78.94.191"api_url="120.78.94.191:9900"sonar_url="120.78.94.191:9000"}stages {stage('获取代码') {steps {echo "start fetch code from git:${REPOSITORY}"deleteDir()git "${REPOSITORY}"}}stage('代码静态检查') {steps {echo "start code check"sh "mvn clean compile sonar:sonar -Dsonar.host.url=http://${sonar_url}"}}stage('单元测试') {steps {echo "start test"sh "mvn test"junit '**/target/surefire-reports/TEST-*.xml'}}stage('打包') {steps {echo "start package"sh "sed -i 's/127.0.0.1:9900/${api_url}/g' zlt-web/back-web/src/main/resources/static/module/apiUrl.js"sh "mvn package -Dmaven.test.skip=true"}}stage('部署') {steps {echo "start deploy"sh "ssh ${t_ssh} rm -f ${t_dir}/*.jar"script {def apps = ['zlt-business/*', 'zlt-gateway/zuul-gateway', 'zlt-job/job-admin', 'zlt-job/job-executor-samples', 'zlt-monitor/*', 'zlt-uaa', 'zlt-web/*']for (int i = 0; i < apps.size(); ++i) {sh "scp ${apps[i]}/target/*.jar ${t_ssh}:${t_dir}"}}}}stage('重启') {steps {echo "start restart"script {def apps = ['zlt-uaa', 'user-center', 'file-center', 'zuul-gateway', 'log-center', 'code-generator', 'job-admin', 'job-executor-samples']for (int i = 0; i < apps.size(); ++i) {sh "ssh ${t_ssh} 'cd ${t_dir};sh shutdown.sh ${apps[i]}'"if ("${apps[i]}" == 'sc-admin') {sleep 60} else {sleep 30}sh "ssh ${t_ssh} 'cd ${t_dir};sh start.sh ${apps[i]}'"}}}}}post {always {echo '构建结束...'}success {echo '恭喜您,构建成功!!!'}failure {echo '抱歉,构建失败!!!'}unstable {echo '该任务已经被标记为不稳定任务....'}changed {echo ''}}
}

3.目标服务器的shutdown.sh内容

pid=`ps ax | grep -i $1 |grep java | grep -v grep | awk '{print $1}'`
if [ -z "$pid" ] ; thenecho "No $1 running."
fi
echo "The $1(${pid}) is running..."
kill ${pid}
echo "Send shutdown request to $1(${pid}) OK"

4.目标服务器的start.sh内容

nohup java -Dspring.profiles.active=test -Dzlt.nacos.server-addr=120.78.94.191:8848 -jar -Xmx256M -Xms256M $1.jar >> /dev/null 2>&1 &

4. 流水线简单例子

在构建的时候通过参数控制构建行为

4.1 新建任务

新建任务 -> 流水线

General:勾选参数化构建过程,添加参数:

4.2 构建触发器

如果需要通过git触发构建的话需要勾选触发远程构建和填写身份验证令牌
详细的git触发配置请看 webhook配置

4.3 流水线

1.选择Pipeline script

2.本项目演示环境的pipeline脚本

下面的脚本仅供参考
是建立在目标服务器和git都已经做了免密登录的环境下

脚本里的参数service_namesproject_version就是通过构建时传进去的:

pipeline {agent anyenvironment {git_addr="https://gitee.com/zlt2000/microservices-platform.git"target_dir="/opt/application/microservices-platform"target_ssh="root@120.78.94.191"api_url="120.78.94.191:9900"sonar_url="192.168.28.134:9000"backup_dir="/opt/app/backup"}stages {stage('获取代码') {steps {echo "start fetch code from git:${git_addr}"deleteDir()git "${git_addr}"}}stage('代码静态检查') {when {environment name:'is_test', value:'是'}steps {echo "start code check"sh "mvn clean compile sonar:sonar -Dsonar.host.url=http://${sonar_url}"}}stage('单元测试') {when {environment name:'is_test', value:'是'}steps {echo "start test"sh "mvn test"junit '**/target/surefire-reports/TEST-*.xml'}}stage('打包') {steps {echo "start package"sh "sed -i 's/127.0.0.1:9900/${api_url}/g' zlt-web/back-web/src/main/resources/static/module/apiUrl.js"sh "mvn package -Dmaven.test.skip=true"}}stage('部署') {steps {echo "start deploy"sh '''if [ ! -d "${backup_dir}/${project_version}" ];thenmkdir -p ${backup_dir}/${project_version}fi'''script {def apps = "${service_names}".split(",")for (int i = 0; i < apps.size(); ++i) {if ("${apps[i]}" == 'zlt-uaa') {service_path = ''} else {service_path = '*/'}sh "rm -f ${backup_dir}/${project_version}/${apps[i]}.jar"sh "cp "+service_path+"${apps[i]}/target/*.jar ${backup_dir}/${project_version}/"sh "ssh ${target_ssh} rm -f ${target_dir}/${apps[i]}.jar"sh "scp "+service_path+"${apps[i]}/target/*.jar ${target_ssh}:${target_dir}"}}}}stage('重启') {steps {echo "start restart"script {def apps = "${service_names}".split(",")for (int i = 0; i < apps.size(); ++i) {sh "ssh ${target_ssh} 'cd ${target_dir};sh shutdown.sh ${apps[i]}'"if ("${apps[i]}" == 'sc-admin') {sleep 60} else {sleep 30}sh "ssh ${target_ssh} 'cd ${target_dir};sh start.sh ${apps[i]}'"}}}}}post {always {echo '构建结束...'}success {echo '恭喜您,构建成功!!!'}failure {echo '抱歉,构建失败!!!'}unstable {echo '该任务已经被标记为不稳定任务....'}changed {echo ''}}
}

3.目标服务器的shutdown.sh内容

pid=`ps ax | grep -i $1 |grep java | grep -v grep | awk '{print $1}'`
if [ -z "$pid" ] ; thenecho "No $1 running."
fi
echo "The $1(${pid}) is running..."
kill ${pid}
echo "Send shutdown request to $1(${pid}) OK"

4.目标服务器的start.sh内容:

nohup java -Dspring.profiles.active=test -Dzlt.nacos.server-addr=120.78.94.191:8848 -jar -Xmx256M -Xms256M $1.jar >> /dev/null 2>&1 &

微服务轮子项目(45) -Jenkins自动化部署相关推荐

  1. 微服务轮子项目(53) -理论小结

    文章目录 1. 概述 2. 基础知识 2.1 整体架构 2.2 分布式事务 2.3 Sentinel限流熔断 3. 架构设计 3.1 服务认证架构设计 3.2 日志架构设计 3.3 监控架构设计 3. ...

  2. 微服务轮子项目(49) -常见JVM内存错误及解决方案

    文章目录 1. Java heap space 1.1 原因分析 1.2 解决方案 2. GC overhead limit exceeded 3. Permgen space 3.1 原因分析 3. ...

  3. [转]微服务轮子项目(27) -MySQL 主从复制、主从切换、主主复制

    文章目录 1. 主从复制 1.1 主库安装 1.1.1 创建配置文件 1.1.2 启动主库 1.1.3 主库创建用于同步的账号 1.2 从库安装 1.2.1 创建配置文件 1.2.2 启动从库 1.2 ...

  4. 基于Jenkins自动化部署spring boot项目

    1. 使用Jenkins来实现微服务架构下的自动化部署! 在微服务架构中,随着项目拆分越来越细,导致服务越来越多,服务的打包部署就会成为一个相当麻烦的事情.在我之前工作的公司都是本地打包好,上传到服务 ...

  5. Jenkins自动化部署前端Vue项目

    Jenkins自动化部署前端Vue项目 前言 安装NodeJs 下载NodeJs 安装NodeJs npm配置 Jenkins配置NodeJs 安装NodeJs插件 配置NodeJs 新建及配置任务 ...

  6. 前端项目jenkins自动化部署

    项目打包和自动化部署 一. 项目部署和DevOps 1.1. 传统的开发模式 在传统的开发模式中,开发的整个过程是按部就班就行: 但是这种模式存在很大的弊端: 工作的不协调:开发人员在开发阶段,测试和 ...

  7. 利用Jenkins自动化部署springboot项目到阿里云服务器(centos8)

    背景: 最近想部署一个springboot项目到阿里云服务器里面.捣鼓了很久,构建了很多次,都失败了!实在是一脸辛酸,有点气馁~ 在此想记录一下构建的过程. 不了解Jenkins之前,觉得Jenkin ...

  8. Jenkins自动化部署-配置项目(下)

    一.新建项目,设置Git地址,账号密码. 多种方式,ssh方式,需要配置私钥. 第1个错误:Git没安装 Linux机器上,先安装Git软件. CentOs系统,yum install git git ...

  9. Jenkins自动化部署Vue项目

    Jenkins自动化部署Vue项目 jenkins介绍 Jenkins是开源的,使用Java编写的持续集成的工具,在Centos上可以通过yum命令行直接安装.Jenkins只是一个平台,真正运作的都 ...

最新文章

  1. GROMACS运行参数之nvt.mdp文件详解
  2. HTML和javascript 第二天
  3. ISA CMAK 网络访问隔离区
  4. 【转】1.1异步编程:线程概述及使用
  5. 《Java8实战》笔记汇总
  6. 去年下半年blog文章导入完毕
  7. 《设计模式详解》结构型模式 - 组合模式
  8. ServiceManager学习框图
  9. 大数据时代,海量数据处理常用思路和方法总结
  10. 实习踩坑之路:实习以来获得的踩坑经验、一些提升开发效率的方法或者常用技巧
  11. git 内网搭建_Gitlab搭建内网服务器
  12. 关于计算机的小故事英语作文,关于小故事英语作文阅读
  13. 关于滚动贯穿的解决方案
  14. 链游和元宇宙大热,互联网游戏从业者们如何看待它们? |链捕手
  15. cdr 表格自动填充文字_长期伏案于表格,查看数据时你需要一个聚光灯效果
  16. 用python对excel进行打印操作
  17. 有关振动试验夹具的问题
  18. Tomcat脚本一键装机
  19. androidStudio分包引起的系统崩溃,报错ClassNotFoundException: Didn‘t find class “XXXView“ on path: DexPath../.apk
  20. hadoop集群搭建

热门文章

  1. python网球比赛模拟主持稿_模拟讲课大赛主持人稿
  2. Odoo ERP 14 客户关系管理
  3. python win32 模拟按键
  4. 河南理工大学 计算机 研究生就业,河南理工大学好就业吗?附河南理工大学就业率最高的专业名单...
  5. Oracle数据库命名编码规范
  6. smartGit系列之长期使用批处理脚本
  7. ksy是谁_MOON,sky他们是谁啊?
  8. python中area是什么意思_area是什么意思??????
  9. 上海亚商投顾:沪指探底回升 供销社、新冠检测概念领涨
  10. Mac Terminal (终端) 使用ssh快速登录远程服务器