基于GitHooks实现项目自动实时部署

news/2024/7/7 5:58:40 标签: elasticsearch, 大数据, 搜索引擎, 运维

目录

基于GitHooks实现项目自动部署

基于SVN+Jenkins发布项目


基于GitHooks实现项目自动部署

        以上创建的所有任务,构建工作是基于在开发人员提交完代码到远程仓库完成,通知运维后,需要手动执行构建任务,这样就有些不太方便。我们如何做到开发员提交完代码时项目自动执行任务呢?

1)创建项目仓库

[root@git ~]# su - git

[git@git ~]$ mkdir auto_php.git

[git@git ~]$ cd auto_php.git

[git@git auto_php.git]$ git --bare init

初始化空的 Git 版本库于 /home/git/auto_php.git/

2)在GIT 服务器上生成密钥对,方便git使用钩子脚本触发jenkins执行任务

[git@git ~]$ ssh-keygen

[git@git ~]$ ssh-copy-id root@192.168.200.112

3)开发人员提交代码

[root@jenkins ~]# ssh-keygen

[root@jenkins ~]# ssh-copy-id git@192.168.200.111

[root@jenkins ~]# ssh-copy-id root@192.168.200.113

[root@jenkins ~]# git clone git@192.168.200.111:/home/git/auto_php.git

[root@jenkins ~]# cd auto_php/

[root@jenkins auto_php]# echo "crushlinux test" > test.html

[root@jenkins auto_php]# git add .

[root@jenkins auto_php]# git commit -m "cl"

[master(根提交) a762b0c] cl

 1 file changed, 1 insertion(+)

 create mode 100644 test.html

[root@jenkins auto_php]# git push origin master

Counting objects: 3, done.

Writing objects: 100% (3/3), 219 bytes | 0 bytes/s, done.

Total 3 (delta 0), reused 0 (delta 0)

To git@192.168.200.111:/home/git/auto_php.git

 * [new branch]      master -> master

4)创建一个Freestyle Project

src=${WORKSPACE} dest=/usr/share/nginx/html rsync_opts=--exclude=.git

 

 

6)浏览器访问测试:http://192.168.200.113/auto_php/test.html

 

[root@docker ~]# ls /usr/share/nginx/html/auto_php/

test.html

7)配置钩子脚本

[root@git ~]# su - git

[git@git ~]$ cd auto_php.git/hooks/

[git@git hooks]$ vim post-receive

#!/bin/bash

#提取分支名

read params

branch=$(echo $params | awk '{print $3}' | awk -F '/' '{print $3}')

#根据分支选择jenkins任务名

if [ $branch == "master" ];then

    ssh root@192.168.200.112 '/usr/local/java/bin/java -jar /var/cache/jenkins/war/WEB-INF/lib/cli-2.319.3.jar -s http://192.168.200.112:8080 -auth admin:123456 build auto_php'

else

    exit

fi

[git@git hooks]$ chmod +x post-receive

解释:

脚本中的 -s参数指定jenkins服务的地址,然后加 build命令,build命令后边加上需要构建的job名(也即是我们创建的任务名称)

8)测试自动构建

我们当前任务的构建历史版本为7

 

模拟开发人员提交新代码

[root@jenkins ~]# cd auto_php/

[root@jenkins auto_php]# echo "jialiang" >> index.html

[root@jenkins auto_php]# git add .

[root@jenkins auto_php]# git commit -m 'jl'

[master 5fbf775] jl

 1 file changed, 1 insertion(+)

[root@jenkins auto_php]# git push origin master

Counting objects: 5, done.

Compressing objects: 100% (2/2), done.

Writing objects: 100% (3/3), 274 bytes | 0 bytes/s, done.

Total 3 (delta 0), reused 0 (delta 0)

remote: 六月 28, 2019 9:40:13 上午 org.apache.sshd.common.util.security.AbstractSecurityProviderRegistrar getOrCreateProvid

erremote: 信息: getOrCreateProvider(EdDSA) created instance of net.i2p.crypto.eddsa.EdDSASecurityProvider

To git@192.168.200.111:/home/git/auto_php.git

   d167350..5fbf775  master -> master

9)Jenkins会自动发起一个构建8

 

[root@docker ~]# ls /usr/share/nginx/html/auto_php/

index.html  test.html

10)浏览器访问测试:http://192.168.200.113/auto_php/index.html

 

基于SVN+Jenkins发布项目

1、安装部署Subversion

        Apache Subversion 通常被缩写成SVN,是一个开放源代码的版本控制系统。Subversion 在2000 年由CollabNet Inc 开发,现在发展成为Apache 软件基金会的一个项目,同样是一个丰富的开发者和用户社区的一部分。

        SVN 相对于的RCS、CVS,采用了分支管理系统,它的设计目标就是取代CVS。互联网上免费的版本控制服务多基于Subversion。说得简单一点,SVN 就是用于多个人共同开发同一个项目,共用资源的目的。

安装并部署Subversion 的具体操作

[root@svn ~]# yum -y install subversion

[root@svn ~]# mkdir /data/svn -p

[root@svn ~]# svnadmin create /data/svn

配置用户

[root@svn ~]# vim /data/svn/conf/passwd

[users]

crushlinux=123456

配置授权

[root@svn ~]# vim /data/svn/conf/authz

[/]

crushlinux=rw

配置并启动

[root@svn ~]# vim /data/svn/conf/svnserve.conf

[general]

anon-access = read

auth-access = write

password-db = passwd

authz-db = authz

realm = /data/svn

[root@svn ~]# svnserve -d -r /data/svn  //启动SVN

[root@svn ~]# netstat -lnpt | grep svnserve

tcp        0      0 0.0.0.0:3690            0.0.0.0:*               LISTEN      76057/svnserve

2、创建分支模拟提交代码

[root@jenkins ~]# svn mkdir svn://192.168.200.111/product-station -m "crushlinux 001"

认证领域: <svn://192.168.200.111:3690> /data/svn

“root”的密码: 回车

认证领域: <svn://192.168.200.111:3690> /data/svn

用户名: crushlinux

“crushlinux”的密码: 123456

-----------------------------------------------------------------------

注意!  你的密码,对于认证域:

   <svn://192.168.200.111:3690> /data/svn

只能明文保存在磁盘上!  如果可能的话,请考虑配置你的系统,让 Subversion

可以保存加密后的密码。请参阅文档以获得详细信息。

你可以通过在“/root/.subversion/servers”中设置选项“store-plaintext-passwords”为“yes”或“no”,

来避免再次出现此警告。

-----------------------------------------------------------------------

保存未加密的密码(yes/no)?yes

提交后的版本为 1。

[root@jenkins ~]# svn list svn://192.168.200.111

product-station/

[root@jenkins ~]# svn checkout svn://192.168.200.111/product-station

取出版本 1。

[root@jenkins ~]# cd product-station/

[root@jenkins product-station]# vim index.html

crushlinux version1

[root@jenkins product-station]# svn add index.html

A         index.html

[root@jenkins product-station]# svn commit -m 'v1'

正在增加       index.html

传输文件数据.

提交后的版本为 2。

3、创建发布脚本

[root@jenkins ~]# ssh-keygen

[root@jenkins ~]# ssh-copy-id root@192.168.200.113

[root@jenkins ~]# cat /etc/ansible/hosts

[webserver]

192.168.200.113

[root@jenkins ~]# vim /opt/web_jenkins.sh

#!/bin/bash

#定义路径

path=$(cd $(dirname "$0"); pwd);

svnserver="svn://192.168.200.111/product-station";

tmpdir="/tmp/webroot";

mkdir -p ${tmpdir}

wwwbackup="/tmp/webroot_backup"

mkdir -p ${wwwbackup}

#先备份上一次应用代码

cp -r ${tmpdir} ${wwwbackup}

#检出svn 应用代码到发布目录

svn co ${svnserver} "${tmpdir}";

chmod -R 755 ${tmpdir}

#echo "确认要发布的环境";

ansible webserver -m synchronize -a 'src=/tmp/webroot dest=/usr/share/nginx/html delete=yes compress=yes'

if [ $? -eq 0 ]; then

    echo "web节点同步代码完成"

else

    rm -rf ${tmpdir}/*

    cp -r ${wwwbackup}/* ${tmpdir}

    ansible webserver -m synchronize -a 'src=/tmp/webroot dest=/usr/share/nginx/html delete=yes compress=yes'

fi

[root@jenkins ~]# chmod +x /opt/web_jenkins.sh

测试ansible

[root@jenkins ~]# ansible webserver -m ping

192.168.200.113 | SUCCESS => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": false,

    "ping": "pong"

}

4、构建PHP 项目

        在以上配置完成后,在Jenkins 首页,选择“新建任务”,然后输入一个任务名称“svn-web”,再然后选择“Freestyle project”点击当前页面下方的“确定”按钮。

找到“构建”配置选项,然后点击“增加构架步骤”->选择”Execute shell”然后跟

据shell 所在路径,输入发布脚本的所在位置。

 

以上全部配置完成后,点击保存即可。然后点击刚才创建的工程项目“svn-web“->”

Bulid New”直至构建完成。

 

 

从上面结果可以看到svn-web 工程项目已构建成功

5、验证项目环境

浏览器测试访问:http://192.168.200.113/webroot/index.html 地址即可查看结果

[root@docker ~]# cat /usr/share/nginx/html/webroot/index.html

crushlinux version1

 

变更代码并提交到SVN,Jenkins 再次执行构建操作

[root@jenkins ~]# cd product-station/

[root@jenkins product-station]# cat index.html

crushlinux version1

[root@jenkins product-station]# echo "crushlinux version2" >> index.html

[root@jenkins product-station]# svn commit -m 'v2'

正在发送       index.html

传输文件数据.

提交后的版本为 3。

 

[root@docker ~]# cat /usr/share/nginx/html/webroot/index.html

crushlinux version1

crushlinux version2

浏览器测试访问:http://192.168.200.113/webroot/index.html 地址

 


http://www.niftyadmin.cn/n/4978783.html

相关文章

CLIP改进工作串讲(bryanyzhu)内容记录

文章目录 分割Language-driven semantic segmentation - ICLR2022GroupViT: Semantic Segmentation Emerges from Text Supervision 目标检测ViLD : Open-vocabulary object detection via vision and language knowledge distillation 视觉定位GLIP:Grounded Language-Image P…

【Mysql】索引汇总

适合创建索引的情况 1. 字段的数值有唯一性的限制 索引本身可以起到约束的作用&#xff0c;比如唯一索引、主键索引都是可以起到唯一性约束的 因此在我们的数据表中&#xff0c;如果某个字段是唯一性的&#xff0c;就可以直接创建唯一性索引&#xff0c;或者主键索引。这样可…

PDMan的基本使用

PDMan的基本使用 下载链接&#xff1a; https://blog.csdn.net/yjrguxing/article/details/112256692 PDMan导出文档 设置 --> WORD模板配置 --> 模板另存为 --> 先择文件夹 --> 保存 指定模板文件 --> 打开 模板 --> 导出文档 --> 导出WORD --> 选…

Linux入门--构建进程间通信的方案之管道(上)

文章目录 一、进程间通信介绍 1.进程间通信目的 2.进程间通信发展 3.进程间通信分类 二、管道 1.管道定义 1.1匿名管道 实例代码&#xff1a;从键盘读取数据写入管道&#xff0c;读取管道写到屏幕 2.用fork来共享管道原理 3.站在文件描述符角度深度理解管道 4.站在内…

ZooKeeper集群环境搭建

&#x1f947;&#x1f947;【大数据学习记录篇】-持续更新中~&#x1f947;&#x1f947; 个人主页&#xff1a;beixi 本文章收录于专栏&#xff08;点击传送&#xff09;&#xff1a;【大数据学习】 &#x1f493;&#x1f493;持续更新中&#xff0c;感谢各位前辈朋友们支持…

element-ui 自定义loading加载样式

element-ui 中的 loading 加载功能&#xff0c;默认是全屏加载效果&#xff0c; 设置局部&#xff0c;需要自定义样式&#xff0c;自定义的方法如下&#xff1a; import { Loading } from element-uiVue.prototype.$baseLoading (text) > {let loadingloading Loading.s…

那些你不得不知道的HTML知识点

目录 1、行内元素有哪些&#xff1f;块级元素有哪些&#xff1f; 空(void)元素有哪些&#xff1f;2、页面导入样式时&#xff0c;使用link和import有什么区别&#xff1f;3、title与h1的区别、b与strong的区别、i与em的区别&#xff1f;3.1 title与h1的区别&#xff1a;3.2 b与…

阀门状态监测和预测性维护的原理和实施步骤

随着制造业数字化转型的推进&#xff0c;预测性维护&#xff08;Predictive Maintenance&#xff0c;简称PdM&#xff09;成为提高生产效率和设备可靠性的关键策略之一。在流程工厂中&#xff0c;阀门作为重要的设备之一&#xff0c;起着控制流体流动的关键作用。本文将探讨如何…