惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threat Research - Cisco Blogs
S
Securelist
H
Heimdal Security Blog
Scott Helme
Scott Helme
D
Darknet – Hacking Tools, Hacker News & Cyber Security
The Hacker News
The Hacker News
C
CXSECURITY Database RSS Feed - CXSecurity.com
Spread Privacy
Spread Privacy
Cyberwarzone
Cyberwarzone
V
Vulnerabilities – Threatpost
C
Cybersecurity and Infrastructure Security Agency CISA
C
CERT Recently Published Vulnerability Notes
P
Proofpoint News Feed
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
人人都是产品经理
人人都是产品经理
C
Cisco Blogs
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Engineering at Meta
Engineering at Meta
Project Zero
Project Zero
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
有赞技术团队
有赞技术团队
T
Tailwind CSS Blog
Cisco Talos Blog
Cisco Talos Blog
Last Week in AI
Last Week in AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
O
OpenAI News
P
Proofpoint News Feed
Google Online Security Blog
Google Online Security Blog
Recent Announcements
Recent Announcements
Hacker News: Ask HN
Hacker News: Ask HN
美团技术团队
Stack Overflow Blog
Stack Overflow Blog
U
Unit 42
P
Privacy International News Feed
Google DeepMind News
Google DeepMind News
G
GRAHAM CLULEY
Apple Machine Learning Research
Apple Machine Learning Research
TaoSecurity Blog
TaoSecurity Blog
S
Security @ Cisco Blogs
C
Check Point Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Jina AI
Jina AI
S
Secure Thoughts
G
Google Developers Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
L
LINUX DO - 最新话题
T
Tenable Blog
Latest news
Latest news
I
InfoQ

Gitee 官方博客

花几千块报志愿之前,先把这 7 个问题问清楚 Gitee 618 年中盛典开启:企业版新购最高送一年,PocketClaw 首次限时折扣 Gitee 成为首批「供应链安全号」成员单位,携手共建国产工业软件生态 七大赛道 TOP 10 公布!Gitee 年度开源项目评选结果正式揭晓 GLM-Image 上线模力方舟:首个国产芯片训练的多模态图像生成模型 「开源技术」正式纳入国家职教体系,Gitee 已为开源教育落地做好准备 Gitee 软件工厂:以密级管理为底座,构建符合国家保密资质的安全研发体系 Claude Code 的代码安全困境:插件机制齐全,却绕不开模型幻觉 北京中关村学院入驻 Gitee:打造 AI for Science 教学新范式 Gitee 移动软件工厂:突破网络限制的开发新模式 从依赖到可控:开源基础设施的国家命题 模力方舟 MCP Server 上线:在 Cursor 里玩 AI 生图+语音 【国内首家】 Gitee Repo 通过信通院《可信制品管理能力分级要求》先进级(最高级)评估 Gitee Repo 助力关键领域 DevSecOps落地:构建安全可控的制品管理体系 会翻译、懂产品、还能画头像:Gitee 智能三连上线! Gitee Pipe:关键领域 DevSecOps 的核心引擎 时代命题下的民营科技担当:从备份战略看 Gitee 的国家定位 没人喜欢写 README?Gitee:现在你不用写了 关键领域软件工厂的安全中枢:Gitee Scan 全面升级供应链检测能力 Gitee MCP 现已支持远程访问:无需本地部署,AI 助手即插即用 Gitee 企业版效能度量全面升级:构建可衡量、可洞察、可优化的研发体系 高标准+安全可控:关键领域研发为什么选择 Gitee Code? 河南农担 x Gitee:以数字化赋能「三农」信贷服务新范式 Gitee Test:驱动软件工厂DevSecOps 落地,保障关键领域安全稳定 马建仓 AI 助手全流程升级:更聪明的研发搭子,更专业的协作助手 从公益初心到商业化探索,开源中国助推中国开源生态之路 以知识管理赋能 DevSecOps,Gitee Wiki 加速关键领域软件自主演进 Gitee 企业版测试管理全面升级:流程更顺畅,交付更可靠 Gitee 企业版 AI 队友邀测开启:程序员的贴身助理来了 Gitee 构件治理实践:CBB 分布式管理助力软件工厂建设 重塑研发组织形态:从「中心软件工厂」到「移动软件工厂」 Gitee 企业版三大模块升级解读:项目、工作项、测试体系全面进化! Gitee 软件工厂的构件之道:CBB 与内源库(代码库\制品库)的本质差异 Gitee 软件工厂新范式:高安全、强协同、快交付,一体化研发全打通 当关键软件也被卡,我们的答案在哪里 Gitee 获北京市“科学技术进步奖”一等奖 加速项目管理效率,Gitee PPM 驱动软件工厂的智能化转型 打造智能化软件工厂:Gitee Insight 的 DevSecOps 度量实践 Gitee MCP 上线 Trae,AI 助手从代码生成走向仓库联动 开源中国荣获专精特新“小巨人”:做关键行业的可信研发底座 用智能体重塑 DevOps:Gitee 如何打造全域研发引擎 Gitee Repo 联邦仓库能力展示及最佳实践 Gitee AI 队友公测启动!自主申请,从审代码到漏洞检测全都自动搞定 Gitee 企业版更新:工作项、安全管理与测试用例能力升级 GOTC 2025 回顾|打通数据到生产,AI 应用工程化加速落地 Gitee Team 如何支撑关键领域行业 DevSecOps 落地? 软件工厂驱动 DevSecOps:高效集成发布的演进实践 Gitee 正式发布企业版 MCP Server:让 AI 深度融入企业研发管理 马建仓 AI 助手再进化:懂场景,也懂老板,但更懂你 一次提交更新两个仓库,Get 更优雅的 GitHub/Gitee 仓库镜像同步 当开源的门缝变窄,真正需要我们警觉的是什么? Gitee构建智能研发闭环:从数据飞轮到多智能体协同 一套平台管理上千构件:Gitee DevSecOps 如何用 CBB 重塑军工研发范式? DeepSeek 与开源:肥沃土壤孕育 AI 硕果 开源中国入选「2025年度中国软件高质量发展百强企业」 Gitee Go Release 插件上线:自动发版、上传构建产物一步到位 【重磅升级】制品库安全知识库自动更新与分析,制品安全防护「快人一步」 Gitee AI 队友新升级:PR 审查更智能,安全治理更灵活,个人用户也能用! Gitee 产品更新:Web 端提交、工作项与知识库体验提升 开源中国参加2025敏捷生态大会:智能化软件工厂构筑工业研发新范式 Gitee x AGIROS:与中科院软件所共建国产具身智能基础设施 开源中国董事长马越出席香港开源论坛:开源基础设施服务香港智能转型 沐曦股份选择 Gitee 企业版,打造国产 GPU 开源生态阵地 国产IronBank——源盾可信中心仓 Gitee CodePecker 支撑 DevSecOps 落地,双擎驱动全链路研发安全 开源中国入选「2025年度中国信创软件高质量发展百强企业」 破解安全研发三大难题:Gitee 软件工厂助力高标准合规落地 Jira 停售一年后,国产研发管理平台谁能真正站出来? 从断网交付到敏捷协同:Gitee 移动软件工厂的增量落地全路径 Gitee 企业版更新:优化测试管理流程,闭环能力再提升 Gitee DevOps 全面支持信创,驱动企业数字化安全与效能跃升 武汉人工智能研究院 x Gitee:跨模态智能研发的革新之路 Gitee DevSecOps:打造智能化军工软件工厂,破解版本管理难题 智能化 Issue 管理:基于 Coze + Gitee API 的自动化实践 Gitee 发布官方 MCP Server :让 AI 助手直连你的代码仓库 Gitee MCP Server:让 AI 助手接管繁琐事务,助力 Gitee 专业版研发提效 开源中国完成数亿元 C 轮融资:Gitee 加速智能化研发效能革新 启航 AI 新航道!Gitee 双十一与你共享智能新未来 《中国DevOps现状调查报告(2023)》发布,Gitee 领跑国产平台 研运一体化之下,Gitee 如何精准赋能银行实施大规模敏捷 对数字「祛魅」,中大型规模企业如何进行有效的研发效能度量? 从混乱到卓越,Gitee Code 如何治好 IT 部门的精神内耗 科技赋能,Gitee 助力国家海关总署实现重大业务改革 科大讯飞选择Gitee旗舰版,完成研发协作平台国产化替代 用脑图做测试用例,高效到家了! 信创驶入快车道,中国赛宝实验室选择 Gitee 搭建高效研发协作平台 金融人怎么写出安全可靠的代码?知名证券企业这样做 16家单位、2万名研发,金融科技领头羊如何集中统一代码管理? 《Gitee 专业版白皮书》重磅发布,助力企业实现高效、快捷交付 Gitee x 未来物联:高效能产研团队是怎样炼成的? 点击查看2022年你与Gitee的记忆 我们让 ChatGPT 写了一篇开源项目推荐 Gitee 自动化全新上线,让提效融入每处细节 Gitee Scan 四大升级,助力企业完美实现质量左移 Gitee携手内燃机龙头企业,为数字化研发注入新势能 【永久有效】初创企业限时特惠,999 即可购买 Gitee 标准版 Gitee与浪潮集团达成合作 加速国内DevOps生态建设 Gitee助力宁波银行DevOps三级认证,加速数字化转型 海通证券携手Gitee,以科技赋能金融行业研发转型 产品研发交给外包,怎么管理才能做到心里有底?
基于 Gitee + Jenkins 的开源项目自动化协作实战
Gitee · 2020-12-15 · via Gitee 官方博客

摘要:在开源理念日渐活跃的今天,越来越多的人开始投身于开源,贡献了越来越多的开源项目。而随着时间的推移,更多的人开始为开源项目添砖加瓦,为某一领域的开源项目贡献出自己的力量。贡献者的增多又给开源作者带来不少审核的压力,实际上投身开源的这些开源作者基本都是业余时间来做,并没有太多的时间投入在开源项目上。本文就为了解决这类场景,介绍下如何在 Gitee 上通过 Jenkins 来为自己的开源项目开启自动化协作,旨在将一些开源相关的工作自动化,留出更多的时间投身开源事业。

基于 Gitee + Jenkins 的开源项目自动化协作实战-Gitee 官方博客

Gitee & Jenkins 简介

Gitee 是开源中国(OSChina.net)于 2013 年推出的基于 Git 的代码托管和协作开发平台,提供代码托管服务,与开源中国社区资讯、博客、社区等版块相互补充和促进,希望以此更好地为开发者服务、构建更加完善的开源生态。经过超过七年的砥砺发展,已成为国内最大的代码托管平台。

Jenkins 是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件,支持各种运行方式,可通过系统包、Docker 或者通过一个独立的 Java 程序运行。

开源项目协作流程

协作方式

为开源项目贡献代码一般都是使用 Pull Request(Merge Request)方式,这种方式一般要求用户先将开源仓库 Fork 到自己名下,然后基于自己名下的仓库进行修改提交,最终以 Pull Request 的形式提交到开源项目主仓库,意思就是我请求合并我的这些代码到你的主仓库,来为这个开源项目修复/贡献一些代码,具体的使用可以参见 Gitee 官方文档:https://gitee.com/help/articles/4128

除了常规的 Pull Request 方式,Gitee 还推出了轻量级 Pull Request(简称轻量级PR),这种方式可以摒除繁琐的 Fork 流程,快速的向开源项目提交一个 Pull Request。比如我在阅读 Readme 的时候发现有表述或者拼写错误,这时就可以直接修改 Readme 文件,提交的时候就会自动生成一个轻量级PR,这种操作类似于知识共享平台的纠错功能。详细介绍可以参见:https://gitee.com/help/articles/4291

相比于常规的 Pull Request,Gitee 轻量级PR更加便捷。

基于 Gitee + Jenkins 的开源项目自动化协作实战-Gitee 官方博客

痛点

开源项目作者在接收到用户提交第一个的 Pull Request 的时候,心情想必是非常激动的,毕竟这是对自己项目的一种认可。而且根据我个人的观察,一般情况下开源项目的 Star 数量超过100的时候,才有可能收获自己的第一个 Pull Request。

在 Pull Request 数量少的时候,人工完全能够处理的过来,那么,如果是一个非常火爆的开源项目呢?答案是会有非常非常多的热心用户帮忙提交和贡献代码,而且这些 Pull Request 很有可能造成挤压的情况。随着项目的发展,合规性也要逐渐提上日程,对代码提交的规范,甚至 Commit Message 的提交也有可能需要规范化。

目前开源协作中主要的痛点有如下几个:

  1. 提交信息不规范,比如中英文混用,重复的提交信息等
  2. 提交的代码需要人工检测是否能够通过构建
  3. 对于特定的文件需要进行规范的格式化检查
  4. 代码质量检查需要反复沟通跟进
  5. 贡献者没有详细阅读贡献者协议或者规范

如何解决

目前可以通过 Gitee + Jenkins 配置 Pull Request Flow,实现智能自动化预处理一些场景,减少人力的维护。Gitee 提供了 Gitee Jenkins Plugin 插件,可以与 Jenkins 联动,实现对每一个 Pull Request 进行一些自动化的检查,实现流程图:

基于 Gitee + Jenkins 的开源项目自动化协作实战-Gitee 官方博客

下面以一个小工具 GiteeAutoUpdate(地址:https://gitee.com/kesin/GiteeAutoUpdate,以下简称 GAU)为例,展开介绍下具体实现的方式

Note: 以下的示例代码以及配置均为 Demo 为目的,并未做任何异常及错误处理,如果需要投产使用,请做好异常及错误处理,避免出现预期外的情况 🙂

实现效果图:

基于 Gitee + Jenkins 的开源项目自动化协作实战-Gitee 官方博客

自动化配置实战

GAU 是一个推送到 Gitee 自动更新到其它平台的 Webhook 服务端,通过简单的配置,可以实现推送到 Gitee 的提交自动推送到其他平台的目的。为了能够自动化的对用户提交的 Pull Request 进行一些前置检查,假设我们需要做以下的一些事情:

  1. 配置 Pull Request 的与 Jenkins 联动,当有 Pull Request 提交或者更新的时候,触发 Jenkins 进行前置检查
  2. 提交 Pull Request 之后,自动提示用户阅读贡献者协议,然后评论Rebuild即可进行下一步的检查(你也可以说评论了Rebuild即视为同意贡献者协议)
  3. 检查 Commit Message 是否有重复的情况(我们要求每一个 Commit Message 都有具体的意义)
  4. 验证构建是否成功
  5. 检查配置文件格式是否正确(对于一些关键的信息,需要做针对性的检查)
  6. 集成 Sonar 质量检测工具,对代码进行检测

Jenkins 的配置

Gitee 提供了 Gitee Jenkins Plugin 插件,可以在 Jenkins 的插件市场搜索进行安装,安装完成后,我们新建一个 Free Style 的工程,命名为 GAU

基于 Gitee + Jenkins 的开源项目自动化协作实战-Gitee 官方博客

在 Source Code Management 配置 Git 源,作如下配置:

基于 Gitee + Jenkins 的开源项目自动化协作实战-Gitee 官方博客

在 Build Triggers 内,选择作如下配置:

基于 Gitee + Jenkins 的开源项目自动化协作实战-Gitee 官方博客

并将 Gitee WebHook URL 添加到对应仓库的 WebHook 中

基于 Gitee + Jenkins 的开源项目自动化协作实战-Gitee 官方博客

其中 Webhook Token 即在 Jenkins 的 Secret Token for Gitee WebHook 生成的,这里需要注意的是,如果你的 Jenkins 暴露在公网,你可能将 Jenkins 设置了需要权限才可以访问,那么 Gitee 将无法请求你的这个 WebHook,你需要使用插件Role-Based Strategy 来配置匿名用户对 Build 的权限。不过不用担心,你可以结合刚刚生成的 Token 来保证安全触发。

基于 Gitee + Jenkins 的开源项目自动化协作实战-Gitee 官方博客

接着配置一个构建阶段 Build,我们选择 Execute shell,并先填写一个简单的Hello World

基于 Gitee + Jenkins 的开源项目自动化协作实战-Gitee 官方博客

最后,在 Post-build Actions 配置一下失败后的回传信息,这里我们只需要配置失败后的动作即可,因为其他的情况我们将会通过脚本自行回传。

基于 Gitee + Jenkins 的开源项目自动化协作实战-Gitee 官方博客

提交一个 Pull Request,将会自动触发构建并提示Triggered ​by ​ZokerBot ​Gitee ​Pull ​Request ​#1: ​kesin/GiteeAutoUpdate ​=> ​master,并且任务执行也会打出刚刚我们写的那句Hello World

具体的配置见插件说明:https://gitee.com/oschina/Gitee-Jenkins-Plugin#%E6%8F%92%E4%BB%B6%E9%85%8D%E7%BD%AE

配置 Pull Request 提交后的自动提示信息

有时候,我们需要在用户提交 Pull Request 后,自动添加一句提示或者要求提交者进行一些其他的操作,这里我们假设需要用户阅读贡献者须知:

### 贡献代码

1. 提交信息请不要重复,保证每一个提交信息均有意义
2. 提交的代码请添加注释
3. 代码合并后,所有权将遵循项目本身的 LICENSE

### 请求添加同步

1. 请确保已经在对应平台将授权用户加到对应项目
2. 请确保已经添加 Webhook 到你的仓库
3. 请确保`syncWhitelist`内容符合格式

为了确保评论信息整洁,我们将内容添加到 Issue 中:https://gitee.com/kesin/GiteeAutoUpdate/issues/I28BNK

那么,我们需要的欢迎信息应该是这个样子的:

基于 Gitee + Jenkins 的开源项目自动化协作实战-Gitee 官方博客

为了快速实现,我们下面使用 Go 写一个脚本giteeCheck来实现这个功能:

func welcomeMsg(PRIID string) {
    params := make(map[string]interface{})
    params["access_token"] = TOKEN

    if noteNotExist(PRIID) {
        // create first welcome note
        params["body"] = fmt.Sprintf(`欢迎提交 PR,您需要进行如下两步:
                         1. [点击此处阅读贡献者协议及注意事项](https://gitee.com/%s/%s/issues/%s)
                         2. 在本 PR 评论「Rebuild」继续执行构建集成测试状态,表示您阅读并同意了「贡献者协议」
                         `, OWNER, REPO, ISSUE)
        commentUrl := fmt.Sprintf("https://gitee.com/api/v5/repos/%s/%s/pulls/%s/comments", OWNER, REPO, PRIID)
        postForm(commentUrl, params)
        fmt.Printf("0")
        return
    }
    fmt.Printf("1")
}

只需要传入当前的 PRIID 即可,为了识别是否是第一次提交,我们判定是否有过评论即可,所以在 Jenkins 的构建过程我们可以添加这么一句命令

# add welcome msg when PR created
status=`/home/zoker/app/jenkins/scripts/giteeCheck welcome ${giteePullRequestIid}`

其中,${giteePullRequestIid} 为 Gitee Jenkins Plugin 所传入的环境变量,可以在 SHELL 中直接调用,将返回值保存到status是为了判定是首次欢迎信息,还是之后的构建。

检查 Commit Message 提交信息是否重复

提交信息是否重复可以根据源分支与目标分支的差异提交来判定,Git 提供了一种方式,可以快速的拿到两个版本之间的差异的提交信息

git log HEAD ^remotes/origin/master --pretty=format:'%B'

通过去重前后的数量对比,即可得出是否有重复的提交信息,这个过程的命令如下:

# check commit msg
  commitCountA=`git log HEAD ^remotes/origin/master --pretty=format:'%B'| sort -r |grep -v '^$'|wc -l`
  commitCountB=`git log HEAD ^remotes/origin/master --pretty=format:'%B'| sort -r |grep -v '^$'|uniq|wc -l`
  if [ $commitCountA == $commitCountB ]; then
      commitMsg="valid"
  else
      commitMsg="invalid"
  fi

执行完后,我们将结果保存在commitMsg变量,用以后续的信息回传。

验证构建是否成功

这一步检测就比较简单了,只需要执行对应的构建命令,然后判定构建物是否存在即可

  # build and check validation
  go build main.go
  if [ -x gau ]; then
      buildStatus="valid"
  else
      buildStatus="invalid"
  fi

同样,我们将结果保存在BuildStatus,用以后续的信息回传。

检查配置文件syncWhitelist格式是否正确

这里检查syncWhitelist是为了避免程序启动的时候无法读取到正确的仓库白名单信息而启动失败,类似的行为也可以是团队自研的检查工具或者商业检查工具,用户检查代码格式、注释、是否存在意外上传的 Token 等,这里以检查文件的 Json 格式行为替代。同样的我们写了一个脚本用来解码,保证解码能够正常进行:

func checkFile(file string) {
    projects := make(map[string][]string)
    jsonFile, err := os.Open(file)
    if err != nil {
        fmt.Printf("invalid")
        return
    }
    defer jsonFile.Close()

    jsonParser := json.NewDecoder(jsonFile)
    if err := jsonParser.Decode(&projects); err != nil {
        fmt.Printf("invalid")
        return
    }
    fmt.Printf("valid")
}

配置到构建命令中:

# check syncWhitefile validation
  syncFormat=`/home/zoker/app/jenkins/scripts/giteeCheck checkfile config/syncWhitelist`

集成 Sonar 代码质量检测

Sonar (SonarQube)是一个开源平台,用于管理源代码的质量。Sonar 不只是一个质量数据报告工具,更是代码质量管理平台。它的安装和使用都非常简单,只要支持 Java 11 环境即可,这里不在赘述 Sonar 的安装和使用,具体可以参见官方文档:https://docs.sonarqube.org/latest/

我们所需要知道的就是,Sonar 由 SonarWeb 以及 SonarRunner 两部分组成,SonarWeb 用以收集数据及展示,SonarRunner 用于分析仓库代码生成质量数据,只要在对应的仓库下执行一条命令,就可以得到分析报告,我们可以根据这个报告重的数据,来做一些门禁,比如多于5个警告或者有1个严重则直接拒绝掉 PullRequest,让提交者完善后再行提交,可以在一定程度上解放人力。

为了快速实现,我们接下来仅仅关注warningCount,只要warningCount大于零,就提示用户可能有风险,在执行完分支命令后,我们可以从结果中拿到一个 API 地址,这个地址包含了本次分析的一些基本数据:

INFO: Analysis report generated in 50ms, dir size=134 KB
INFO: Analysis report compressed in 15ms, zip size=31 KB
INFO: Analysis report uploaded in 15ms
INFO: ANALYSIS SUCCESSFUL, you can browse http://127.0.0.1:8089/dashboard?id=taskover
INFO: Note that you will be able to access the updated dashboard once the server has processed the submitted analysis report
INFO: More about the report processing at http://127.0.0.1:8089/api/ce/task?id=AXYoHjxxxxxxxxDlfF
INFO: Analysis total time: 2.788 s
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS

我们要的就是拿到http://127.0.0.1:8089/api/ce/task?id=AXYoHjxxxxxxxxDlfF这个地址,然后传给我们的脚本进行进一步的处理:

  # Sonar check
  /home/zoker/app/sonar/scanner/bin/sonar-scanner -Dsonar.projectKey=GAU -Dsonar.sources=. -Dsonar.host.url=http://127.0.0.1:8089 -Dsonar.login=410e439472a0626bde66aa7564fc3faa9430f7c6 > sonarRes
  sonarResUrl=`cat sonarRes | grep api/ce | cut -d' ' -f8`
  sleep 3 // 防止 SonarWeb 正在处理中就请求导致的 404

至此,几个检测项目均配置完成,并且我们所需要的status syncFormat commitMsg buildStatus sonarResUrl等均已保存在变量中,接下来,我们就要把这些数据回传到 PullRequest 的评论。

构建过结果回传

结果回传无非就是把刚刚得到的一系列的结果,处理后以固定的格式通过 PullRequest 的评论 API 返回给对应的 PullRequest,我们通过脚本对这些数据进行处理,并且根据具体情况返回具体信息:

func resultBack(args []string) {
    var a, b, c, d = "success", "success", "success", "success"
    status := make(map[string]string)
    status["valid"] = ":white_check_mark:"
    status["invalid"] = ":x:"

    // sonar warningCount
    sonarRes, _ := http.Get(args[3])
    sonarResBody, _ := ioutil.ReadAll(sonarRes.Body)

    var sonarJson map[string]map[string]interface{}
    var sonarStatus string
    json.Unmarshal(sonarResBody, &sonarJson)
    if sonarJson["task"]["warningCount"].(float64) == 0 {
        sonarStatus = ":white_check_mark:"
        d = "No Warings"
    } else {
        sonarStatus = ":x:"
        d = fmt.Sprintf("Warings: %f", sonarJson["task"]["warningCount"].(float64))
    }

    // others
    if args[4] == "invalid" {
        a = "请本地构建成功后再行提交"
    }

    if args[5] == "invalid" {
        b = "有重复的提交"
    }

    if args[6] == "invalid" {
        c = "syncWhitelist 格式有误,请确认"
    }

    var botMsg string
    if a == "success" && b == "success" && c == "success" {
        botMsg = "所有检查通过,请 @Zoker 处理"
    } else {
        botMsg = "检测到有 **未通过项** ,请检查调整后重新提交,将会自动重新触发检查。"
    }

    params := make(map[string]interface{})
    params["access_token"] = TOKEN
    params["body"] = fmt.Sprintf(`自动化检测已完成,请根据结果进行调整:

| 步骤   |  结果  | 备注 |
|-------------|---|-----------------|
|      构建 |  %s  |     %s         |
|      提交信息检查    |  %s  |       %s       |
|      syncWhitelist 格式检查       |  %s |   %s      |
|      Sonar 质量检测       | %s  |         %s       |

%s
`, status[args[4]], a, status[args[5]], b, status[args[6]], c, sonarStatus, d, botMsg)

    commentUrl := fmt.Sprintf("https://gitee.com/api/v5/repos/%s/%s/pulls/%s/comments", OWNER, REPO, args[2])
    postForm(commentUrl, params)

}

最终,我们的构建脚本看起来就是这样的:

# add welcome msg when PR created
status=`/home/zoker/app/jenkins/scripts/giteeCheck welcome ${giteePullRequestIid}`

if [ $status == "1" ]; then
  # check syncWhitefile validation
  syncFormat=`/home/zoker/app/jenkins/scripts/giteeCheck checkfile config/syncWhitelist`

  # check commit msg
  commitCountA=`git log HEAD ^remotes/origin/master --pretty=format:'%B'| sort -r |grep -v '^$'|wc -l`
  commitCountB=`git log HEAD ^remotes/origin/master --pretty=format:'%B'| sort -r |grep -v '^$'|uniq|wc -l`
  if [ $commitCountA == $commitCountB ]; then
      commitMsg="valid"
  else
      commitMsg="invalid"
  fi

  # build and check format
  go build

  if [ -x gau ]; then
      buildStatus="valid"
  else
      buildStatus="invalid"
  fi

  # Sonar check
  /home/zoker/app/sonar/scanner/bin/sonar-scanner -Dsonar.projectKey=GAU -Dsonar.sources=. -Dsonar.host.url=http://127.0.0.1:8089 -Dsonar.login=410exxxxxxxxxxxxxxxxxxx3faa9430f7c6 > sonarRes
  sonarResUrl=`cat sonarRes | grep api/ce | cut -d' ' -f8`
  sleep 3

  # callback result
  /home/zoker/app/jenkins/scripts/giteeCheck result ${giteePullRequestIid} ${sonarResUrl} $buildStatus $commitMsg $syncFormat
fi

验证效果

我们来贡献代码为 GAU 修复一个强制推送的问题,我们新建一个fix-force-push分支,在这个分支上修改代码:

基于 Gitee + Jenkins 的开源项目自动化协作实战-Gitee 官方博客

完善提交信息update utils.go fixed force push bug并提交到分支,接着我们创建一个 PullRequest

基于 Gitee + Jenkins 的开源项目自动化协作实战-Gitee 官方博客

进到 Jenkins 我们可以看到已经触发了构建:

基于 Gitee + Jenkins 的开源项目自动化协作实战-Gitee 官方博客

而且如我们所期望的,有了欢迎信息

基于 Gitee + Jenkins 的开源项目自动化协作实战-Gitee 官方博客

我们评论Rebuild接受贡献者协议并开始检查,等待片刻即可看到结果:

基于 Gitee + Jenkins 的开源项目自动化协作实战-Gitee 官方博客

可以看到,构建失败了,原因是因为 Jenkins 构建机器没有配置代理,下载依赖包超时了,处理完后,我们重新执行 Rebuild

基于 Gitee + Jenkins 的开源项目自动化协作实战-Gitee 官方博客

可以看到,由于代码量比较少,所以 Sonar 也没什么质量问题产生。这里需要说明的是,一般情况下更新代码会自动触发构建,不需要我们手动评论Rebuild

以上就是整个自动化检查的实现过程,示例中 giteeCheck 的代码见:https://gitee.com/kesin/gitee-check

总结

在配置了开源项目的自动化协作之后,我们就可以省下很多沟通的时间,同样的,提交者也会快速的得到反馈,避免由于开源作者由于时间问题而响应不及时导致的贡献者的积极性下降。

当然本文中提供的例子还有很多改进的地方:

  1. 每一个步骤都可以给 Pull Request 打上对应的标签,如WaitForCheckPreTestFailed
  2. 构建失败、检查失败、Sonar 分析结果等也可以添加到备注中
  3. 可以根据用户提交的差异文件列表来决定执行哪些步骤
  4. 根据 Pull Request 的作者及评论者进行鉴权,只有作者有权限触发 Rebuild
  5. ...

由于时间问题,不再过多讨论,大家可以为自己的开源项目构建一套合适的自动化、智能化的协作流程,甚至可以通过这种方式来对 Issue 进行智能化的自动回复,可以发挥想象力,一切皆有可能。

原文作者:Zoker

原文链接:https://my.oschina.net/zoker/blog/4777200