利用gitHook實現自動部署

gitHook

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

瞭解 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 數據:

{
  "ref": "refs/heads/master",
  "before": "b111263b14230e2276922a3d1f6e585c771db75e",
  "after": "3611f77d00bc8f6294e5cb39731010db1478ca20",
  "created": false,
  "deleted": false,
  "forced": false,
  "base_ref": null,
  "compare": "https://github.com/AndyYoungCN/githook/compare/b111263b1423...3611f77d00bc",
  "commits": [
    {
      "id": "3611f77d00bc8f6294e5cb39731010db1478ca20",
      "tree_id": "221e39b970eba9b71b0b20f1061fa0b9c78f43e0",
      "distinct": true,
      "message": "修改日誌級別",
      "timestamp": "2019-04-26T16:17:48+08:00",
      "url": "https://github.com/AndyYoungCN/githook/commit/3611f77d00bc8f6294e5cb39731010db1478ca20",
      "author": {
        "name": "andyoung",
        "email": "[email protected]",
        "username": "AndyYoungCN"
      },
      "committer": {
        "name": "andyoung",
        "email": "[email protected]",
        "username": "AndyYoungCN"
      },
      "added": [

      ],
      "removed": [

      ],
      "modified": [
        "README.md",
        "pull.php"
      ]
    }
  ],
  "head_commit": {
    "id": "3611f77d00bc8f6294e5cb39731010db1478ca20",
    "tree_id": "221e39b970eba9b71b0b20f1061fa0b9c78f43e0",
    "distinct": true,
    "message": "修改日誌級別",
    "timestamp": "2019-04-26T16:17:48+08:00",
    "url": "https://github.com/AndyYoungCN/githook/commit/3611f77d00bc8f6294e5cb39731010db1478ca20",
    "author": {
      "name": "andyoung",
      "email": "[email protected]",
      "username": "AndyYoungCN"
    },
    "committer": {
      "name": "andyoung",
      "email": "[email protected]",
      "username": "AndyYoungCN"
    },
    "added": [

    ],
    "removed": [

    ],
    "modified": [
      "README.md",
      "pull.php"
    ]
  },
  "repository": {
    "id": 183569523,
    "node_id": "MDEwOlJlcG9zaXRvcnkxODM1Njk1MjM=",
    "name": "githook",
    "full_name": "AndyYoungCN/githook",
    "private": false,
    "owner": {
      "name": "AndyYoungCN",
      "email": "[email protected]",
      "login": "AndyYoungCN",
      "id": 13751605,
      "node_id": "MDQ6VXNlcjEzNzUxNjA1",
      "avatar_url": "https://avatars0.githubusercontent.com/u/13751605?v=4",
      "gravatar_id": "",
      "url": "https://api.github.com/users/AndyYoungCN",
      "html_url": "https://github.com/AndyYoungCN",
      "followers_url": "https://api.github.com/users/AndyYoungCN/followers",
      "following_url": "https://api.github.com/users/AndyYoungCN/following{/other_user}",
      "gists_url": "https://api.github.com/users/AndyYoungCN/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/AndyYoungCN/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/AndyYoungCN/subscriptions",
      "organizations_url": "https://api.github.com/users/AndyYoungCN/orgs",
      "repos_url": "https://api.github.com/users/AndyYoungCN/repos",
      "events_url": "https://api.github.com/users/AndyYoungCN/events{/privacy}",
      "received_events_url": "https://api.github.com/users/AndyYoungCN/received_events",
      "type": "User",
      "site_admin": false
    },
    "html_url": "https://github.com/AndyYoungCN/githook",
    "description": "利用webhook完成自動部署。兼容碼雲、Coding、GitHub、Gogs",
   
    # more...
}

其他的具體數據可以到各個官網查看:碼雲CodingGitHubGogs

Use(使用步驟)

  1. git clone [email protected]:AndyYoungCN/githook.git 放在目標倉庫同個服務器上,最好同個目錄;

  2. 配置目錄權限

    ## 如果需要日誌, 修改日誌權限
    mkdir logs
    chmod 777 -R logs
    
  3. 修改目錄權限

    chown -R www-data /var/www/githook # 這裏請改成你創建的hook目錄
    chown -R www-data /var/www/Project # 這裏請改成你的項目目錄
    
  4. 設置目標倉庫webhook webhook

設置URL
URL:http://<domain>/githook/pull.php?[log_level=false][&path=xxx]

  • log_level 是否日誌等級;默認0:關閉日誌;15 打開所有日誌;打開日誌需要給logs目錄寫的權限
  • path 倉庫位置;默認 '../{repositoryname}',repositoryname:倉庫名;

目標倉庫必須要設置用戶名密碼或者SSH(讓git pull命令可以直接執行 )
最終將會執行cd {$path} && git pull 命令

注意事項

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

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

License

MIT

Copyright (c) 2019-present andyoung

 

歡迎Star https://github.com/AndyYoungCN/githook

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章