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

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

这里写图片描述

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
     */
 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值