專案

一般

個人檔案

動作

如何在 Redmine 中設定儲存庫於提交時自動更新

從 0.9.0 版開始,您可以使用 HTTP GET 提交在儲存庫中提交修改後自動更新 Redmine。

範例

  • /sys/fetch_changesets?key=<您的服務金鑰> 會擷取所有活動專案的變更集
  • /sys/fetch_changesets?id=<專案識別碼>&key=<您的服務金鑰> 會從特定專案的儲存庫中擷取變更集
注意事項
  • 除了呼叫網址之外,您也可以使用 ruby /path_to_redmine/redmine/script/rails runner "Repository.fetch_changesets" -e production > /dev/null 2>&1 &
  • 另請注意,專案識別碼可以是專案的編號,例如 id=1,也可以是您為專案指定的識別碼名稱,例如 id=mobileapp

如需原始功能請求,請參閱 #2925

步驟 1:設定 Redmine 以接受請求

必須在「管理」選單中啟用儲存庫的網路服務(管理 - 設定 - 儲存庫 - 啟用儲存庫管理的 WS),並且呼叫者必須在步驟 2 中使用產生的 API 金鑰(以下文件中稱為「您的服務金鑰」)。

步驟 2:在 SCM 伺服器上設定 post-commit 腳本

您必須設定一個 post-commit 腳本,用於呼叫先前的網址。

Subversion

只需在 hooks 子目錄中新增一個 post-commit(或 Windows 系統上的 post-commit.cmd)腳本檔案,其中包含 HTTP 請求呼叫

#!/bin/sh

curl "http://<redmine url>/sys/fetch_changesets?key=<your service key>" 

或者,如果您想使用 wget
wget "http://<redmine url>/sys/fetch_changesets?key=<your service key>" 

注意:請勿忘記將 wget 新增到您的電腦路徑中。

或者,在 Windows 系統上(2 個檔案)

  • post-commit.cmd :
    cscript "%~dp0refresh_redmine.vbs" //Nologo >> "%~dp0refresh_redmine.log" 2>&1
    
  • refresh_redmine.vbs :
    private const REDMINE_SERVICE_KEY = "<your service key>" 
    
    Call HTTPGet("http://<redmine url>/sys/fetch_changesets?key=" & REDMINE_SERVICE_KEY)
    
    Private Function HTTPGet(sUrl)
      Dim oHTTP
      set oHTTP = CreateObject("Microsoft.XMLHTTP")
      oHTTP.open "GET", sUrl, False
      oHTTP.send
      HTTPGet = oHTTP.responseText
    End Function
    

    或者,對於 https
    private const REDMINE_SERVICE_KEY = "<your service key>" 
    
    Call HTTPGet("https://<redmine url>/sys/fetch_changesets?id=<your project id>&key=" & REDMINE_SERVICE_KEY)
    
    Private Function HTTPGet(sUrl)
      Dim oHTTP
      set oHTTP = CreateObject("MSXML2.ServerXMLHTTP")
      oHTTP.open "GET", sUrl, False
      oHTTP.setOption 2, 13056
      oHTTP.send
      HTTPGet = oHTTP.responseText
    End Function
    

或者,在 Windows 系統上

如果您的系統路徑中有 Ruby,只需在儲存庫的 hooks 子目錄中建立 post-commit.bat 腳本檔案

ruby -e "require 'open-uri'; open('http://<redmine url>/sys/fetch_changesets?key=<your service key>').read;" 

如果已安裝 Perl,只需在儲存庫的 hooks 子目錄中建立 post-commit.bat 腳本檔案

perl -mLWP::Simple -e "$url = 'http://<redmine url>/sys/fetch_changesets?key=<your service key>'; LWP::Simple::get($url);" 

Git

只需在 hooks 子目錄中新增一個 post-receive(即使在 Windows 系統上,也不需要副檔名)腳本檔案,其中包含 HTTP 請求呼叫

#!/bin/sh

curl "http://<redmine url>/sys/fetch_changesets?key=<your service key>" 

這種設定適用於「常見」的情況,即 Redmine 的版本庫設定為一個裸 Git 版本庫,因此無法直接在其中進行提交。如果您有一個罕見的設定,即一個非裸版本庫鏈接到 Redmine,則您也需要將腳本添加為 post-commit 鉤子。

不要忘記在類 UNIX 系統上使文件可執行,更多關於 Git 鉤子的資訊可以在 githooks 線上手冊頁中找到。

如果 Redmine 專案被配置為使用與原始 Git 版本庫位於同一主機上的鏡像版本庫,您也可以使用 post-receive 鉤子來更新該 Redmine 鏡像版本庫,因此整個腳本可以是

#!/bin/sh

cd /<path_to_origin_git_repo>/<your_git_prj.git>
git push /<redmine_path>/<git_repo>/<your_git_prj.git> master
curl "http://<redmine url>/sys/fetch_changesets?key=<your service key>" 
  • 這也將消除對鏡像同步 cron 腳本的需求,並且將有助於在每次 git push 事件之後保持 Redmine 的專案版本庫同步

僅更新相關專案

/sys/fetch_changesets 接受 id 參數,因此您可以將更新限制在正確的專案

#!/bin/bash

_apikey=XXXXXXXXXXXXXXXXXXXX

_projectid=${PWD##*/}
_projectid=${_projectid%*.git}

curl "http://<redmine url>/sys/fetch_changesets?key=$_apikey&id=$_projectid"&

僅更新相關版本庫

如果您可以將提交鉤子安裝在版本庫伺服器上,則可以使用 這個 外掛程式僅獲取特定版本庫的提交。

Tom Rochette超過 8 年前 更新 · 29 個版本