CMDB控制Jenkins实现持续集成(js篇)

来源:互联网 发布:手机版淘宝怎么买二手 编辑:程序博客网 时间:2024/04/30 14:41

CMDB控制Jenkins实现持续集成(js篇)

这里写图片描述

过程说明

  1. 研发提交代码至gitlab
    • refs/heads/* [branch] 约定:开发环境自动部署
    • refs/tags/* [tag] 约定:生产环境自动部署
  2. cmdb通过webHooks判断构建任务及相关参数触发jenkins任务
    • 若任务不存在,则通过模版创建任务
  3. jenkins执行任务(agent)
  4. jenkins构建完成(npm),通过ossutil工具将结果上传至aliyun oss;
  5. jenkins执行任务过程中将日志(job event)通知给cmdb
  6. 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详情页

这里写图片描述

任务管理

这里写图片描述

任务执行详情页

这里写图片描述

任务日志链接

这里写图片描述

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 总裁宠上瘾乔陌离颜汐落 老婆听说你暗恋我久陌离 错爱成婚颜汐落乔陌离 老婆听说你暗恋我 久陌离 形同陌路 形同陌路意思 形同陌路什么意思 陌路 陌路相逢 柔情陌路 陌路柔情莫弯弯莫子谦 陌路行作品 陌路柔情全文免费阅读 陌路同途 视同陌路 情到深处是陌路 陌路归途 陌路徒者 陌路天堂 行同陌路 此生陌路不复 婚途陌路叶微舒 陌路莫回倾尽天下 情同陌路 陌路什么意思 陌路by爆琦 红尘陌路 陌路离殇是什么意思 陌路殊途是什么意思 陌路的意思 情途陌路 形同陌路图片 一旦相逢不再陌路 安之若素失之陌路意思 宠你到老 明陌阡尘 越陌度阡枉用相存契阔谈燕 同城陌爱 佰佰聊天 immomo解封网站 陌阳