资讯专栏INFORMATION COLUMN

git webhooks 实现自动拉取代码

marek / 1998人阅读

摘要:而利用的功能,能够让我们省去这一步,下面我就以码云的为例,实现服务端的代码自动同步部署。查看是哪个用户执行该命令参考文章使用脚本远程部署项目利用实现自动部署代码码云通过实现自动同步代码部署执行系统外部命令函数

当进行开发的环境在本地,而运行的环境要在服务端时,每一次提交代码都需要在服务端pull一次。而利用git的hooks功能,能够让我们省去这一步,下面我就以码云的webhooks为例,实现服务端的代码自动同步部署。


更新历史

2017.12.29:完成初稿

了解 git 的 hooks
关于 git 钩子

Git 能在特定的重要动作发生时触发自定义脚本。 有两组这样的钩子:客户端的和服务器端的。 客户端钩子由诸如提交和合并这样的操作所调用,而服务器端钩子作用于诸如接收被推送的提交这样的联网操作。 你可以随心所欲地运用这些钩子。

如何使用钩子

钩子都被存储在 Git 目录下的 ==hooks== 子目录中。 也即绝大部分项目中的 ==.git/hooks== 。 当你用 ==git init== 初始化一个新版本库时,Git 默认会在这个目录中放置一些示例脚本。这些脚本除了本身可以被调用外,它们还透露了被触发时所传入的参数。 所有的示例都是 shell 脚本,其中一些还混杂了 Perl 代码,不过,任何正确命名的可执行脚本都可以正常使用 —— 你可以用 Ruby 或 Python,或其它语言编写它们。 这些示例的名字都是以 ==.sample== 结尾,如果你想启用它们,得先移除这个后缀。

把一个正确命名且可执行的文件放入 Git 目录下的 hooks 子目录中,即可激活该钩子脚本。 这样一来,它就能被 Git 调用。 接下来,我们会讲解常用的钩子脚本类型。

具体使用可以参考官方文档:Git Hookes

了解 webhooks

钩子功能(callback),是帮助用户 push 了代码后,自动回调一个你设定的 http 地址。 这是一个通用的解决方案,用户可以自己根据不同的需求,来编写自己的脚本程序(比如发邮件,自动部署等);目前,webhooks 支持多种触发方式,支持复选。

webhooks 的请求方式为POST请求,有两种数据格式可以选择,JSON 和 web 的 form参数,可以自行选择是否使用密码来确定请求。(注意:该密码是明文)

不同托管平台的POST数据格式都不太一样,不过也不会有太大影响,只是解析数据的时候注意就行了,下面是码云的 Push 操作回调的 json 数据:

{
    "before": "fb32ef5812dc132ece716a05c50c7531c6dc1b4d", 
    "after": "ac63b9ba95191a1bf79d60bc262851a66c12cda1", 
    "ref": "refs/heads/master", 
    "user_id": 13,
    "user_name": "123", 
    "user": {
      "name": "123",
      "username": "test123",
      "url": "https://gitee.com/oschina"
    }, 
    "repository": {
        "name": "webhook", 
        "url": "http://git.oschina.net/oschina/webhook", 
        "description": "", 
        "homepage": "https://gitee.com/oschina/webhook"
    }, 
    "commits": [
        {
            "id": "ac63b9ba95191a1bf79d60bc262851a66c12cda1", 
            "message": "1234 bug fix", 
            "timestamp": "2016-12-09T17:28:02 08:00", 
            "url": "https://gitee.com/oschina/webhook/commit/ac63b9ba95191a1bf79d60bc262851a66c12cda1", 
            "author": {
                "name": "123", 
                "email": "123@123.com", 
                "time": "2016-12-09T17:28:02 08:00"
            }
        }
    ], 
    "total_commits_count": 1, 
    "commits_more_than_ten": false, 
    "project": {
        "name": "webhook", 
        "path": "webhook", 
        "url": "https://gitee.com/oschina/webhook", 
        "git_ssh_url": "git@gitee.com:oschina/webhook.git", 
        "git_http_url": "https://gitee.com/oschina/webhook.git", 
        "git_svn_url": "svn://gitee.com/oschina/webhook", 
        "namespace": "oschina", 
        "name_with_namespace": "oschina/webhook", 
        "path_with_namespace": "oschina/webhook", 
        "default_branch": "master"
    }, 
    "hook_name": "push_hooks", 
    "password": "pwd"
}

其他的具体数据可以到各个官网查看:码云、Coding、GitHub

在 Ubuntu + Apache + 码云的尝试 准备工作

1、首先你要搭建好LAMP的的开发环境 可以看腾讯开发者实验室的课程

2、当然要有git的环境了

3、要将代码方在一个提供webhooks支持的代码托管平台上,如果自己搭建 git 服务器则要自己实现 webhooks 回调

开始干活

创建web服务器用户目录,这里以apache用户为例,不同的环境请根据自己环境自行修改:

sudo mkdir /var/www/.ssh
sudo chown -R apacheuser /var/www/.ssh/  // 这里的用户要是 Apache 的运行用户,下同

生成公钥

公钥有两个:1. git用户公钥,2. 部署公钥:

用户公钥(用于git clone时认证权限)

ssh-keygen -t rsa -C "sample@gmail.com" # 填自己的邮箱
 # 然后一直回车就行
 # 生成的文件通常是 /root/.ssh/id_rsa,如果非root用户请查看提示上的路径

部署公钥

 sudo -Hu apacheuser ssh-keygen -t rsa  # 请选择 "no passphrase",一直回车下去

配置公钥

用户公钥

sudo cat /root/.ssh/id_rsa.pub # 查看生成的密钥内容,复制全部

将公钥的内容粘贴到用户->设置 中的SSH公钥中

部署公钥

sudo cat /var/www/.ssh/id_rsa.pub # 查看生成的密钥内容,复制全部

将公钥内容添加到具体项目 -> 管理 中的部署公钥

git 的全局配置

sudo -Hu apacheuser git config --global credential.helper store # 永久保存
sudo -Hu apacheuser git config --global user.name "name" 
sudo -Hu apacheuser git config --global user.email "shample@gmail.com" # 邮箱请与码云上一致

配置完成之后可以 clone 或 pull 项目来验证是否配置成功(注意:要切换成Apache运行用户来进行操作),若多次操作只需输入一次用户名、密码,即配置成功,若每一次操作都有输入用户名密码,则配置不成功,需要重新检查配置。

准备钩子文件

在你的www目录建立一个目录hook, 里面放上一个php文件index.php,内容如下:

修改目录权限:

chown -R apacheuser /var/www/hook # 这里请改成你创建的hook目录
chown -R apacheuser /var/www/Project # 这里请改成你的项目目录

确保你的hook文件可以访问:http://example.com/hook/index... ,钩子准备完成。

配置webhooks

如果链接可用,则大功告成,只需把仓库 clone 之后,再向码云提交,变回自动被 服务器 pull

注意事项

如果配置都没有问题,但是就是不会自动拉取,那应该是用户的权限配置问题,可以先查看运行php代码的具体用户是什么,然后为该用户开启权限。

system("whoami"); // 查看是哪个用户执行该命令
参考文章

使用PHP脚本远程部署git项目

利用WebHook实现PHP自动部署Git代码

Gitee码云通过WebHooks实现自动同步代码部署

PHP执行系统外部命令函数:exec()、passthru()、system()、shell_exec()

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/26293.html

相关文章

  • Docker + Jenkins + webhooks 自动部署基础实践

    摘要:自动部署基础实践熟悉的基本操作实现本地后自动构建部署服务此实践用于优化自己在实际工作中的工作流在本地开发到服务器登录云服务器或者简化流程后本地开发云服务器自动构建部署本实践将结合技术来实现云服务器对各种环境的切换与部署。 Docker + Jenkins + webhooks 自动部署基础实践 熟悉 jenkins 的基本操作 ☑️ 实现本地 git push 后 jenkins 自...

    Charlie_Jade 评论0 收藏0
  • Node + Git + Webhook 自动化部署

    摘要:正文准备首先确定需要完成的内容明确需求监听指定提交执行指定多个脚本而且因为我这边是需要分别对和目录分别执行部署命令。部署部署我们只需要对然后就可以在本地开发完之后推送,服务器就能自动拉取代码并且部署。 前言 之前断断续续在重构一个项目,然后发现功能一开始设计太多了,可能需要花大量时间来增加,但是核心功能基本完成,于是想着能不能半上线状态,然后通过更新提交git,让服务器部署自动更新。这...

    JayChen 评论0 收藏0
  • 使用 GitHub 和 Python 实现持续部署

    摘要:该签名由一个密码,请求体的十六进制摘要,并使用哈希生成。调试打印语句显示了从请求体收到的短提交哈希。这是持续部署的关键。 借助 GitHub 的网络钩子webhook,开发者可以创建很多有用的服务。从触发一个 Jenkins 实例上的 CI(持续集成) 任务到配置云中的机器,几乎有着无限的可能性。这篇教程将展示如何使用 Python 和 Flask 框架来搭建一个简单的持续部署(CD)...

    nodejh 评论0 收藏0
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目

    摘要:使用框架实现自动部署项目为了方便开发测试或项目部署至服务器不那么繁琐,搞一个自动部署的小轮子也是必要的。同时配置项目托管平台的个人私钥或项目公钥,保证能直接拉取。 gohook Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目 为了方便开发测试或项目部署至服务器不那么繁琐,搞一个自动部署的小轮子也是必要的。 小轮子需要涉及到 Coding 项目托管平...

    notebin 评论0 收藏0
  • Jenkins 实现自动构建与持续集成

    摘要:本文通过钩子实现了,本地代码,会自动响应并拉取码云上最新的代码值服务器上,使得本地提交代码时,线上能够同步的更新代码,省去了手动更新服务器上代码的重复工作。思考下我的需求本地代码到码云,自动拉取最新的代码。 * 写在前面的一段话:          根据目前的工作需要,以及为了接下来新产品前后端间更高效的协同,我决定爬一下Jenkins的坑。本文通过git钩子+Jenkins实现了,...

    Baoyuan 评论0 收藏0

发表评论

0条评论

marek

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<