JFrog Xray:使用webhook轻松创建Jira问题

JFrog Xray:使用webhook轻松创建Jira问题

JFrog Xray提供端到端的安全扫描解决方案覆盖工件的整个开发生命周期。这包括脆弱性分析、安全性和许可遵从性、工件流控制、分发等等。当Xray发现安全或许可证问题时,它将触发违规。在开发周期中最常见的用例之一是能够使用Jira等常用工具跟踪这些问题,Xray Webhooks允许您这样做。

首先,什么是webhook?

一个Webhook是一种API概念,用于通过自定义回调来改变web请求行为,由第三方用户、开发人员或程序使用必须与原始网站或应用程序相关联。这也可以称为“反向API”。

假设我们有一个由x射线触发的违规行为,我们有一个带有手表的x射线策略,该手表被配置为向特定的第三方应用程序发送Webhook。为了使…. json我们可以使用一个简单的脚本来解析数据,并将其显示在Jira票据甚至Slack消息中。

JFrog x射线违规

5个简单的步骤来实现与Jira一起工作的Xray webhook

这是我们需要做的:

  1. 创建一个“轻型”服务器,它将知道如何侦听远程请求。
  2. 配置一个x射线网钩,与政策这会触发它。
  3. 理解结构x射线网钩. json文件,以便正确解析信息。(见受感染的文件结构下面部分中的代码片段)
  4. 一旦能够解析信息,就需要定义要发送到JIRA服务器的内容以及问题将包含哪些信息。(见从Xray Handler创建Jira下面部分中的代码片段)
  5. 使用这些信息实现Jira服务器交互。

为什么Go是最好的方式?

Go是一门超级简单的语言使用!只需几行代码,我们就可以轻松地创建一个服务器,它可以立即启动并运行,并且知道如何侦听HTTP请求。根据我的经验,与其他语言相比,使用Go编程语言要容易得多。

此外,为了帮助我们创建Jira客户端对象并使用它来打开一个问题,我们可以使用go-jira,一个非常好的开源库在GoCenter上也可以找到这里有一个很好的例子

剩下要做的就是在Jira服务器上创建一个用户,并为其提供创建问题的访问权限。

去的例子

让我们看看实际操作!下面是你可以使用的Go结构和处理程序片段:

1.违反结构

这个结构定义了我们要为之创建Jira罚单的x射线违规。Xray创建了一个违规,它被webhook以JSON格式捕获。

type违规struct {Created string ' json:" Created " ' TopSeverity string ' json:"top_severity" ' WatchName string ' json:"watch_name" ' PolicyName string ' json:"policy_name" ' Issues Issues ' json:" Issues " '}

2.问题的结构

部分违规是许可证或安全问题。

type Issue struct {Severity string ' json:" Severity " ' type string ' json:"type" ' // Issue类型license/security Summary string ' json:" Summary " ' Description string ' json:" Description " ' ImpactedArtifacts ImpactedArtifacts ' json:"impacted_artifacts" '} type Issues []Issue

3.冲击工件结构

每个问题都包含Artifactory中许多受冲突影响的工件。

type ImpactedArtifact struct {Name string ' json:" Name " ' //工件名称DisplayName string ' json:"display_name" ' Path string ' json:" Path " ' //工件在Artifactory中的路径PackageType string ' json:"pkg_type" ' SHA256 string ' json:" SHA256 " ' //工件SHA256校验和SHA1字符串' json:" SHA1 " ' Depth int ' json:" Depth " ' //工件在其层次结构中的深度ParentSHA string ' json:"parent_sha" ' InfectedFiles ' json:"infected_files" '} type ImpactedArtifacts []ImpactedArtifact . html

4.受感染的文件结构

每个工件可以包含许多受感染的文件,这些是受感染的组件。

type InfectedFile struct {Name string ' json:" Name " ' Path string ' json:" Path " ' //工件在Artifactory中的路径SHA256 string ' json:" SHA256 " ' //工件SHA256校验和Depth int ' json:" Depth " ' //工件在其层次结构中的深度ParentSHA string ' json:"parent_sha" ' //父工件SHA1 DisplayName string ' json:"display_name" ' PackageType string ' json:"pkg_type" '} type InfectedFiles []InfectedFile

从x射线处理程序示例创建Jira

下面是使用上述结构的完整示例。

函数CreateJira()ResponseWriter, r *http.Request) {var违规违规var jiraAccountConfiguration JiraAccountConf var jiraIssueConfiguration JiraIssueConf jiraAccountConfiguration = readjiraconconfigurationfile ("config/jira-create-issue.json") jiraIssueConfiguration = ReadJiraIssueFile ("config/jira-create-issue.json") body, err:= ioutill . readall (io.LimitReader(r。Body, 5048576)) if err != nil{panic(err)} if err:= json。Unmarshal(身体,违反);= nil {w.p header()。集(“内容类型”、“application / json;如果err:= json.NewEncoder(w).Encode(err);= nil {panic(Err)}}Println("打开jira帐户配置文件")tp:= jira。BasicAuthTransport{用户名:strings.TrimSpace(jiraAccountConfiguration.UserName),密码:strings.TrimSpace(jiraAccountConfiguration.Password),} client, err:= jira.NewClient(tp.Client(), strings.TrimSpace(jiraAccountConfiguration.ConnectionString))如果err !Printf("\ error: %v\n", err) return} i:= jira。问题{字段:&jira。IssueFields{受让人:&jira。用户{名称:jiraIssueConfiguration。受让人,记者:User{ Name: jiraIssueConfiguration.Reporter, }, Description: "The watch " + violation.WatchName + " with policy " + violation.PolicyName + " created a violation with " + getIssuesCount(violation) + " number of issues", Type: jira.IssueType{ Name: jiraIssueConfiguration.IssueType, // BUG/IMPROVEMENT/TASK ETC }, Project: jira.Project{ Key: jiraIssueConfiguration.Project, // PROJECT_NAME on Jira Server }, Summary: "Violation was found with " + violation.TopSeverity + " severity", }, } issue, _, err := client.Issue.Create(&i) if err != nil { panic(err) } fmt.Println("%s: %+v\n", issue.Key) }

去吧,你自己试一试!