CMDB控制Jenkins实现持续集成(js篇)
过程说明
- 研发提交代码至gitlab
- refs/heads/* [branch] 约定:开发环境自动部署
- refs/tags/* [tag] 约定:生产环境自动部署
- cmdb通过webHooks判断构建任务及相关参数触发jenkins任务
- 若任务不存在,则通过模版创建任务
- jenkins执行任务(agent)
- jenkins构建完成(npm),通过ossutil工具将结果上传至aliyun oss;
- jenkins执行任务过程中将日志(job event)通知给cmdb
- cmdb收到job event生成任务记录并发送通知到钉钉群(研发群组)
Gitlab配置仓库webHooks
- URL:http://cmdb/git/webHooks
- 勾选Push event&Tag push events
- Add Web Hook
web hooks文档
http://gitlab.com/help/web_hooks/web_hooks
{
"before": "95790bf891e76fee5e1747ab589903a6a1f80f22",
"after": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
# 判断是否tag
"ref": "refs/heads/master",
"user_id": 4,
"user_name": "John Smith",
"project_id": 15,
# 代码仓库
"repository": {
"name": "Diaspora",
"url": "git@example.com:diaspora.git",
"description": "",
"homepage": "http://example.com/diaspora"
},
# 提交记录,可能有多个
"commits": [
{
"id": "b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327",
"message": "Update Catalan translation to e38cb41.",
"timestamp": "2011-12-12T14:27:31+02:00",
"url": "http://example.com/diaspora/commits/b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327",
"author": {
"name": "Jordi Mallach",
"email": "jordi@softcatala.org"
}
},
{
"id": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
"message": "fixed readme",
"timestamp": "2012-01-03T23:36:29+02:00",
"url": "http://example.com/diaspora/commits/da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
"author": {
"name": "GitLab dev user",
"email": "gitlabdev@dv6700.(none)"
}
}
],
# commit总数
"total_commits_count": 4
}
cmdb webHoos接口
Controller (GitlabController.java)
package com.sdg.cmdb.controller;
import com.sdg.cmdb.domain.HttpResult;
import com.sdg.cmdb.domain.gitlab.GitlabWebHooksVO;
import com.sdg.cmdb.service.GitlabService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@RestController
@RequestMapping("/git")
public class GitlabController {
@Resource
private GitlabService gitlabService;
@RequestMapping(value = "/webHooks", method = RequestMethod.POST)
public HttpResult forTriger(@RequestBody GitlabWebHooksVO webhooks) {
return new HttpResult(gitlabService.webHooks(webhooks));
}
}
Service (GitlabServiceImpl.java)
package com.sdg.cmdb.service.impl;
import com.sdg.cmdb.dao.cmdb.GitlabDao;
import com.sdg.cmdb.dao.cmdb.JenkinsDao;
import com.sdg.cmdb.domain.BusinessWrapper;
import com.sdg.cmdb.domain.configCenter.ConfigCenterItemGroupEnum;
import com.sdg.cmdb.domain.configCenter.itemEnum.JenkinsItemEnum;
import com.sdg.cmdb.domain.gitlab.CommitsVO;
import com.sdg.cmdb.domain.gitlab.GitlabWebHooksCommitsDO;
import com.sdg.cmdb.domain.gitlab.GitlabWebHooksDO;
import com.sdg.cmdb.domain.gitlab.GitlabWebHooksVO;
import com.sdg.cmdb.service.ConfigCenterService;
import com.sdg.cmdb.service.GitlabService;
import com.sdg.cmdb.service.JenkinsService;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
@Service
public class GitlabServiceImpl implements GitlabService {
// 分支类型
private static final String GIT_TAG_PREFIX = "refs/tags/";
private static final String GIT_HEADER_PREFIX = "refs/heads/";
private static final String GIT_COMMIT_NULL ="0000000000000000000000000000000000000000";
@Resource
private GitlabDao gitlabDao;
@Resource
private JenkinsService jenkinsService;
@Resource
private JenkinsDao jenkinsDao;
@Resource
private ConfigCenterService configCenterService;
private HashMap<String, String> configMap;
@Value("#{cmdb['invoke.env']}")
private String invokeEnv;
private HashMap<String, String> acqConifMap() {
if (configMap != null) return configMap;
return configCenterService.getItemGroup(ConfigCenterItemGroupEnum.JENKINS.getItemKey());
}
@Override
public BusinessWrapper<Boolean> webHooks(GitlabWebHooksVO webHooks) {
String email = acqEmailByWebHooks(webHooks);
GitlabWebHooksDO webHooksDO = new GitlabWebHooksDO(webHooks, acqProjectName(webHooks), GitlabWebHooksDO.HooksTypeEnum.ft.getCode(), email);
// 插入触发code
invokeFtBuild(webHooksDO);
List<CommitsVO> commits = webHooks.getCommits();
try {
gitlabDao.addWebHooks(webHooksDO);
if (commits != null) {
for (CommitsVO commitsVO : commits) {
GitlabWebHooksCommitsDO commitsDO = new GitlabWebHooksCommitsDO(commitsVO, webHooksDO.getId());
gitlabDao.addCommits(commitsDO);
}
}
// 执行构建
if (webHooksDO.getTriggerBuild() == GitlabWebHooksDO.TriggerTypeEnum.trigger.getCode()) {
boolean result = jenkinsService.buildFtJob(webHooksDO, acqParams(webHooksDO), acqFtEnvType(webHooksDO));
}
return new BusinessWrapper<Boolean>(true);
} catch (Exception e) {
e.printStackTrace();
return new BusinessWrapper<Boolean>(false);
}
}
private String acqEmailByCommit(String commit) {
List<GitlabWebHooksCommitsDO> list = gitlabDao.queryCommitsByCommit(commit);
for (GitlabWebHooksCommitsDO commitsDO : list) {
if (!StringUtils.isEmpty(commitsDO.getAutherEmail()))
return commitsDO.getAutherEmail();
}
return "";
}
@Override
public String acqEmailByWebHooks(GitlabWebHooksVO webHooks) {
String email = webHooks.acqEmail();
if (StringUtils.isEmpty(email))
return acqEmailByCommit(webHooks.getAfter());
return email;
}
/**
* 插入前端是否构建code
*
* @return
*/