.net持续集成sonarqube篇之 sonarqube触发webhook

系列目录

WebHook近些年来变得越来越流行,github,gitlab等代码托管平台都提供webhook功能.关于webhook这里不做详细介绍,大家可以参阅读相关互联网书籍或者材料来更深了解.可以把它简单理解为某一事件完成以后的一个回调.

在持续集成环境里,我们可以使用Sonarqube的webhook功能来实现持续发布和发布包归档功能.大致思路是当项目构建成功后我们可以通过webhook通知服务器构建任务已完成,接下来web 服务器可以根据webhook传递的参数决定要处理的包是哪个项目的包(通过项目的key来判断),如何对包进行归档以及如何把包发布到远程服务器(通过http,ftp等方式).

Web服务器搭建

要想实现webhook,必须有一个预先设计好的web服务器供回调.我们预先建好了一个web项目(新建一个mvc项目即可)

由于是测试,我们这里就用Visual的模板生成一个mvc项目,然后在Home控制器下新建一个Action,代码如下:

    public IActionResult HookTest([FromBody]SonarQubeVm sonar)
        {
            return new EmptyResult();
        }

由于Sonarqube webhook是通过post方式提交,因此action必须支持Post方式请求.

参数sonar是SonarQubeVm类型的参数,是根据Sonarqube请求规格文档构建的,代码如下:

 public class SonarQubeVm
    {
        public DateTime? AnalysedAt { get; set; }
        public SonarProjectInfo project { get; set; }
        public string ServerUrl { get; set; }
        public string Status { get; set; }
        public string TaskId { get; set; }
    }

    public class SonarProjectInfo
    {
        public string Key { get; set; }
        public string Name { get; set; }
    }

注意以上参数并不完全包含Sonarqube返回的所有参数,我们只取了部分.关于Sonarqube webhook完整请求参数请查看http://localhost:9000/documentation/webhooks,localhost:9000是默认的服务器的端口号,如果你更改了端口号或者从外网请求,则要更改为实际的ip地址(或者域名)加上指定的端口号.

WebHook调用

在Sonarqube里可以通过两种方式调用webhook,全局模式和项目模式.全局模式每当一个构建成功后就会触发.项目模式则只有指定的项目构建以后才会触发.

全局模式

如上图示,我们点击全局Administration然后点击configuration在出现的下拉列表里选择WebHooks,此时右上角有一个create按钮,点击后出现一个弹出框,要求输入名称和url,然后点击确定.

我们以调试模式启动web项目,然后执行一个Sonarqube项目构建,执行完成后看看是否有请求到达web服务器.

MSBuild.SonarQube.Runner.exe begin /k:"mytest" /n:"mytest" /v:"v3.0" /d:sonar.cs.opencover.reportsPaths="%CD%\testcover.xml"

msbuild.exe

"E:\personalproject\newTest2018\ConsoleApp1\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe" -output:"%CD%\testcover.xml" -register:user -target:"C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe" -targetargs:"%CD%\bin\Debug\NunitTest.dll"

MSBuild.SonarQube.Runner.exe end

以上是我们上一节讲单元测试的时候执行的代码只修改了版本号.我们执行它.

等等以上代码都执行完成,稍等片刻我们就可以看到http请求击中断点

通过serverurl是来自localhost:9000,我们可以确定是Sonarqube发来的请求.项目的key和name都是我们设定的mytest

以上仅是个示例程序,没有有用代码,实际项目中我们可以根据webhook请求的key来获取到构建的是哪个项目,然后根据预先设定的逻辑决定把它归档到哪里,以及把它发布到哪些web服务器下的哪些目录里(前面我们讲过通过ftt方式发布web项目,可以在这里使用)

项目模式

项目模式与全局模式设置完全一样,只是入口不同,项目模式需要进入项目的Administration标签里进行设置.仍然以mytest项目为例子,我们打开mytest项目,进入到Administration标签里选择webhooks即可.

设置和全局设置一样,这里不再赘述.

请求认证

通过以上配置,我们成功搞好了webhook功能,然而以上代码根本无法使用到生产环境中,因为没有对请求进行认证,如果任何人都可以调用构建服务器地址则后果不堪设想.我们必须对请求进行认证,然后再决定是否执行相应逻辑.

由于sonaqube不支持设置header,因此我们无法使用复杂的请求认证.只能使用基本的http认证

我们在服务端增加以下类

 public class BasicAuthenticationAttribute: ActionFilterAttribute
    {
        protected string Username { get; set; } = "sto";
        protected string Password { get; set; } = "sto";

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var req = filterContext.HttpContext.Request;
            var auth = req.Headers["Authorization"].ToString();
            if (!String.IsNullOrEmpty(auth))
            {
                var cred = System.Text.Encoding.ASCII.GetString(Convert.FromBase64String(auth.Substring(6))).Split(':');
                var user = new { Name = cred[0], Pass = cred[1] };
                if (user.Name == Username && user.Pass == Password) return;
            }
            filterContext.Result = new UnauthorizedResult();
        }
    }

以上代码中,我们通过硬编码方式指定了用户名和密码,实际生产环境中我们可以通过查询数据库来获取用户名和密码. 在OnActionExecuting重写方法中我们通过头信息Authorization获取加密的Base64字符串,然后通过:分割获取到用户名和密码.然后和真实用户名密码做对比然后决定下一步动作.

我们把这个filter加到请求方法上.

改造后的代码如下:

        [BasicAuthentication]
        public IActionResult HookTest([FromBody]SonarQubeVm sonar)
        {
            return new EmptyResult();
        }

我们把webhook的url更新为如下:

http://sto:[email protected]:49442/home/HookTest

实际上服务端逻辑要求账户和密码都必须是sto能请求,我们故意把密码改为sto1看看请求是否能成功.

我们仍然执行前面的构建代码,只是把版本号增加一下.

我们再进入webhook管理界面,可以看到请求失败了

我们点击失日期后面的四框图标,可以看到失败的状态是401

我们把请求地址更改为如下

http://sto:[email protected]:49442/home/HookTest

这里sto1改为服务器期待的sto,请求就能成功了.

原文地址:https://www.cnblogs.com/tylerzhou/p/11261868.html

时间: 2024-11-07 12:41:32

.net持续集成sonarqube篇之 sonarqube触发webhook的相关文章

gitlab+jenkins+maven+docker持续集成(十一)——sonarqube及sonarscanner代码审查

Sonar是一个用于代码质量管理的开源平台,用于管理Java源代码的质 量.通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具,比如pmd-cpd.checkstyle. findbugs.Jenkins.通过不同的插件对这些结果进行再加工处理,通过量化的方式度量代码质量的变化,从而可以方便地对不同规模和种类的工程 进行代码质量管理. 同时 Sonar 还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用 Sonar. 此外,Sonar 的插件还可以对

IOS使用jenkins进行持续集成 第二篇

上一篇,自己尝试进行持续集成,研究的不深入,这两天,为公司搭建持续集成环境,以及内部发布系统,了解的更多了,所以分享出来. 这篇主要介绍一些其他东西,不重复介绍上一篇的内容. 如果使用jenkins进行ios持续集成,需要xcode插件支持,所以先下载xcode插件,而且后期还要用到ftp服务,也安装ftp的插件. jenkins中可以自己创建特定的视图分组,all视图点击+号就能创建新视图,创建好后,在左侧的编辑视图选项,则会进入详情页,可以选择放入此视图的任务:相对于任务,我觉得最好依据代码

IOS使用jenkins进行持续集成 第一篇

本文主要讲述在开发过程中,提高工作效率而进行的IOS-Jenkins的持续集成. 背景 平时我们开发完成IOS项目,需要打包给测试人员进行测试.其中的过程需要重复进行:修改配置项--编译---连接设备--运行打包--debug进设备中--然后交给等待的测试人员.现有成熟的持续集成Jenkins解决方案,并且该方案也提供了Xcode插件的支持,可以讲上述过程封装成一键解决方案. 我实现的是jenkins执行IOS的job,build工程,签名打ipa包,上传到FTP服务器,放到tomcat下,提供

.net持续集成sonarqube篇之sonarqube基本操作(一)

系列目录 Sonarqube Web管理界面虽然设计的简洁大方,也非常直观,但是由于功能繁多,这对快速入手以及快速定位到想要的功能都是一个挑战,在以后的几个小节里我们简要介绍. OwerView(概览) 概览界面主要展示了项目lint的统计信息 可以看到这些栏目栏目大都是统计数字,并且带有链接,点击链接则可以看到详细信息.其实中有些栏目的统计数字旁边带有带圈的英文字母,这些字母中,从A到E质量依次下降,颜色逐渐由绿色变为红色.项目管理者可以根据这些评级和颜色大致了解某一主题的健康状况. 其中单元

持续集成高级篇之Jenkins Pipeline 集成sonarqube

系列目录 前面章节中我们讲到了Sonarqube的使用,其实Sonarqube获取msbuild结果主要是执行三个命令,开始标记,执行msbuild,结束标记,这些都是命令,是非常容易集成到我们ci流程中的,但是使用这种方式最为简单,但是Sonarqube插件与jenkins集成的更好,我们可以通过jenkins页面看到构建结果是否成功,以及可以通过链接轻松地跳到Sonarqube web管理界面.前面章节我们介绍了如何在自由式任务中使用sonarqube插件,这里我们讲下如何在pipeline

.net持续集成sonarqube篇之sonarqube安装与基本配置

系列目录 Sonarqube下载与安装 Sonarqube下载地址是:https://www.sonarqube.org/downloads/下载版本有两个,一个是长期支持版,另一个是最新版,此处安装的是最新版,目前版本是7.3,下载的时候点击醒目的蓝色按钮即可(此时下载的是社区版),下面有三个无底色按钮下载链接,分别对应的是开发者版,企业版和数据中心版,这些版本都不是免费版,需要获取Licence key方可使用.目前起步阶段,使用社区版就Ok了. 注意 Sonarqube是基于java语言开

持续集成高级篇之Jenkins cli与Jenkins ssh

系列目录 Jenkins Cli介绍 Jenkins Cli为Jenkins提供的一个cli工具,此工具功能非常强大,可以完成诸如重启jenkins,创建/删除job,查看job控制台输出,添加/删除节点等功能.但是实际工作中,像创建任务这样的配置显然cli非常吃力,不如直接在web管理界面操作,但是对于重启Jenkins,查看诊断信息等,执行一个手动构建任务等,则直接使用cli比进入web管理界面操作更加方便.因此什么时候web管理界面,什么时候使用cli,要看是否有利于提升生产力,是否有利于

持续集成高级篇之基于win32-openssh搭建jenkins混合集群(一)

系列目录 前面的demo我们使用的都是只有一个windows主节点的的jenkins,实际生产环境中,一个节点往往是不能满足需求的.比如,.net项目要使用windows节点构建,java项目如果部署在linux服务器上往往也需要目标类型的linux节点做为构建节点,开发中使用的jdk版本不同也可能需要不同的构建主机.构建docker镜像往往也需要linux主机(强烈不建议使用docker for windows 进行linux环境的docker构建).本节我们讲解如何搭建一个主节点为windo

.net持续集成cake篇之使用vs或者vscode来辅助开发cake脚本

系列目录 使用Visual Studio来开发工具 前面我们都是通过手写或者复制的方法来编写Cake文件,Cake使用的是C#语言,如果仅使用简单的文本编辑器来编写显然效率是非常低下的,本节我们讲解如何使用cake Visual Studio插件来通过模板创建cake文件,以及如何使得Visual Studio来调试Cake文件 安装Cake Visual Studio插件 我们在Visual Studio插件管理器里搜索Cake就可以搜索到Cake for visual studio插件,然后