git webhooks 實現自動拉取代碼

當進行開發的環境在本地,而運行的環境要在服務端時,每一次提交代碼都須要在服務端pull一次。而利用git的hooks功能,可以讓咱們省去這一步,下面我就以碼雲的webhooks爲例,實現服務端的代碼自動同步部署。php


更新歷史html

  • 2017.12.29:完成初稿

瞭解 git 的 hooks

關於 git 鉤子

Git 能在特定的重要動做發生時觸發自定義腳本。 有兩組這樣的鉤子:客戶端的和服務器端的。 客戶端鉤子由諸如提交和合並這樣的操做所調用,而服務器端鉤子做用於諸如接收被推送的提交這樣的聯網操做。 你能夠爲所欲爲地運用這些鉤子。git

如何使用鉤子

鉤子都被存儲在 Git 目錄下的 ==hooks== 子目錄中。 也即絕大部分項目中的 ==.git/hooks== 。 當你用 ==git init== 初始化一個新版本庫時,Git 默認會在這個目錄中放置一些示例腳本。這些腳本除了自己能夠被調用外,它們還透露了被觸發時所傳入的參數。 全部的示例都是 shell 腳本,其中一些還混雜了 Perl 代碼,不過,任何正確命名的可執行腳本均可以正常使用 —— 你能夠用 Ruby 或 Python,或其它語言編寫它們。 這些示例的名字都是以 ==.sample== 結尾,若是你想啓用它們,得先移除這個後綴。github

把一個正確命名且可執行的文件放入 Git 目錄下的 hooks 子目錄中,便可激活該鉤子腳本。 這樣一來,它就能被 Git 調用。 接下來,咱們會講解經常使用的鉤子腳本類型。web

具體使用能夠參考官方文檔:Git Hookesshell

瞭解 webhooks

鉤子功能(callback),是幫助用戶 push 了代碼後,自動回調一個你設定的 http 地址。 這是一個通用的解決方案,用戶能夠本身根據不一樣的需求,來編寫本身的腳本程序(好比發郵件,自動部署等);目前,webhooks 支持多種觸發方式,支持複選。apache

webhooks 的請求方式爲POST請求,有兩種數據格式能夠選擇,JSON 和 web 的 form參數,能夠自行選擇是否使用密碼來肯定請求。(注意:該密碼是明文)json

不一樣託管平臺的POST數據格式都不太同樣,不過也不會有太大影響,只是解析數據的時候注意就好了,下面是碼雲的 Push 操做回調的 json 數據:bash

{
    "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"
}

其餘的具體數據能夠到各個官網查看:碼雲CodingGitHub服務器

在 Ubuntu + Apache + 碼雲的嘗試

準備工做

一、首先你要搭建好LAMP的的開發環境 能夠看騰訊開發者實驗室的課程

二、固然要有git的環境了

三、要將代碼方在一個提供webhooks支持的代碼託管平臺上,若是本身搭建 git 服務器則要本身實現 webhooks 回調

開始幹活

  1. 建立web服務器用戶目錄,這裏以apache用戶爲例,不一樣的環境請根據本身環境自行修改:
sudo mkdir /var/www/.ssh
sudo chown -R apacheuser /var/www/.ssh/  // 這裏的用戶要是 Apache 的運行用戶,下同
  1. 生成公鑰

    公鑰有兩個: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",一直回車下去
  1. 配置公鑰
  • 用戶公鑰
sudo cat /root/.ssh/id_rsa.pub # 查看生成的密鑰內容,複製所有

將公鑰的內容粘貼到用戶->設置 中的SSH公鑰中

image

  • 部署公鑰
sudo cat /var/www/.ssh/id_rsa.pub # 查看生成的密鑰內容,複製所有

將公鑰內容添加到具體項目 -> 管理 中的部署公鑰

image

  • 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運行用戶來進行操做),若屢次操做只需輸入一次用戶名、密碼,即配置成功,若每一次操做都有輸入用戶名密碼,則配置不成功,須要從新檢查配置。

  1. 準備鉤子文件

在你的www目錄創建一個目錄hook, 裏面放上一個php文件index.php,內容以下:

<?php
// 這裏只是最簡單的拉取代碼,若是要作更加多的操做,如驗證、日誌,請本身解析push內容並操做

// 獲取push數據內容的方法
$requestBody = file_get_contents("php://input");

// 只需這一行代碼即可拉取
shell_exec("cd /var/www/Project && git pull"); // 目錄換成項目的目錄

?>

修改目錄權限:

chown -R apacheuser /var/www/hook # 這裏請改爲你建立的hook目錄
chown -R apacheuser /var/www/Project # 這裏請改爲你的項目目錄

確保你的hook文件能夠訪問:http://example.com/hook/index... ,鉤子準備完成。

  1. 配置webhooks

image

若是連接可用,則大功告成,只需把倉庫 clone 以後,再向碼雲提交,變回自動被 服務器 pull

注意事項

若是配置都沒有問題,可是就是不會自動拉取,那應該是用戶的權限配置問題,能夠先查看運行php代碼的具體用戶是什麼,而後爲該用戶開啓權限。

system("whoami"); // 查看是哪一個用戶執行該命令

參考文章

相關文章
相關標籤/搜索