CMDB控制Jenkins实现持续集成(js篇)
来源:互联网 发布:手机版淘宝怎么买二手 编辑:程序博客网 时间:2024/04/30 14:41
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.51xianqu.net/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;@Servicepublic 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 */ private void invokeFtBuild(GitlabWebHooksDO webHooksDO) { if(webHooksDO.getCommitAfter().equalsIgnoreCase(GIT_COMMIT_NULL)){ // 空提交则跳过更新 webHooksDO.setTriggerBuild(GitlabWebHooksDO.TriggerTypeEnum.skip.getCode()); return ; } int ftEnvType = acqFtEnvType(webHooksDO); int trigger = GitlabWebHooksDO.TriggerTypeEnum.trigger.getCode(); try { if (ftEnvType == GitlabWebHooksVO.EnvTypeEnum.tag.getCode()) { webHooksDO.setTriggerBuild(trigger); return; } if (ftEnvType == GitlabWebHooksVO.EnvTypeEnum.header.getCode()) { HashMap<String, String> configMap = acqConifMap(); String ftBuildBranchs = configMap.get(JenkinsItemEnum.JENKINS_FT_BUILD_BRANCH.getItemKey()); String[] bs = ftBuildBranchs.split(","); String branch = acqBranch(webHooksDO); for (String b : bs) { if (branch.equalsIgnoreCase(b)) { webHooksDO.setTriggerBuild(trigger); break; } } } } catch (Exception e) { e.printStackTrace(); } } /** * 获取构建参数 * mbranch 分支名称 * deployPath 部署路径 * * @param webHooks * @return */ private HashMap<String, String> acqParams(GitlabWebHooksDO webHooks) { HashMap<String, String> params = new HashMap<>(); params.put("mbranch", acqBranch(webHooks)); params.put("deployPath", acqFtDeployPath(webHooks)); // 项目名 params.put("project", webHooks.getProjectName()); // 仓库名 params.put("repo", webHooks.getRepositoryName()); return params; } /** * 通过ref判断环境类型 * refs/heads/master * refs/tags/1.0.0 * * @param webHooks * @return */ private int acqFtEnvType(GitlabWebHooksDO webHooks) { String ref = webHooks.getRef(); if (ref.indexOf(GIT_TAG_PREFIX) != -1) return GitlabWebHooksVO.EnvTypeEnum.tag.getCode(); if (ref.indexOf(GIT_HEADER_PREFIX) != -1) return GitlabWebHooksVO.EnvTypeEnum.header.getCode(); return GitlabWebHooksVO.EnvTypeEnum.err.getCode(); } private String acqProjectName(GitlabWebHooksVO webHooks) { if (!StringUtils.isEmpty(webHooks.getProjectName())) return webHooks.getProjectName(); if (StringUtils.isEmpty(webHooks.getRepositoryHomepage())) return ""; try { URL url = new URL(webHooks.getRepositoryHomepage()); String path = url.getPath(); String s[] = path.split("/"); String projectName = s[1]; return projectName; } catch (Exception e) { e.printStackTrace(); } return ""; } /** * 获取部署路径 * prod * http://oss/one/distribution/1.0.4/build/statement/index.js * one/distribution/1.0.4 * * daily * http://cdndaily/one/distribution_branch/dev/build/statement/index.js * one/distribution_branch/dev * * @param webHooks * @return */ private String acqFtDeployPath(GitlabWebHooksDO webHooks) { String projectName = webHooks.getProjectName(); System.err.println("projectName=" + projectName); if (StringUtils.isEmpty(projectName)) return ""; String repo = webHooks.getRepositoryName(); System.err.println("repo=" + repo); if (StringUtils.isEmpty(repo)) return ""; String branch = acqBranch(webHooks); System.err.println("branch=" + branch); if (StringUtils.isEmpty(branch)) return ""; int buildType = acqFtEnvType(webHooks); if (buildType == GitlabWebHooksVO.EnvTypeEnum.err.getCode()) return ""; HashMap<String, String> configMap = acqConifMap(); String ossBucketFtOnline = configMap.get(JenkinsItemEnum.JENKINS_OSS_BUCKET_FT_ONLINE.getItemKey()); if (buildType == GitlabWebHooksVO.EnvTypeEnum.tag.getCode()) { System.err.println("deployPath=" + projectName + "/" + repo + "/" + branch); return ossBucketFtOnline + "/" + projectName + "/" + repo + "/" + branch; } if (buildType == GitlabWebHooksVO.EnvTypeEnum.header.getCode()) { System.err.println("deployPath=" + projectName + "/" + repo + "_branch/" + branch); return projectName + "/" + repo + "_branch/" + branch; } return ""; } private String acqBranch(GitlabWebHooksDO webHooks) { String ref = webHooks.getRef(); int buildType = acqFtEnvType(webHooks); if (buildType == GitlabWebHooksVO.EnvTypeEnum.tag.getCode()) return ref.replace(GIT_TAG_PREFIX, ""); if (buildType == GitlabWebHooksVO.EnvTypeEnum.header.getCode()) return ref.replace(GIT_HEADER_PREFIX, ""); return ""; }}
CMDB调用jenkins job
Service (JenkinsServiceImpl.java)
package com.sdg.cmdb.service.impl;import com.offbytwo.jenkins.JenkinsServer;import com.offbytwo.jenkins.model.*;import com.sdg.cmdb.dao.cmdb.GitlabDao;import com.sdg.cmdb.dao.cmdb.JenkinsDao;import com.sdg.cmdb.dao.cmdb.UserDao;import com.sdg.cmdb.domain.BusinessWrapper;import com.sdg.cmdb.domain.TableVO;import com.sdg.cmdb.domain.auth.UserDO;import com.sdg.cmdb.domain.configCenter.ConfigCenterItemGroupEnum;import com.sdg.cmdb.domain.configCenter.itemEnum.JenkinsItemEnum;import com.sdg.cmdb.domain.gitlab.GitlabWebHooksDO;import com.sdg.cmdb.domain.gitlab.GitlabWebHooksVO;import com.sdg.cmdb.domain.jenkins.*;import com.sdg.cmdb.service.ConfigCenterService;import com.sdg.cmdb.service.DingtalkService;import com.sdg.cmdb.service.JenkinsService;import com.sdg.cmdb.util.SessionUtils;import com.sdg.cmdb.util.TimeViewUtils;import com.sdg.cmdb.util.TplUtils;import org.apache.commons.lang.StringUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.InitializingBean;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Service;import javax.annotation.Resource;import java.net.URI;import java.net.URISyntaxException;import java.text.SimpleDateFormat;import java.util.*;@Servicepublic class JenkinsServiceImpl implements JenkinsService, InitializingBean { private static final Logger coreLogger = LoggerFactory.getLogger("coreLogger"); private static final Logger logger = LoggerFactory.getLogger(JenkinsServiceImpl.class); private static JenkinsServer jenkinsServer; @Resource private JenkinsDao jenkinsDao; @Resource private GitlabDao gitlabDao; @Resource private UserDao userDao; @Resource private DingtalkService dingtalkService; private String jenkinsHost; @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()); } private void init() { HashMap<String, String> configMap = acqConifMap(); String jenkinsHost = configMap.get(JenkinsItemEnum.JENKINS_HOST.getItemKey()); String jenkinsUser = configMap.get(JenkinsItemEnum.JENKINS_USER.getItemKey()); // tokin String jenkinsPwd = configMap.get(JenkinsItemEnum.JENKINS_PWD.getItemKey()); try { URI tmp = new URI(jenkinsHost); JenkinsServer jenkins = new JenkinsServer(tmp, jenkinsUser, jenkinsPwd); this.jenkinsServer = jenkins; } catch (URISyntaxException e) { e.printStackTrace(); } } @Override public String acqJenkinsHost() { if (StringUtils.isEmpty(jenkinsHost)) { HashMap<String, String> configMap = acqConifMap(); jenkinsHost = configMap.get(JenkinsItemEnum.JENKINS_HOST.getItemKey()); } return jenkinsHost; } @Override public BusinessWrapper<Boolean> jobNotes(JobNoteVO jobNoteVO) { JobNoteDO jobNoteDO = new JobNoteDO(jobNoteVO); JenkinsJobBuildDO jobBuildDO = jenkinsDao.queryJobBuildsByJobNameAndBuildNumber(jobNoteDO.getJobName(), jobNoteDO.getBuildNumber()); jenkinsDao.addJobNote(jobNoteDO); // 记录 artifacts Map<String, HashMap<String, String>> artifacts = jobNoteVO.getBuild().getArtifacts(); for (String artifactsName : artifacts.keySet()) { HashMap<String, String> artifact = artifacts.get(artifactsName); if (artifact.containsKey("archive")) { String archiveUrl = artifact.get("archive"); BuildArtifactDO artifactDO = new BuildArtifactDO(jobBuildDO.getId(), artifactsName, archiveUrl); try { BuildArtifactDO checkArtifact = jenkinsDao.queryBuildArtifact(artifactDO.getJobBuildsId(), artifactDO.getArtifactsName(), artifactDO.getArchiveUrl()); if (checkArtifact == null) jenkinsDao.addBuildArtifact(artifactDO); } catch (Exception e) { e.printStackTrace(); } } } this.dingtalkNotes(jobNoteDO, jobBuildDO); return new BusinessWrapper<>(true); } /** * 发送dingtalk通知 * * @param jobNoteDO */ @Override public void dingtalkNotes(JobNoteDO jobNoteDO, JenkinsJobBuildDO jobBuildDO) { if (jobBuildDO == null) return; // 判断任务环境类型 JenkinsJobDO jenkinsJobDO = jenkinsDao.queryJenkinsJobById(jobBuildDO.getJobId()); if (jenkinsJobDO.getBuildType() == GitlabWebHooksDO.HooksTypeEnum.ft.getCode()) { ftDingtalkNotes(jenkinsJobDO, jobNoteDO, jobBuildDO); return; } if (jenkinsJobDO.getBuildType() == GitlabWebHooksDO.HooksTypeEnum.android.getCode()) { androidDingtalkNotes(jenkinsJobDO, jobNoteDO, jobBuildDO); return; } } private void androidDingtalkNotes(JenkinsJobDO jenkinsJobDO, JobNoteDO jobNoteDO, JenkinsJobBuildDO jobBuildDO) { // prod if (jobNoteDO.getBuildPhase().equalsIgnoreCase("QUEUED")) return; if (jobNoteDO.getBuildPhase().equalsIgnoreCase("COMPLETED")) return; try { List<BuildArtifactDO> artifacts = jenkinsDao.queryBuildArtifactByJobBuildsId(jobBuildDO.getId()); HashMap<String, String> params = acqAndroidParams(jenkinsJobDO); dingtalkService.sendAndroidBuildMsg(artifacts, params, jobBuildDO, new JobNoteVO(jobNoteDO, acqJenkinsHost(), jobBuildDO.getBuildType())); jobNoteDO.setNotice(true); jenkinsDao.updateJobNote(jobNoteDO); } catch (Exception e) { e.printStackTrace(); } } private void ftDingtalkNotes(JenkinsJobDO jenkinsJobDO, JobNoteDO jobNoteDO, JenkinsJobBuildDO jobBuildDO) { // daily if (jenkinsJobDO.getJobEnvType() == GitlabWebHooksVO.EnvTypeEnum.header.getCode()) { if (!jobNoteDO.getBuildPhase().equalsIgnoreCase("FINALIZED")) return; } // prod if (jenkinsJobDO.getJobEnvType() == GitlabWebHooksVO.EnvTypeEnum.tag.getCode()) { if (jobNoteDO.getBuildPhase().equalsIgnoreCase("QUEUED")) return; if (jobNoteDO.getBuildPhase().equalsIgnoreCase("COMPLETED")) return; } try { dingtalkService.sendFtBuildMsg(jobBuildDO, new JobNoteVO(jobNoteDO, acqJenkinsHost(), jobBuildDO.getBuildType())); jobNoteDO.setNotice(true); jenkinsDao.updateJobNote(jobNoteDO); } catch (Exception e) { e.printStackTrace(); } } @Override public boolean buildFtJob(GitlabWebHooksDO webHooks, HashMap<String, String> params, int envType) { logger.info("Jenkins build ftJob={} ", webHooks.getProjectName() + "." + webHooks.getRepositoryName()); String jobName = webHooks.getProjectName() + "." + webHooks.getRepositoryName(); String fullJobName = acqFullJobName(jobName, envType); // 保存任务 JenkinsJobDO jenkinsJobDO = saveJenkinsJob(webHooks, fullJobName, envType, GitlabWebHooksDO.HooksTypeEnum.ft.getCode()); // 保存任务参数 saveFtJobParams(jenkinsJobDO, params); Job ftJob = getJob(fullJobName); // job不存在 if (ftJob == null) { coreLogger.info("Jenkins job={} does not exist", fullJobName); if (!createFtJob(fullJobName, envType)) { coreLogger.info("Jenkins create job={} failed", fullJobName); return false; } else { // 重新获取job ftJob = getJob(fullJobName); if (ftJob == null) return false; } } UserDO userDO = acqUser(webHooks); return build(ftJob, params, userDO, jenkinsJobDO, webHooks.getId()); } /** * 保存前端构建的参数 * * @param jenkinsJobDO * @param params */ private void saveFtJobParams(JenkinsJobDO jenkinsJobDO, HashMap<String, String> params) { if (jenkinsJobDO == null || jenkinsJobDO.getId() == 0) return; for (String key : params.keySet()) { String value = params.get(key); JobParamDO param = jenkinsDao.queryJobParamByJobIdAndName(jenkinsJobDO.getId(), key); if (param != null) return; param = new JobParamDO(jenkinsJobDO.getId(), key, value); try { jenkinsDao.addJobParam(param); } catch (Exception e) { e.printStackTrace(); } } } @Override public BusinessWrapper<Boolean> buildJob(long id) { JenkinsJobDO jobDO = jenkinsDao.queryJenkinsJobById(id); if (jobDO == null) return new BusinessWrapper<Boolean>(false); if (jobDO.getBuildType() == GitlabWebHooksDO.HooksTypeEnum.android.getCode()) return buildAndroidJob(jobDO); return new BusinessWrapper<Boolean>(false); } /** * android打包 * * @param jobDO * @return */ private BusinessWrapper<Boolean> buildAndroidJob(JenkinsJobDO jobDO) { String jobName = jobDO.getJobName(); Job androidJob = getJob(jobName); // job不存在 if (androidJob == null) { coreLogger.info("Jenkins job={} does not exist", jobName); return new BusinessWrapper<Boolean>(false); } HashMap<String, String> params = acqAndroidParams(jobDO); UserDO userDO = userDao.getUserByName(SessionUtils.getUsername()); boolean r = build(androidJob, params, userDO, jobDO, 0); return new BusinessWrapper<Boolean>(r); } private HashMap<String, String> acqAndroidParams(JenkinsJobDO jobDO) { List<JobParamDO> list = jenkinsDao.queryJobParamByJobId(jobDO.getId()); HashMap<String, String> params = new HashMap<>(); // 自定义参数 for (JobParamDO jobParamDO : list) { params.put(jobParamDO.getParamName(), jobParamDO.getParamValue()); } // 部署路径 params.put("deployPath", acqDeployPath(params)); // 项目名 params.put("project", acqProject(jobDO.getRepositoryUrl())); // 仓库名 params.put("repo", acqRepo(jobDO.getRepositoryUrl())); return params; } String acqDeployPath(HashMap<String, String> params) { // img0-cdn/ci/android/lhapp/ // http://img0-cdn.oss-cn-hangzhou.aliyuncs.com/ci/android/lhapp/${year}_${month}/${branch}_${buildType}_${month}${day}_${hour}${minute}${second}/ String buildType = params.get("buildType"); String mbranch = params.get("mbranch"); String ossPath = params.get("ossPath"); Calendar c = Calendar.getInstance(); Date date = new Date(); c.setTime(date); String deployPath = ossPath; Integer month = c.get(Calendar.MONTH) + 1; deployPath += c.get(Calendar.YEAR) + "_" + month + "/" + mbranch + "_" + buildType + "_"; java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat("MMdd_HHmmss"); java.util.Date currentTime = date;//得到当前系统时间 String strDate = formatter.format(currentTime); //将日期时间格式化 deployPath += strDate; return deployPath; } /** * 获取项目名称 * * @param repositoryUrl * @return */ private String acqProject(String repositoryUrl) { try { String[] r = repositoryUrl.split(":"); String[] p = r[1].split("/"); return p[0]; } catch (Exception e) { e.printStackTrace(); return ""; } } /** * 获取仓库名称 * * @param repositoryUrl * @return */ private String acqRepo(String repositoryUrl) { try { String[] r = repositoryUrl.split(":"); String[] p = r[1].split("/"); String repo = p[1]; return repo.replace(".git", ""); } catch (Exception e) { e.printStackTrace(); return ""; } } @Override public boolean createFtJob(String fullJobName, int envType) { String jobXml = TplUtils.doCreateJenkinsFtJob(fullJobName, envType); try { jenkinsServer.createJob(fullJobName, jobXml, true); return true; } catch (Exception e) { e.printStackTrace(); return false; } } private String acqFullJobName(String jobName, int envType) { String envName = GitlabWebHooksVO.EnvTypeEnum.getEnvTypeName(envType); String fullJobName = jobName + "." + envName; return fullJobName; } private UserDO acqUser(GitlabWebHooksDO webHooks) { String email = webHooks.getEmail(); if (StringUtils.isEmpty(email)) return new UserDO(); String s[] = email.split("@"); UserDO userDO = userDao.getUserByName(s[0]); return userDO; } /** * 获取job * * @param fullJobName * @return */ private Job getJob(String fullJobName) { Map<String, Job> jobMap = getJobs(); if (jobMap.containsKey(fullJobName)) { // 存在 return jobMap.get(fullJobName); } else { // 不存在 return null; } } /** * 查询所有job * * @return */ public Map<String, Job> getJobs() { Map<String, Job> jobMap = new HashMap<>(); try { jobMap = jenkinsServer.getJobs(); return jobMap; } catch (Exception e) { e.printStackTrace(); } return jobMap; } /** * job build * * @param job * @param params * @return */ public boolean build(Job job, HashMap<String, String> params, UserDO userDO, JenkinsJobDO jenkinsJobDO, long webHookId) { coreLogger.info("Jenkins job={} run build", job.getName()); //for (String key : jobMap.keySet()) { // Job job = jobMap.get(key); try { QueueReference queueReference = job.build(params, true); JobWithDetails jobWithDetails = job.details(); Build build = jobWithDetails.getLastBuild(); BuildWithDetails buildWithDetails = build.details(); boolean isBuilding = buildWithDetails.isBuilding(); // 记录构建任务 if (isBuilding) { JenkinsJobBuildDO jenkinsJobBuildDO = new JenkinsJobBuildDO(jenkinsJobDO, userDO, webHookId, build.getNumber()); jenkinsDao.addJenkinsJobBuild(jenkinsJobBuildDO); } return isBuilding; } catch (Exception e) { e.printStackTrace(); return false; } } private JenkinsJobDO saveJenkinsJob(GitlabWebHooksDO webHooks, String fullJobName, int envType, int buildType) { JenkinsJobDO jenkinsJobDO = jenkinsDao.queryJenkinsJobByName(fullJobName); if (jenkinsJobDO == null) { jenkinsJobDO = new JenkinsJobDO(webHooks, fullJobName, envType, buildType); try { jenkinsDao.addJenkinsJob(jenkinsJobDO); } catch (Exception e) { e.printStackTrace(); } } return jenkinsJobDO; } @Override public TableVO<List<GitlabWebHooksDO>> getWebHooksPage(String projectName, String repositoryName, int webHooksType, int triggerBuild, int page, int length) { long size = gitlabDao.getWebHooksSize(projectName, repositoryName, webHooksType, triggerBuild); List<GitlabWebHooksDO> list = gitlabDao.getWebHooksPage(projectName, repositoryName, webHooksType, triggerBuild, page * length, length); return new TableVO<>(size, list); } @Override public TableVO<List<JenkinsJobVO>> queryJobsPage(String jobName, int jobEnvType, int buildType, int page, int length) { long size = jenkinsDao.getJobsSize(jobName, jobEnvType, buildType); List<JenkinsJobDO> list = jenkinsDao.getJobsPage(jobName, jobEnvType, buildType, page * length, length); List<JenkinsJobVO> voList = new ArrayList<>(); for (JenkinsJobDO jenkinsJobDO : list) { List<JobParamDO> params = jenkinsDao.queryJobParamByJobId(jenkinsJobDO.getId()); JenkinsJobVO jenkinsJobVO = new JenkinsJobVO(jenkinsJobDO, params); voList.add(jenkinsJobVO); } return new TableVO<>(size, voList); } @Override public List<JobParamDO> queryJobParams(long jobId) { return jenkinsDao.queryJobParamByJobId(jobId); } @Override public BusinessWrapper<Boolean> delJobParams(long id) { try { jenkinsDao.delJobParam(id); return new BusinessWrapper<Boolean>(true); } catch (Exception e) { e.printStackTrace(); return new BusinessWrapper<Boolean>(false); } } @Override public JenkinsJobDO saveJob(JenkinsJobDO jenkinsJobDO) { try { if (jenkinsJobDO.getId() == 0) { jenkinsDao.addJenkinsJob(jenkinsJobDO); } else { jenkinsDao.updateJenkinsJob(jenkinsJobDO); } } catch (Exception e) { e.printStackTrace(); } return jenkinsJobDO; } @Override public BusinessWrapper<Boolean> addJobParams(JobParamDO jobParamDO) { try { jenkinsDao.addJobParam(jobParamDO); return new BusinessWrapper<Boolean>(true); } catch (Exception e) { e.printStackTrace(); return new BusinessWrapper<Boolean>(false); } } @Override public BusinessWrapper<Boolean> updateJobParams(JobParamDO jobParamDO) { try { jenkinsDao.updateJobParam(jobParamDO); return new BusinessWrapper<Boolean>(true); } catch (Exception e) { e.printStackTrace(); return new BusinessWrapper<Boolean>(false); } } @Override public BusinessWrapper<Boolean> delJob(long id) { try { jenkinsDao.delJenkinsJob(id); return new BusinessWrapper<Boolean>(true); } catch (Exception e) { e.printStackTrace(); return new BusinessWrapper<Boolean>(false); } } @Override public TableVO<List<JenkinsJobBuildVO>> queryJobBuildsPage(String jobName, int buildNumber, int page, int length) { long size = jenkinsDao.getJobBuildsSize(jobName, buildNumber); List<JenkinsJobBuildDO> list = jenkinsDao.getJobBuildsPage(jobName, buildNumber, page * length, length); List<JenkinsJobBuildVO> voList = new ArrayList<>(); String jenkinsHost = acqJenkinsHost(); for (JenkinsJobBuildDO jobBuildDO : list) { List<JobNoteDO> jobNotesList = jenkinsDao.queryJobNoteByJobNameAndBuildNumber(jobBuildDO.getJobName(), jobBuildDO.getBuildNumber()); List<JobNoteVO> jobNotesVOList = new ArrayList<>(); for (JobNoteDO jobNoteDO : jobNotesList) { JobNoteVO jobNoteVO = new JobNoteVO(jobNoteDO, jenkinsHost, jobBuildDO.getBuildType()); try { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:m:s"); Date createDate = format.parse(jobNoteDO.getGmtCreate()); jobNoteVO.setTimeView(TimeViewUtils.format(createDate)); } catch (Exception e) { } jobNotesVOList.add(jobNoteVO); } GitlabWebHooksDO webHooks = gitlabDao.queryWebHooksById(jobBuildDO.getWebHookId()); JenkinsJobBuildVO jenkinsJobBuildVO = new JenkinsJobBuildVO(jobBuildDO, jobNotesVOList, webHooks); voList.add(jenkinsJobBuildVO); } return new TableVO<>(size, voList); } @Override public void afterPropertiesSet() throws Exception { init(); }}
Jenkins配置
cmdb note接口
cmdb触发job带过来的参数
注意git仓库中的项目名(project),仓库名( reop),分支($mbranch)都是变量,便于cmdb通过job模版创建新任务用
ft_build.sh 是执行npm个性化构建脚本;scp是(daily环境)发布
生成环境部署到oss的配置
#!/bin/bash############# upload to oss ossPath="oss://${deployPath}/build"/data/www/install/ossutil/ossutil64 \cp -r ${WORKSPACE}/build ${ossPath} --config-file \/data/www/install/ossutil/config
config文件
[Credentials]language=CHendpoint=http://oss-cn-hangzhou.aliyuncs.comaccessKeyID=XXXXXXXXXXXXaccessKeySecret=XXXXXXXXXXoutputDir=/data/www/install/ossutil/output[Bucket-Endpoint]
cmdb执行任务中传过来的参数
CMDB相关界面开发
webHooks详情页
任务管理
任务执行详情页
任务日志链接
阅读全文