写在前面的话
本项目的后端写Webhook的钩子Api使用的是.net core,其他的思路应该是一样的,请自己实现。
一、先写一个帮助类
先熟悉Process类,当然,你也可以直接复制下面的代码。
using System;
using System.Diagnostics;
namespace GitlabWebhook.Util
{
/// <summary>
/// 执行command命令
/// </summary>
public class Command
{
private string FilePath { get; }
private string WorkingDirectory { get; }
/// <summary>
/// 构造函数
/// </summary>
/// <param name="filePath">命令行工具位置,有设置环境变量的话可以直接使用命令名字,比如:git、dotnet等</param>
/// <param name="workingDirectory">执行命令的位置</param>
public Command(string filePath, string workingDirectory)
{
FilePath = filePath ?? throw new ArgumentNullException(nameof(filePath));
WorkingDirectory = workingDirectory ?? throw new ArgumentNullException(nameof(workingDirectory));
}
/// <summary>
/// 执行命令
/// </summary>
/// <param name="args">命令</param>
/// <returns>执行结果</returns>
public string Run(string args)
{
var starInfo = new ProcessStartInfo(FilePath, args)
{
CreateNoWindow = true,
RedirectStandardOutput = true,
UseShellExecute = false,
WorkingDirectory = WorkingDirectory
};
return Process.Start(starInfo).StandardOutput.ReadToEnd();
}
}
}
二、根据自己的心情,随便创建一个controller,有意义的名字更好。
创建一个接收HttpPost请求的方法,读取请求的Header与Body的内容。
var gitlabToken = Request.Headers["X-Gitlab-Token"].ToString();
var gitlabWebhookBody = JsonConvert.DeserializeObject<GitlabWebhookBody>(new StreamReader(Request.Body).ReadToEnd());
GitlabWebhookBody类请根据Gitlab Webhook请求Body格式创建。如果不想创建类,可以使用JObject。具体使用方法,请自行学习。
取项目配置,我放到了appsettings.json中,在构造函数中注入配置信息。
根据自己的限制,决定是否执行相关的命令。
//项目配置中的GitlabSToken值
var configXGitlabToken = _configuration[$"GitLabCommand:{ gitlabWebhookBody.repository.name }:X-Gitlab-Token"] ?? "".ToString();
//项目配置中的事件值
var configEventName = _configuration[$"GitLabCommand:{ gitlabWebhookBody.repository.name }:event_name"] ?? "".ToString();
//项目配置中的用户值
var configUserName = _configuration[$"GitLabCommand:{ gitlabWebhookBody.repository.name }:user_name"] ?? "".ToString();
//此处为我限制的自动拉取最新代码的逻辑,根据自己的实际情况设计即可,比如IP限制等
if (configXGitlabToken == gitlabToken && configEventName == gitlabWebhookBody.event_name && configUserName.Contains(gitlabWebhookBody.user_name))
{
var git = new CommandRunner("git", localPath);
result = git.Run("pull");
}
else
{
result = "参数未配置或配置不正确";
}
三、发布,部署。
服务器环境要先安装。需要的环境git,.net core的运行环境及IIS。代码能跑起来就可以啦。如果不适用IIS作托管,自行研究。主要就是要有权限执行Process。这个是排查问题的关键。
IIS配置有两点要修改,找到部署服务站点的应用程序池,高级设置中有两个地方。
a.进程模型中的标识要修改服务器管理员账号或者有管理员权限的账户。
b.进程模型中的加载用户配置文件设置为:True.
设置到这里我的服务已经可以正常运行了。可以自己用Postman测试看看执行的情况。如果有返回值并且返回值是正确的,那就恭喜你完成了百分之九十五的工作。
四、到Gitlab上设置Webhooks.
在设置中找到Integrations(中文为导入所有仓库,翻译的很不友好),设置就可以啦
个人习惯设置Tag push events.也可以根据自己的实际需要选择触发条件。
到此,你就可以不用登录到服务器更新代码了。
注:Webhook跟服务器联通了,并且可以在服务器执行相关的代码,这样你想对服务器做什么就可以发散思维了。