设为首页 收藏本站
查看: 2064|回复: 0

[经验分享] gitlab勾住rocket chat

[复制链接]

尚未签到

发表于 2018-1-10 18:04:51 | 显示全部楼层 |阅读模式
/* eslint no-console:0, max-len:0 */  
// see https://gitlab.com/help/web_hooks/web_hooks for full json posted by GitLab
  
const MENTION_ALL_ALLOWED = false; // <- check that bot permission allow has mention-all before passing this to true.
  
const NOTIF_COLOR = '#6498CC';
  
const refParser = (ref) => ref.replace(/^refs\/(?:tags|heads)\/(.+)$/, '$1');
  
const displayName = (name) => (name && name.toLowerCase().replace(/\s+/g, '.'));
  
const atName = (user) => (user && user.name ? '@' + displayName(user.name) : '');
  
const makeAttachment = (author, text) => {
  
     return {
  
         author_name: author ? displayName(author.name) : '',
  
         author_icon: author ? author.avatar_url : '',
  
         text,
  
         color: NOTIF_COLOR
  
     };
  
};
  
const pushUniq = (array, val) => ~array.indexOf(val) || array.push(val); // eslint-disable-line
  


  
>  
     process_incoming_request({ request }) {
  
         try {
  
             let result = null;
  
             const channel = request.url.query.channel;
  
             const event = request.headers['x-gitlab-event'];
  
             switch (event) {
  
                 case 'Push Hook':
  
                     result = this.pushEvent(request.content);
  
                     break;
  
                 case 'Merge Request Hook':
  
                     result = this.mergeRequestEvent(request.content);
  
                     break;
  
                 case 'Note Hook':
  
                     result = this.commentEvent(request.content);
  
                     break;
  
                 case 'Issue Hook':
  
                     result = this.issueEvent(request.content);
  
                     break;
  
                 case 'Tag Push Hook':
  
                     result = this.tagEvent(request.content);
  
                     break;
  
                 case 'Pipeline Hook':
  
                     result = this.pipelineEvent(request.content);
  
                     break;
  
                 case 'Build Hook':
  
                     result = this.buildEvent(request.content);
  
                     break;
  
                 default:
  
                     result = this.unknownEvent(request, event);
  
                     break;
  
             }
  
             if (result && result.content && channel) {
  
                 result.content.channel = '#' + channel;
  
             }
  
             return result;
  
         } catch (e) {
  
             console.log('gitlabevent error', e);
  
             return this.createErrorChatMessage(e);
  
         }
  
     }
  

  
     createErrorChatMessage(error) {
  
         return {
  
             content: {
  
                 username: 'Rocket.Cat ErrorHandler',
  
                 text: 'Error occured while parsing an incoming webhook request. Details attached.',
  
                 icon_url: '',
  
                 attachments: [
  
                     {
  
                         text: `Error: '${error}', \n Message: '${error.message}', \n Stack: '${error.stack}'`,
  
                         color: NOTIF_COLOR
  
                     }
  
                 ]
  
             }
  
         };
  
     }
  

  
     unknownEvent(data, event) {
  
         return {
  
             content: {
  
                 username: data.user ? data.user.name : (data.user_name || 'Unknown user'),
  
                 text: `Unknown event '${event}' occured. Data attached.`,
  
                 icon_url: data.user ? data.user.avatar_url : (data.user_avatar || ''),
  
                 attachments: [
  
                     {
  
                         text: `${JSON.stringify(data, null, 4)}`,
  
                         color: NOTIF_COLOR
  
                     }
  
                 ]
  
             }
  
         };
  
     }
  
     issueEvent(data) {
  
         const state = data.object_attributes.state;
  
         const action = data.object_attributes.action;
  
         let user_action = state;
  
         let assigned = '';
  

  
         if (action === 'update') {
  
             user_action = 'updated';
  
         }
  

  
         if (data.assignee) {
  
             assigned = `*Assigned to*: @${data.assignee.username}\n`;
  
         }
  

  
         return {
  
             content: {
  
                 username: 'gitlab/' + data.project.name,
  
                 icon_url: data.project.avatar_url || data.user.avatar_url || '',
  
                 text: (data.assignee && data.assignee.name !== data.user.name) ? atName(data.assignee) : '',
  
                 attachments: [
  
                     makeAttachment(
  
                         data.user, `${user_action} an issue _${data.object_attributes.title}_ on ${data.project.name}.
  
*Description:* ${data.object_attributes.description}.
  
${assigned}
  
See: ${data.object_attributes.url}`
  
                     )
  
                 ]
  
             }
  
         };
  
     }
  

  
     commentEvent(data) {
  
         const comment = data.object_attributes;
  
         const user = data.user;
  
         const at = [];
  
         let text;
  
         if (data.merge_request) {
  
             const mr = data.merge_request;
  
             const lastCommitAuthor = mr.last_commit && mr.last_commit.author;
  
             if (mr.assignee && mr.assignee.name !== user.name) {
  
                 at.push(atName(mr.assignee));
  
             }
  
             if (lastCommitAuthor && lastCommitAuthor.name !== user.name) {
  
                 pushUniq(at, atName(lastCommitAuthor));
  
             }
  
             text = `commented on MR [#${mr.id} ${mr.title}](${comment.url})`;
  
         } else if (data.commit) {
  
             const commit = data.commit;
  
             const message = commit.message.replace(/\n[^\s\S]+/, '...').replace(/\n$/, '');
  
             if (commit.author && commit.author.name !== user.name) {
  
                 at.push(atName(commit.author));
  
             }
  
             text = `commented on commit [${commit.id.slice(0, 8)} ${message}](${comment.url})`;
  
         } else if (data.issue) {
  
             const issue = data.issue;
  
             text = `commented on issue [#${issue.id} ${issue.title}](${comment.url})`;
  
         } else if (data.snippet) {
  
             const snippet = data.snippet;
  
             text = `commented on code snippet [#${snippet.id} ${snippet.title}](${comment.url})`;
  
         }
  
         return {
  
             content: {
  
                 username: 'gitlab/' + data.project.name,
  
                 icon_url: data.project.avatar_url || user.avatar_url || '',
  
                 text: at.join(' '),
  
                 attachments: [
  
                     makeAttachment(user, `${text}\n${comment.note}`)
  
                 ]
  
             }
  
         };
  
     }
  

  
     mergeRequestEvent(data) {
  
         const user = data.user;
  
         const mr = data.object_attributes;
  
         const assignee = mr.assignee;
  
         let at = [];
  

  
         if (mr.action === 'open' && assignee) {
  
             at = '\n' + atName(assignee);
  
         } else if (mr.action === 'merge') {
  
             const lastCommitAuthor = mr.last_commit && mr.last_commit.author;
  
             if (assignee && assignee.name !== user.name) {
  
                 at.push(atName(assignee));
  
             }
  
             if (lastCommitAuthor && lastCommitAuthor.name !== user.name) {
  
                 pushUniq(at, atName(lastCommitAuthor));
  
             }
  
         }
  
         return {
  
             content: {
  
                 username: `gitlab/${mr.target.name}`,
  
                 icon_url: mr.target.avatar_url || mr.source.avatar_url || user.avatar_url || '',
  
                 text: at.join(' '),
  
                 attachments: [
  
                     makeAttachment(user, `${mr.action} MR [#${mr.iid} ${mr.title}](${mr.url})\n${mr.source_branch} into ${mr.target_branch}`)
  
                 ]
  
             }
  
         };
  
     }
  

  
     pushEvent(data) {
  
         const project = data.project;
  
         const user = {
  
             name: data.user_name,
  
             avatar_url: data.user_avatar
  
         };
  
         // branch removal
  
         if (data.checkout_sha === null && !data.commits.length) {
  
             return {
  
                 content: {
  
                     username: `gitlab/${project.name}`,
  
                     icon_url: project.avatar_url || data.user_avatar || '',
  
                     attachments: [
  
                         makeAttachment(user, `从项目 [${project.name}](${project.web_url}) 移除分支 ${refParser(data.ref)} `)
  
                     ]
  
                 }
  
             };
  
         }
  
         // new branch
  
         if (data.before == 0) { // eslint-disable-line
  
             return {
  
                 content: {
  
                     username: `gitlab/${project.name}`,
  
                     icon_url: project.avatar_url || data.user_avatar || '',
  
                     attachments: [
  
                         makeAttachment(user, `推送了新分支 [${refParser(data.ref)}](${project.web_url}/commits/${refParser(data.ref)}) 到 [${project.name}](${project.web_url}), 领先master分支 ${data.total_commits_count} 个提交`)
  
                     ]
  
                 }
  
             };
  
         }
  
         return {
  
             content: {
  
                 username: `gitlab/${project.name}`,
  
                 icon_url: project.avatar_url || data.user_avatar || '',
  
                 attachments: [
  
                     makeAttachment(user, `推送了 ${data.total_commits_count} 个提交到项目 [${project.name}](${project.web_url}) 的 [${refParser(data.ref)}](${project.web_url}/commits/${refParser(data.ref)}) 分支`),
  
                     {
  
                         text: data.commits.map((commit) => `--------------------\n  - ${new Date(commit.timestamp).toLocaleString()} [${commit.id.slice(0, 8)}](${commit.url}) 由 ${commit.author.name} 提交, 内容: \n ${commit.message.replace(/\s*$/, '')} \n\n增加了 ${commit.added.length} 个文件:  ${commit.added.map((addfile)=>`\n[${addfile}](${project.web_url}/raw/${refParser(data.ref)}/${addfile})`)}  \n\n修改了 ${commit.modified.length} 个文件:  ${commit.modified.map((modifiedfile)=>`\n[${modifiedfile}](${project.web_url}/raw/${refParser(data.ref)}/${modifiedfile})`)} \n\n删除了 ${commit.removed.length} 个文件:  ${commit.removed.map((removedfile)=>`\n${removedfile}`)} \n--------------------`).join('\n'),
  
                         color: NOTIF_COLOR
  
                     }
  
                 ]
  
             }
  
         };
  
     }
  

  
     tagEvent(data) {
  
         const tag = refParser(data.ref);
  
         const user = {
  
             name: data.user_name,
  
             avatar_url: data.user_avatar
  
         };
  
         let message;
  
         if (data.checkout_sha === null) {
  
             message = `deleted tag [${tag}](${data.project.web_url}/tags/)`;
  
         } else {
  
             message = `pushed tag [${tag} ${data.checkout_sha.slice(0, 8)}](${data.project.web_url}/tags/${tag})`;
  
         }
  
         return {
  
             content: {
  
                 username: `gitlab/${data.project.name}`,
  
                 icon_url: data.project.avatar_url || data.user_avatar || '',
  
                 text: MENTION_ALL_ALLOWED ? '@all' : '',
  
                 attachments: [
  
                     makeAttachment(user, message)
  
                 ]
  
             }
  
         };
  
     }
  

  
     pipelineEvent(data) {
  
         const commit = data.commit;
  
         const user = {
  
             name: data.user_name,
  
             avatar_url: data.user_avatar
  
         };
  
         const pipeline = data.object_attributes;
  

  
         return {
  
             content: {
  
                 username: `gitlab/${data.project.name}`,
  
                 icon_url: data.project.avatar_url || data.user_avatar || '',
  
                 attachments: [
  
                     makeAttachment(user, `pipeline returned *${pipeline.status}* for commit [${commit.id.slice(0, 8)}](${commit.url}) made by *${commit.author.name}*`)
  
                 ]
  
             }
  
         };
  
     }
  

  
     buildEvent(data) {
  
         const user = {
  
             name: data.user_name,
  
             avatar_url: data.user_avatar
  
         };
  

  
         return {
  
             content: {
  
                 username: `gitlab/${data.repository.name}`,
  
                 icon_url: '',
  
                 attachments: [
  
                     makeAttachment(user, `build named *${data.build_name}* returned *${data.build_status}* for [${data.project_name}](${data.repository.homepage})`)
  
                 ]
  
             }
  
         };
  
     }
  
}
  本人还是比较懒, 是只搞了push event, 其他的有时间再搞吧!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-433646-1-1.html 上篇帖子: gitlab 启用HTTPS 下篇帖子: docker-gitlab(转)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表