代码实现 (groovy)
通过 GraphQL(一)的内容我们大概了解了什么是graphql以及如何使用,下面我们目的就是结合jenkins对github进行操作
- 整理好GraphQL
- 选择目标仓库
- 使用groovy进行代码实现
GraphQL定义
def payload_repositoryID = "{\"query\":\"{repository(owner:\\\"${org}\\\", name:\\\"${repo}\\\"){id}}\"}"
def payload_branchProtectionRule = "{\"query\":\"{repository(owner:\\\"${org}\\\", name:\\\"${repo}\\\"){branchProtectionRules(last:20){nodes{id,pattern,requiredStatusCheckContexts}}}}\"}"
repoId = readJSON(text: callGraphQL(payload_repositoryID)).data.repository.id //获得仓库的id
masterProtectionRules = readJSON(text: callGraphQL(payload_branchProtectionRule))//获得所有的用户
masterRule = getMasterRule(masterProtectionRules)//拿到主用户
code freeze 实现
masterProtectionRuleID = masterRule.id //拿到master id
masterRequiredContexts = masterRule.requiredStatusCheckContexts // 拿到当前repo状态
masterRequiredContexts.add("code-freeze-by-yanci")//添加code freeze信息
formatContexts = formatRequiredStatusCheckContexts(masterRequiredContexts)
def playload_updateProtectionRule = "{\"query\":\"mutation{updateBranchProtectionRule(input:{pattern: \\\"${branch}\\\",branchProtectionRuleId :\\\"${masterProtectionRuleID}\\\",requiredStatusCheckContexts: ${formatContexts}}){clientMutationId}}\"}"
callGraphQL(playload_updateProtectionRule) //执行codefreeze
若此时想要code freeze 的master不存在 ,则需要用修改操作进行创建
def playload_creatProtectionRule = "{\"query\":\"mutation{createBranchProtectionRule(input:{pattern: \\\"${branch}\\\",repositoryId:\\\"${repoId}\\\",requiredStatusCheckContexts: \\\"code-freeze-by-yanci\\\",requiresStatusChecks: true,requiresStrictStatusChecks: false}){branchProtectionRule{id}}}\"}"
callGraphQL(playload_creatProtectionRule)
GraphQL 结合Jenkins实现
这里使用了jenkins 封装的httprequest方法
def callGraphQL(payload){
def httpRequest_map = [:]
httpRequest_map.url = ENTRY_POINT
httpRequest_map.acceptType = HTTP_HEADER_Accept
httpRequest_map.authentication = HTTP_HEADER_Authorization
httpRequest_map.contentType = HTTP_HEADER_Content_Type
httpRequest_map.httpMode = 'POST'
httpRequest_map.requestBody = payload
httpRequest_map.wrapAsMultipart = false
return httpRequest(httpRequest_map).content
}