jenkins结合ansible用shell实现自动化部署和回滚

GitLab + Jenkins 日常操作 通过发布时备份,回滚时选定备份文件进行回滚。echo “版本号为:$Version”现在我们将 GitLab 远程仓库中的。现在我们将 GitLab 远程仓库中的。1.通过 SSH Plugin 插件。echo “发布前进行打包备份…echo “这是一个回退操作…二、Jenkins 实现邮件报警。一、Jenkins 回滚操作。2.通过 Build 来回滚。2.通过 Shell 命令。1.通过 Git 来回滚。进行修改,再次进行发布。进行修改,再次进行发布。3.通过 Ansible。echo “回退完成” 阅读详情

  最近用jenkins+gitlab+ansible做持续化集成,自动化部署和版本回滚。然而deploy plugin没能做到增量升级和回滚操作,折腾了很久决定自己写个脚本来简单实现。

  环境:

centos 7.0 64位
gitlab:v2.9.0
git:2.9
jenkins 1.651.3、git plugin、GitLab Plugin、Dynamic Parameter Plug-in等
ansible:2.1.0.0

  各工具职能:

  1、gitlab做版本管理
  2、jenkins根据指定参数,分别执行部署或回滚操作;以及执行结果的展现和记录。
  3、ansible负责脚本的远程执行。

  以下的所有操作都是在上述条件安装完成且可用的前提下进行。

  部署脚本:

复制代码
#!/bin/sh
#说明
show_usage="args: [-l , -r , -b , -w]\
                                  [--local-repository=, --repository-url=, --backup-dir=, --webdir=]"
#参数
# 本地仓库目录
opt_localrepo=""

# git仓库url
opt_url=""

# 备份目录
opt_backupdir=""

# web目录
opt_webdir=""

GETOPT_ARGS=`getopt -o l:r:b:w: -al local-repository:,repository-url:,backup-dir:,webdir: -- "$@"`
eval set -- "$GETOPT_ARGS"
#获取参数
while [ -n "$1" ]
do
        case "$1" in
                -l|--local-repository) opt_localrepo=$2; shift 2;;
                -r|--repository-url) opt_url=$2; shift 2;;
                -b|--backup-dir) opt_backupdir=$2; shift 2;;
                -w|--webdir) opt_webdir=$2; shift 2;;
                --) break ;;
                *) echo $1,$2,$show_usage; break ;;
        esac
done

if [[ -z $opt_localrepo || -z $opt_url || -z $opt_backupdir || -z $opt_webdir ]]; then
        echo $show_usage
        echo "opt_localrepo: $opt_localrepo , opt_url: $opt_url , opt_backupdir: $opt_backupdir , opt_webdir: $opt_webdir"
        exit 0
fi

# 部署脚本所在目录
scriptdir=`pwd`/jenkinsdeploy/
mkdir -p $scriptdir

# 当前部署版本号
currversion=$scriptdir/currentversion.txt

# 上次部署版本
lastversion=$scriptdir/lastversion.txt
if [ ! -f "$lastversion" ];then
        echo "" > $lastversion
fi

# git commit日志
gitcommitlog=$scriptdir/gitcommitlog.txt

# 两个版本间差异文件列表
difffile=$scriptdir/difffile.txt

#if [ "$repodif" == "" ];then
#        echo "仓库本地目录不能为空,请输入本地仓库目录参数!"
#        exit 1
#fi

# 切换到本地版本库目录
cd $opt_localrepo
# 更新代码
git pull $opt_url
# 获取commit日志
git log --pretty=format:"%H" > $gitcommitlog

# 获取当前commit版本
currentcommit=`head -1 $gitcommitlog`
echo "current commit id: $currentcommit"

# 上一次部署的commit id
lastdeployid=`head -1 $lastversion`
echo "lastdeployid: $lastdeployid"

if [ "$lastdeployid" = "" ];then
        lastdeployid=`tail -1 $gitcommitlog`
        echo "lastdeployid: $lastdeployid"
fi

if [ "$lastdeployid" = "$currentcommit" ];then
        echo "与上次部署的版本id相同,$currentcommit,不作部署操作。"
        exit
fi

# 获取两个版本间差异的文件列表
echo "pwd: `pwd`"
git diff $lastdeployid $currentcommit --name-only > $difffile
echo "git diff $lastdeployid $currentcommit --name-only  $difffile">$scriptdir/log.txt

# 根据当前时间生成备份目录
bakversion=`date "+%Y%m%d%H%M"`
bakdir=$opt_backupdir/$bakversion
echo "bakdir: $bakdir"

# 创建备份目录
mkdir -p $bakdir
# 备份文件,要保存相对目录结构必须切换到程序根目录,否则获取的是绝对目录
cd $opt_webdir
cat $difffile | xargs -i -t cp -rf --parents {} $bakdir/

# 部署,,要保存相对目录结构必须切换到程序根目录,否则获取的是绝对目录
cd $opt_localrepo
cat $difffile | xargs -i -t cp -rf --parents {} $opt_webdir/

# 记录当前部署版本信息
echo $currentcommit >$lastversion

echo "$bakdir">>$scriptdir/backup.txt
复制代码

  版本回滚脚本:

复制代码
#!/bin/sh
#说明
show_usage="args: [-b , -w]\
                                  [--backup-dir=, --webdir=]"
#参数

# 备份目录
opt_backupdir=""

# web目录
opt_webdir=""

GETOPT_ARGS=`getopt -o b:w: -al backup-dir:,webdir: -- "$@"`
eval set -- "$GETOPT_ARGS"
#获取参数
while [ -n "$1" ]
do
        case "$1" in
                -b|--backup-dir) opt_backupdir=$2; shift 2;;
                -w|--webdir) opt_webdir=$2; shift 2;;
                --) break ;;
                *) echo $1,$2,$show_usage; break ;;
        esac
done

if [[ -z $opt_backupdir || -z $opt_webdir ]]; then
        echo $show_usage
        echo "opt_backupdir: $opt_backupdir , opt_webdir: $opt_webdir"
        exit 0
fi

# 部署脚本所在目录
scriptdir=`pwd`/jenkinsdeploy/
mkdir -p $scriptdir

# 备份记录 
backupfile=$scriptdir/backup.txt
# 获取上一次备份的记录
bakdir=`tail -1 $backupfile`

if [ "$bakdir" = "" ];then
        echo "无法获取备份目录。"
        exit
fi

echo "备份目录:$bakdir"
echo "web目录:$opt_webdir"

cd $bakdir
cp -rf --parents ./* $opt_webdir/

echo "成功回滚。"
复制代码

  jenkins配置:添加一个可选参数

  This build is parameterized --> Choice Parameter

  变量名为:

deploy_envirenment

  变量值:

deploy
rollback

  

  执行脚本:

复制代码
echo $deploy_envirenment
case $deploy_envirenment in
    deploy)
        echo "deploy: $deploy_envirenment"
        ansible webservers -m script -a "~/bashscript/xxxxxx_deploy.sh --local-repository=/www/test/test --repository-url=git仓库地址 --backup-dir=/www/test/bak --webdir=/www/test/www"
        ;;
    rollback)
        echo "rollback: $deploy_envirenment"
        ansible webservers -m script -a '~/bashscript/xxxxxx_rollback.sh --backup-dir=/www/test/bak --webdir=/www/test/www'
        ;;
    *)
    exit
        ;;
esac
复制代码

  

  最后执行

  

  执行回滚操作的输出日志

复制代码
执行脚本:
Started by user xxx
Building in workspace /var/lib/jenkins/jobs/ttt/workspace
[workspace] $ /bin/sh -xe /tmp/hudson8451273492016631046.sh
+ echo rollback
rollback
+ case $deploy_envirenment in
+ echo 'rollback: rollback'
rollback: rollback
+ ansible webservers -m script -a '~/bashscript/xxxx_rollback.sh --backup-dir=/www/test/bak --webdir=/www/test/www'
xxx.xxx.xxx.xxx | SUCCESS => {
    "changed": true, 
    "rc": 0, 
    "stderr": "", 
    "stdout": "备份目录:/www/test/bak/201607131627\r\nweb目录:\r\n成功回滚。\r\n", 
    "stdout_lines": [
        "备份目录:/www/test/bak/201607131627", 
        "web目录:", 
        "成功回滚。"
    ]
}
Finished: SUCCESS
复制代码

  这里只是简单地实现了自动化部署和回滚操作,如果做得更智能的话,结合数据库可以做成回滚到某个版本等。 

  更多参考内容见:http://www.cnblogs.com/rwxwsblog/category/850777.html,如果你有更好的办法不妨告诉我。谢谢!

Ansible自动化部署100台服务器实战:从SSH配置到滚动更新 Ansible是一种基于SSH协议的无Agent、声明式IT自动化工具,其核心原理是通过YAML描述系统期望状态,由控制节点并发发起非交互式SSH连接,自动完成软件安装、服务配置、权限管理等操作。相比Shell脚本,它提供幂等性、错误隔离与状态追踪;相比SaltStack/Puppet,它免去Master/Minion架构,学习成本低、启动极快;结合Vault加密、动态Inventory和serial滚动策略,可支撑金融级合规部署与零停机发布。本文聚焦Oracle Linux环境下的真实大规模落地场景,涵盖 阅读详情

相关推荐

自动化运维三件套:Ansible+Shell+CI/CD实战

自动化运维是现代 DevOps 实践的基石。它强调通过工具链将重复性操作标准化、流程化,从而降低人为失误并提升交付效率。其中,Shell 脚本擅长处理单机上的具体操作与复杂逻辑,Ansible 基于 SSH 实现多节点批量配置与编排,而 CI/CD 流水线则负责在代码变更后自动触发整条发布链路。三者分层协作,共同构成一个可重复、可回滚的最小自动化部署闭环。从环境搭建、Inventory 配置到 Playbook 编写,再到 Shell 脚本的健壮性处理与 GitLab CI/CD 接入,本文以一个完整的配置

weixin_33812433的博客 390

基于Jenkins CICD的代码发布与回滚 Jenkins+Git+Docker 发布 Java 项目 Jenkins+Git+Ansible 发布PHP 项目

此时,可以重新创建一个”自由软件项目风格任务“,通过参数化构建特定版本,也就是指定上一个正常版本镜像,然后重新执行创建容器命令即可回到之前正常的版本。根据不同的Linux发行版可能略有不同,请根据实际情况进行查找。开发者将开发完成的代码提交到 Git 代码版本仓库后,点击 Jenkins 任务按钮自动拉取代码编译构建,并自动部署到 Web 服务器,用户可访问最新项目版本。Git 是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理, 是目前企业中使用最为广泛的代码版本管理系统。

时间的博客 2449

Ansible与Docker整合实战:自动化运维与容器化部署指南

这次我们来看一个面向2026年及以后的自动化运维实战方案,核心是Ansible与Docker的整合。对于运维工程师和开发者而言,手动管理服务器集群、部署应用、配置环境不仅效率低下,而且极易出错。Ansible作为一款强大的自动化配置管理与应用部署工具,以其无代理、基于SSH的简洁架构著称。而Docker则通过容器化技术,实现了应用及其运行环境的标准化打包与隔离。将两者结合,意味着你可以用Ansible的剧本(Playbook)来自动化地管理Docker容器的整个生命周期——从安装Docker引擎、拉取镜像、

weixin_33726318的博客 695

jenkins自动部署版本回滚(docker,active choices plug-in,war包备份)

利用jenkins的参数化构建+shell脚本的方式,保留最近5份的war包备份,进行jenkins的版本回退操作,必须安装jenkins的管理插件(Active Choices Plug-in),在rollback时,动态显示最近版本信息。 本流程中的目录及路径说明 war包备份目录:/app/version_backup docker镜像打包目录: /app/dockerfile deploy发布的思路: 每次发布的时候填写vers...

bjsunwei的博客 2807

2016域控服务器迁移,WIN Server2016 域服务器迁移出错

各位大神: 这几天刚安装了一台windows server 2016做域迁移时出现错误:1、默认SYSLOG、NETLOGON共享文件重启后自动取消共享,即使手动打开后依然会出现自动取消2、组策略中编辑策略时出现以下报错 policys.png (19.29 KB)2017-2-7 13:52操作此动作之前可以访问本机的共享(NETLOGON)3、使用DCDIAG检测多个报错:C:\Use...

weixin_31833039的博客 3314

Unity插件-Mirror使用方法(一)Mirror介绍

Unity Mirror 是一个专为 Unity 引擎设计的开源、社区驱动的网络库,主要用于简化多人联机游戏的开发。它最初是为了替代 Unity 原生的 UNet 系统(已被官方弃用)而创建的,因其轻量、灵活和高效的特点,成为 Unity 开发者构建多人游戏的热门选择。

qq_44501691的博客 4101

ansible剧本002-ceph_exporter工具之安装、回滚、升级

ceph_exporter剧本 目录结构 ceph_exporter_tool/ ├── ceph-exporter.service.js2 #systemctl纳管配置文件 ├── cephnode #cephmon节点主机清单 ├── install_ceph_exporter.yml #安装ceph_exporter剧本 ├── revert_ceph_exporter.yml #回滚ceph_exporter剧本...

辉辉的博客 1529

大模型训练流程(四):PPO强化学习实战与调优指南

本文详细解析了大模型训练中PPO强化学习的实战应用与调优技巧,涵盖RLHF核心原理、PPO算法实现及显存优化策略。通过具体案例和代码示例,指导开发者有效提升模型回答质量与安全性,避免常见训练陷阱。

weixin_29051811的博客 438

ansible实现发布、回滚功能

ansible的两篇博客,本来是打算合二为一的,发现只用一篇写,嗯,好鬼长。。。。 一向秉承简单为美的我于是忍痛割爱,一分为二了 ansible实现升级发布、回滚功能 1、应用场景 在实际生产环境中,每天都会更改很多次配置文件,要批量地重启服务 , how ??? 机器少可以手动改,再reload一下 机器多达数百台 ——》 使用自动化工具,效率高呗 2、思路 配置文件...

weixin_30656145的博客 1059

Modbus RTU 详解 + FreeMODBUS移植(附项目源码)

本文全面解析Modbus RTU通信协议,详细介绍其报文格式、功能码定义及典型应用场景,并手把手指导如何将FreeMODBUS协议栈移植到嵌入式平台。内容涵盖从底层硬件驱动配置、协议栈移植到主机/从机通信测试的全流程,重点讲解移植过程中的常见问题及解决方案。文章最后提供经过实测的完整项目源码,帮助开发者快速实现稳定的Modbus RTU通信功能。

Bit_Dong的博客 2935

ArcGIS Pro符号化教程

本文详细介绍了ArcGIS Pro的软件设置和符号化操作步骤。主要包括:1)设置默认工程目录和关闭地图自动加载;2)创建新工程的基本流程;3)点要素的单一符号化方法,包括样式修改和图层调整;4)图表符号显示过滤器的使用,涉及字段添加、图表类型选择和背景设置。文章还提供了操作截图和数据下载链接,适合GIS初学者学习ArcGIS Pro的基础符号化操作。

WwLK123的博客 551

Jenkins执行ansibile任务

需要打通jenkis用户上面的rootkey验证。准备两个不同环境的主机清单文件。多出了选项,可以根据选项传参数。这里的值是host_list。执行不同任务输出不同。

weixin_56547063的博客 673

【视频】GStreamer+WebRTC(九):使用NVIDIA硬编解码

2)下载 GStreamer-bad 插件包源码注意要下载和 GStreamer版本对应的插件包3)下载NVIDIA硬编解码SDK最新的SDK下载地址注意 GStreamer 1.24.2 中调用的 NVIDIA Video_Codec_SDK 不是最新的,先使用下面的方法,查看gst-plugins-bad-1.24.2.tar.xz 对应的NVIDIA Video_Codec_SDK 的版本是多少。

郭老二 265

Jenkins指定回滚到某个版本代码的方法 及 Jenkins完整实现代码自动发布和回滚的完整Python脚本

这是我发布于 publish:July 4, 2017 -Tuesday 的文章,当时发现公司的回滚功能不好进行的改造。昨天上午因为周末的上线中出现一些异常,产品提出要进行线上代码回滚,但之前我们使用jenkins方法进行回滚的时候,都是回滚到线上代码目录的倒数一个目录,但这样会有一个问题。比如在发布的时候存在某些服务器发布失败,这时如果这些服务器都按这个逻辑回滚,则可能会在回滚时,不同的服务器上回滚的版本可能不一样,从而导致新的异常。

本博客记录了从2014年以来在工作学习中遇到的技术问题、解决方法以及部分个人人生经历、经验等内容。 1434

【批处理脚本】-0.1-如何运行批处理bat文件

如何运行批处理bat文件

「汽车电子助手」的博客 1586

华为OD机试:使用Ascend C语言实现Matmul与LeakyReLU融合算子的全流程设计与优化解析

通过本文的详细解析,相信你已经对华为OD机试中基于Ascend C语言的Matmul+LeakyReLU融合算子的设计与实现有了深入的理解。我们不仅从理论上探讨了融合算子的核心优势,还通过实际的代码示例演示了如何一步步完成算子的实现与优化。融合算子在AI算子开发中的应用,尤其是在处理大规模矩阵计算的场景中,能够显著提升计算效率,优化内存占用,并减少数据传输的开销。通过合理的Tiling策略设计,我们还能够充分利用多核处理器的算力,进一步提升AI模型的训练与推理性能。

qq_38334677的博客 662

Jenkins结合gitlab实现静态项目发布

一、 Jenkins基本概述 1.1 什么是Jenkins Jenkins是一个开源提供友好操作界面的持续集成的工具,是由 JAVA 开发而成。 Jenkins 是一个调度平台,本身不处理任何事情,调用第三方插件来完成所有的工作。 Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。 1.2 为什么需要Jenkins jenkins 能将各种开源的软件集成为一体,从而实现不同功能的调度工作。 1.3 Jenkins安装 官方下载 可以按照

人丑就要多读书的博客 1171

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

从Shell到Ansible再到CI/CD:零基础自动化运维实战

在IT运维领域,手动登录多台服务器重复执行命令往往耗时费力且容易出错,自动化运维因此成为提升效率、降低风险的核心手段。Shell脚本能够将单机上的常见操作批量化,Ansible则通过SSH与Playbook实现多节点配置的声明式管理,而CI/CD流水线将代码提交、构建、测试与部署串成闭环,形成从开发到上线的完整链路。这三者并非互相替代,而是层层递进,共同构成自动化运维的工程化基础。本文面向运维新手与开发人员,以实际可运行的示例为线索,讲解Shell脚本的常用技巧、Ansible的批量操作与幂等设计,以及Gi

weixin_34253126的博客 535

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

[jenkins]-centos 针对jenkins构建的部署以及回滚脚本

Centos 针对maven构建后war包的部署以及回滚脚本 由于公司使用jenkins ,通过maven编译,随后部署java 代码。为了方便war包的保存和回滚,写了这么一个针对maven编译完之后的备份回滚脚本。 配置tomcat 这边用的是tomcat 软链接 以加快部署的效率。 首先需要对tomcat 的配置文件进行修改 使tomcat 支持软链接 各个版本的tom...

爷来辣的博客 3149

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Ansible+Shell+CI/CD:自动化运维入门主线全解析

自动化运维是现代IT基础设施稳定性的基石,其核心在于将重复性操作转化为可复用、可追溯的工程流程。Linux命令行与Shell脚本提供了最底层的操作能力,是批量任务和系统管理的“胶水语言”;Ansible则通过Inventory与Playbook实现多节点配置管理和应用分发,其幂等机制保证了执行结果的一致性;CI/CD流水线将代码构建、测试与部署串联为自动触发的工作流,是实现持续交付的关键工程实践。从单机脚本到集群编排,再到DevOps体系落地,这套工具链覆盖了环境初始化、应用发布、批量变更等典型场景。本文围

weixin_34326179的博客 359

PHP 基于 Jenkins ansible 动态选择版本进行自动化部署与回滚(第二版)

PHP 基于 Jenkins ansible 动态选择版本进行自动化部署与回滚(第二版) 先看流程图: 大概介绍一下: 版本选择使用jenkins 中的 git parameter 插件实现 回滚方式比较low,直接使用代码库目录方式实现 其中gitlab、ansible、jenkins安装不在本文讨论范围之内。 效果 先看下效果图: jenkins 发布配置 PHP 代码不需要 Ant ...

weixin_30731287的博客 178

2026年软件部署工具选型指南:从Jenkins到Argo CD的8款工具对比与自动部署实践

软件部署工具是DevOps落地的基础设施,核心价值在于将重复性操作自动化。CI/CD流水线通过Jenkins等工具实现持续集成与交付,而Ansible等配置管理工具则以无代理方式完成批量分发。在容器化趋势下,GitOps工具如Argo CD成为Kubernetes环境的核心选择。面对服务器、终端等不同场景,企业需要根据团队规模、环境类型等维度合理选型。本文梳理8款主流软件部署工具,并通过Jenkins+Ansible+SVN实例展示自动部署流水线,帮助运维与开发团队构建高效、可回滚的发布体系。

weixin_30357231的博客 317
上一篇: Docker的Ubuntu镜像安装的容器无ifconfig命令和ping命令
下一篇: Grafana系列教程–Grafana基本概念
hxpjava1
博客等级 码龄19年 1365粉丝 511原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值