1. 程式人生 > >重新拾取:TFS2017釘釘機器人源代碼簽入通知

重新拾取:TFS2017釘釘機器人源代碼簽入通知

jms 多模板 ext part return 通過 list egl 備註

http://www.cnblogs.com/79039535/p/9316791.html

現在很多公司辦公都使用釘釘打卡簽到,於是鑒於公司也使用釘釘就打算用釘釘來做一個源代碼簽入通知。

首先先去打開官方網站了解釘釘的通知,釘釘機器人提供了很多模板(GitHub啊,GitLab啊, Coding啊)

但是沒有TFS~ 哈哈! 這裏我們選擇 自定義機器人 《釘釘開放平臺機器人文檔》

技術分享圖片

設置機器人名字,就是聊天對話時顯示的名稱

技術分享圖片

拿到webhook就可以進行服務掛鉤了~。 現在登錄你的TFS站點 -> 項目 -> 服務掛鉤

技術分享圖片

技術分享圖片

選擇已簽入代碼,當然可選的還有很多,可以選擇發布部署,CI/CD都可以掛鉤

技術分享圖片

可以提供參數寫入標頭,以及用戶名和密碼身份驗證。但這裏我主要是演示,就只設置URL

技術分享圖片

點擊測試通過可以看到TFS給你發送的JSON這裏我只要了部分信息。來顯示提交時間、提交版本、作者、提交備註

技術分享圖片

測試完成後就建立好服務掛鉤了~,這時候做個馬上做個站點來接受這個信息

我這裏是用ASP.NET Core WebAPI 建立項目,自己可以隨意。

技術分享圖片
    /// <summary>
    /// 釘釘處理器
    /// </summary>
    [Route("api/[controller]")]
    public class DingTalkController : Controller
    {
        /// <summary>
        /// 釘釘機器人TFS簽入掛鉤
        /// </summary>
        /// <remarks>
        /// 通過TFS服務掛鉤返回JSON來實現轉發釘釘機器人
        /// </remarks>
        /// <returns>Task</returns>
        [IgnoreGlobalResult]
        [HttpPost("PushCommitMessage")]
        public async Task<IActionResult> PostAsync()
        {
            var result = string.Empty;
            using (var reader = new StreamReader(Request.Body, Encoding.UTF8))
            {
                result = await reader.ReadToEndAsync();
                WorkItem jsonObj = JsonConvert.DeserializeObject<WorkItem>(result);
                if (jsonObj != null)
                {
                    var content = $"提交時間:{jsonObj.resource.createdDate.ToString("yyyy-MM-dd HH:mm:ss")}\n提交版本:{jsonObj.resource.changesetId}\n作者:{jsonObj.resource.author.displayName + "|" + jsonObj.resource.author.uniqueName}\n提交備註:{jsonObj.resource.comment}";
                    var url = "https://oapi.dingtalk.com/robot/send?access_token=fc10329e2d326d2eaf81a8317asasdasffdgdffghfghdadsfsdfadsfdsfga5dac3314e98fa88d";

                    //序列化JSON
                    TextTypeMsg objMsg = new TextTypeMsg();
                    objMsg.msgtype = "text";
                    objMsg.text = new TextTypeMsg.Text();
                    objMsg.text.content = content;
                    var json = JsonConvertHelper.ToJson(objMsg);

                    var request = new HttpRequest(HttpMethod.Post, url);
                    request.ContentType(HttpContentType.Json.Description());
                    request.SetJson(json);
 
                    DingTalkResult dingTalkResult = JsonConvertHelper.ToObject<DingTalkResult>(request.ResultAsync().Result);
                    OperationResult operationResult = new OperationResult();
                    if (dingTalkResult.errmsg == "ok")
                    {
                        operationResult.Code = ErrorCodeEnum.Success.ToString();
                        operationResult.Message = dingTalkResult.errmsg;
                        operationResult.Data = "";
                    }
                    else
                    {
                        operationResult.Code = ErrorCodeEnum.ThirdPartyError.ToString();
                        operationResult.Message = dingTalkResult.errmsg;
                        operationResult.Data = "";
                    }
                    return Json(operationResult);
                }
                else
                {
                    OperationResult operationResult = new OperationResult();
                    operationResult.Code = ErrorCodeEnum.SerializedError.ToString();
                    operationResult.Message = ErrorCodeEnum.SerializedError.Description();
                    operationResult.Data = "";
                    return Json(operationResult);
                }
            }
        }

    }

    public class DingTalkResult
    {
        public string errmsg { get; set; }
        public string errcode { get; set; }
    }

    public class WorkItem
    {
        public WorkItemResource resource { get; set; }
    }

    public class WorkItemResource
    {
        public int changesetId { get; set; }
        public Author author { get; set; }
        public DateTime createdDate { get; set; }
        public string comment { get; set; }
    }

    public class Author
    {
        public string displayName { get; set; }
        public string uniqueName { get; set; }
    }

    public class TextTypeMsg
    {
        public string msgtype { get; set; }
        public Text text { get; set; }
        public At at { get; set; }

        public class Text
        {
            public string content { get; set; }
        }

        public class At
        {
            public List<string> atMobiles { get; set; }

            public bool isAtAll { get; set; }
        }
    }
技術分享圖片

最終效果

技術分享圖片

參考文檔

https://open-doc.dingtalk.com/docs/doc.htm?spm=a219a.7629140.0.0.evfrZF&treeId=257&articleId=105735&docType=1

https://blog.csdn.net/xxdddail/article/details/73249468

重新拾取:TFS2017釘釘機器人源代碼簽入通知