php與Git下基於webhook的自動化部署

前言

2018年第一篇文章,沒啥技術含量,權當筆記php

咱們通常都會用git或者svn來管理咱們的代碼git

每次代碼更新後還要手動的去把服務器上的代碼也更新一遍web

項目小了還好 項目大了着實浪費時間shell

要是服務器上的代碼也能像git那樣增量更新就行了json

今天就說說如何經過webhook的形式來讓服務器自動拉取咱們push的代碼服務器

原理

如今的Git服務器通常都會有個webhook服務ssh

什麼意思呢?svn

就是咱們在執行了push、merge等一系列的操做的時候網站

Git服務器會發送一個請求到咱們指定的URLurl

而且會把這次動做的相關數據也發送過去

這裏咱們使用開源中國的碼雲演示

在幫助文檔中能夠看到

當咱們發生push之類的操做的時候

Git服務器會像咱們指定的url發送如下數據

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

因而乎,咱們就能夠拿這些數據來作作文章了

準備

  • 一個git倉庫
  • 安裝了web服務器與git支持的服務器

步驟

服務器篇

1.首先咱們須要爲www用戶建立一個ssh密鑰

切換到www用戶下並生成一個rsa密鑰

su - www
ssh-keygen -t rsa

密鑰通常生成在 ==/var/www/.ssh/== 這個路徑下

文件名爲 id_rsa

  1. 建立一個可供Git服務器通知的頁面

網站的創建這裏再也不敷述

文件內容以下

<?php
//git webhook 自動部署腳本
//項目存放物理路徑
$path = "你的項目部署路徑";
$requestBody = file_get_contents("php://input");
if (empty($requestBody)) {
    die('send fail');
}
$content = json_decode($requestBody, true);
//如果主分支且提交數大於0
if ($content['ref']=='refs/heads/master' && $content['total_commits_count']>0) {
    $res = shell_exec("cd {$path} && git pull 2>&1");//以www用戶運行
    $res_log = '-------------------------'.PHP_EOL;
    $res_log .= $content['user_name'] . ' 在' . date('Y-m-d H:i:s') . '向' . $content['repository']['name'] . '項目的' . $content['ref'] . '分支push了' . $content['total_commits_count'] . '個commit:' . PHP_EOL;
    $res_log .= $res.PHP_EOL;
    file_put_contents("git-webhook.txt", $res_log, FILE_APPEND);//追加寫入
}
echo '很棒:'.date('y-m-d H:i:s');

以上代碼相信均可以看懂

Git發送過來的數據至關豐富

咱們能夠用這些數據來作些過濾來決定是否須要更新服務器上的本地代碼

代碼庫篇

  1. 建立代碼倉庫

建立方法這裏不在敷述

  1. 添加ssh密鑰

在項目管理中把上面步驟第一步中獲得的ssh密鑰添加到倉庫的部署密鑰中

這樣咱們的web服務器就有了拉取代碼的權限
3.添加hook路徑

一樣在項目管理中添加webhook連接

這裏能夠添加一個密碼,我偷懶這裏沒加

須要加的話能夠在hook文件中添加一個驗證

能夠防止被惡意訪問

聯合

最後咱們須要在咱們的部署目錄先把git初始化一次

su - www
git clone git倉庫地址 項目部署地址

而後咱們往git倉庫中提交一次代碼更新

稍等一下

若是一切正常的話咱們的項目目錄就會自動拉取你剛纔提交的代碼了


在hook路徑中也有log記錄

不須要的話能夠把代碼註釋掉

相關文章
相關標籤/搜索