首页 文章 精选 留言 我的

精选列表

搜索[智能扫码],共10000篇文章
优秀的个人博客,低调大师

当“代码农”遇上“码农”:揭秘主干开发的那些事儿 | 京东云技术团队

前段时期我负责部门内部主干开发落地相关事宜,这个过程中,也真真切切的体会到了多人开发过程中,面对特性分支管理中,大家遇到的一些困扰,尤其面对敏捷迭代的开发方式,合并冲突,集成测试,代码重用等方面,都与高效两个字背离。当然,我在推进主干开发过程中,也遇到了一些问题和坎坷,在这里,集中的做一次分享。 1. 概述 主干开发,是指开发人员直接向主干(习惯上主干分支通常为:trunk 或 master)提交 / 推送代码。通常,开发团队的成员 1 天至少 1 次地将代码提交到主干分支。在到达发布条件时,从主干拉出发布分支(通常为 release),用于发布。若发现缺陷,直接在主干上修复,并根据需要 cherry pick 到对应版本的发布分支。 优点: 分支模型简单高效,开发人员易于掌握不容易出现错误操作 避免了分支合并、冲突解决的困扰 随时拥有可发布的版本 有利于持续集成和持续交付 缺点: 基础架构要求高:合入到主干的代码若质量不过关将直接阻塞整个团队的开发工作,因此需要高效的持续集成平台进行把关; 自动化测试要求高:需有完备单元测试代码,确保在代码合入主干前能在获得快速和可靠的质量反馈; 最好有代码评审:若代码质量要求高,需要配套代码评审(CR)机制,在代码提交到主干时,触发 CR,通过 Peer Review 后才能正式合入; 最好有特性开关:主干开发频发合入主干的情况下,特性拆分得很小,可能是半成品特性,需要配套特性开关(Feature Toggle),只有当特性整体开发完才通过灰度发布等手段逐步打开; 适用环境: 对迭代速度要求高,希望需求快速交付上线 基础架构强,持续集成工具高效; 团队成员习惯 TDD(测试驱动开发),代码自动化测试覆盖率高(至少增量代码的自动化测试覆盖率高); 2. 整体架构 2.1 衡量主干开发的效果 可以通过执行以下操作来衡量主干开发的效果。 测试的因素 衡量的指标 目标 应用代码库中的活跃分支数。 衡量应用代码库版本控制系统中的活跃分支数,让所有团队都能看到此数字。然后跟踪目标状态的增量式进度。 不超过三个活跃分支。 代码冻结期。 衡量团队的代码冻结数及冻结时长。这些衡量指标还可以对合并冲突、代码冻结、稳定等方面所耗费的时间进行分类。 无人提交代码时,没有代码会被冻结。 将分支合并到主干的频率。 衡量合并的每个分支的二进制(是/否)值,或者衡量每天合并的分支的百分比。 每天至少合并一次。 查看审批代码更改所需的时间。 如果您异步执行代码审核,请衡量审批更改请求所需的平均时间,并特别关注所需时间大大超过平均值的请求。 设法使代码审核成为在开发过程中执行的同步活动。 2.2 常见误区 如需全面采用主干开发,需要避免以下常见障碍: 繁琐的代码审核流程。许多组织的代码审核流程都较为繁琐,需要多次审批才能将更改合并到主干中。如果代码审核很费力并且需要数小时或数天才能完成,开发者会避免小批量工作,改为进行大批量更改。因为大批量代码审核十分复杂,因此审核人员的审核时间会延长,进而造成恶性循环。 这样的结果是开发者避免使用合并请求,从而导致合并请求经常受到冷落。由于很难通过检查来推导大规模更改对系统的影响,因此审核人员很可能会忽略缺陷,主干开发的优势也就减弱了。 异步执行代码审核。如果您的团队实行结对编程,那么该代码已由第二个人审核。如果需要进一步审核,则应该同步执行:开发者准备提交代码时,应立即让团队中的其他人员审核代码。开发者不应该要求进行异步审核,例如向工具提交请求,然后在等待审核时启动新任务。合并延迟时间越长,就越有可能发生合并冲突和相关问题。如果执行同步审核,需要团队同意优先审核彼此的代码而不是处理其他工作。 在提交代码之前未运行单元测试或者自动化测试。为了确保主干保持工作状态,在提交前对代码更改运行测试非常重要。此操作可以在开发者工作站完成,许多工具也提供针对本地更改远程运行测试,然后在通过测试后自动提交更改的功能。如果开发者知道自己无需大量繁杂流程即可将代码提交到主干,那么就会小批量更改代码,这些更改易于理解、审核、测试,并且可以更快地迁移到生产环境。 2.3 改进主干开发的Tip 小批量开发。主干开发最重要的推动因素之一就是团队学习如何小批量开发。这需要为开发团队提供培训和组织支持。 执行同步代码审核。如前所述,转换为同步代码审核或至少确保开发者优先进行代码审核,有助于确保所做的更改不必等待数小时甚至数天即可合并到主干中。 执行全面的单元测试和自动化测试。确保您拥有全面而实用的自动化单元测试套件,并在每次提交之前运行这些测试工具。 快速构建。构建和测试过程应在几分钟内执行。目标是将测试环境的jdos部署串联到整个CI的自动化流水线之中 2.4 主干开发流程说明 如图所示,研发小伙伴基于master分支开发,当每次merge时,都会触发流水线验证过程。在流水线验证中: 1.EOS代码扫描,该扫描会扫描代码中不规范的情况,按照代码规约不同,会有不同的级别,包括 WARNING, MAJOR, CRITICAL, BLOCKER四种级别,基于不同级别可以设置拦截规则,如果代码不符合设定的拦截规则,将不予merge。 2.代码评审会触发代码评审邀请,可以根据设定,邀请组内研发,leader,或者测试人员参与代码评审,通过设定规则,如果代码评审通过,才允许merge。 3.现在自动进行maven打包和单元测试工作,如果单元测试不通过,将不予merge。 4.流水线会自动将单元测试通过的jar包发布到测试的JOS分组进行部署,部署完成后自动调取线上自动化测试流程,只有所有接口通过自动化测试,才允许merge。 3. 落地方案 3.1 单元测试 应用架构: 基于spring boot junit 编写单元测试。 我们可以将测试按照模块划分,放在不同的目录之下,可以分为集成测试和单元测试。这样做的原因是,当我们的项目边的越来越大的时候,写的测试会越来越多,当所有测试都放在一个目录下的时候,跑一次集成测试时间会很长。具体目录如下: 主开发目录 测试开发目录 测试模块 描述 测试父类命名 src/ test/ init 初始化测试模块 InitTestBase unit service单元测试模块 UnitTestBase jpa 持久化层测试模块 JPATestBase mvc controller层测试 MvcTestBase 所有测试模块集成对应的父类,然后类名必须以对应模块+Test结尾,例如:ShipperStatisticUnitTest 引入单元测试依赖 spring-boot-starter-test <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> 2. 引入 surefile 插件 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.2</version> <configuration> <skip>false</skip> <includes> <include>**/unit/*Test.java</include> </includes> </configuration> </plugin> 3. 配置测试配置文件路径 <resources> <testResources> <testResource> <directory>src/test/resources</directory> <!--①--> <excludes> <exclude>application*.properties</exclude> </excludes> </testResource> <testResource> <directory>src/test/resources</directory> <filtering>true</filtering> <includes> <include>application.properties</include> <include>important.properties</include> <include>application-${activatedProperties}.properties</include> </includes> </testResource> </testResources> 3.2 JaCoCo代码覆盖率扫描 该处可以先串联到流水线中,但不做门禁设置,等后期确定标准后,再打开门禁设置。 3.3 EOS静态代码扫描 在主干开发模式中,因为EOS静态代码扫描,配置代码合并门禁,确保代码编码规范。配置如下图所示例子: 3.4 代码线上评审 代码评审通过Coding内置的评审规则实现,规则设定如下: 1.评审分支为master分支,并在push时创建代码评审,并阻塞代码直接合入目标分支。 2.评审人需要达到两人及以上通过后,才能触发随后的操作。 3.不允许自评。 4.不允许特定成员跳过自动化检查。 3.5 特性开关 遇到此情况,一般是多版本同时开发的情况 此处跟业务强相关,需要具体问题具体分析。不过保证如下几个原则: 代码开发尽量保证高内聚低耦合,保证类的封闭性,同时可以用常用设计模式,保证功能的业务代码解耦,有利于特性区分。 个别情况,可以引入ducc配置中心,实现特性开关。 3.6 流水线配置 在行云流水线中,主要包括如下几个节点: 其中有一个配置上有一个小坑就是下载代码。为什么这么说呢? 因为我们流水线的触发条件是跟coding上的代码评审配合使用,当主干分支发生merge请求时,这个时候会触发流水线,但拉取的代码并不能直接填写主干分支名称(如:master), 原因是当前的commit快照并没有合并到master上,而是处于等待状态,只有当流水线通过后才会真正合并到主干分支,这是如果下载代码里拉取的主干分支就是不包含当前提交内容的快照,并不能满足我们的诉求。 那么,我们该如何配置呢? 好在Webhook中会带一些系统内置全局参数,其中globalParams.user.WEBHOOK_ATTR_COMMIT_ID,代表的就是当前提交请求所包含的 commit快照,所以,我们只需要配置这个全局参数即可,如图所示: 配合如上配置,我们在触发设置中,只需要设置MR created/Updated事件即可。如下图所示: 4. 总结 于许多开发者而言,主干开发是一项重大变革,您很可能会遇到一些阻碍。许多开发者根本无法想像如何采用这种方式工作。一项好的做法是找到曾采用这种方式工作的开发者,让他们指导其他开发者。让一些团队转为采用主干开发方式工作也很重要。实现此目标的一种方法是将大量具有主干开发经验的开发者召集到一起,这样至少有一个团队遵循主干开发做法。然后,如果您确信遵循此做法的团队发挥预期的作用,则可以将其他团队转换为这种风格。 当然主干开发也不是银弹,他也会有一些自己的弊端,比如在处理需求变更,或者同时多版本并行开发时,也需要建立多个临时分支支持,想做到纯粹的主干开发,也是过于理想化的结果。

优秀的个人博客,低调大师

大龄码农的硬盘里有这么多宝藏

摘要:通过把所需建立的工具库做成云容器化应用,用CCE引擎,通过API网关调用云容器引擎中的容器应用。不仅顺应了云原生的发展趋势,还能随时弹性扩容,满足公司规模化发展的需求。 公司开完年中会后,大家的工作都开始恢复正常,我们也继续按部就班地撸代码(写bug)~偶尔透过办公室的玻璃看到老大跟老板在喝茶,感觉自从上次我影响了公司的战略方向,老板找老大“聊天”的次数越来越多了,看起来像是在“密谋”什么。 正想着呢,老大突然转头看向我,四目相对还是有些尴尬的,更尴尬的是老大示意我过去。 老大说:“公司想成立一个技术委员会,我挂名主席,你担任副主席,负责管理,核心的职责是沉淀公司的技术资产,提升所有研发人员的能力,你去想想该怎么行动。” “啥?我这就是技术委员会副主席了?沉淀公司技术资产...这事儿该咋整呢?啥叫技术资产?”回到座位以后,我仿佛又变回了曾经那个会怦然心动的少年,随手点开硬盘,看到了我这么多年积累下来的资源。 在我的硬盘里存储了这么多年来写过的各种程序、应用、工具,啥叫技术资产,这就叫技术资产呀,如果把公司存储的资料和大家硬盘里的宝藏都拿出来,做成一个可复用且随时可调用的工具库,那可以少写多少代码呀。 可是这该怎么实现呢? 有了!之前在华为云官网上看到过一个CCE云容器引擎。 我们可以把建立的工具库做成云容器化应用,用CCE引擎,通过API网关调用云容器引擎中的容器应用。这样一来,不仅顺应了云原生的发展趋势,还能随时弹性扩容,满足公司规模化发展的需求。 说干就干,先给老大写个方案。我把思路写完之后,重点写了使用API网关访问CCE云容器引擎中的容器应用的方法,毕竟,最终还是为了在工作中使用到这些技术资产。 通过API网关访问CCE中的工作负载的方法 一、准备CCE工作负载信息 在通过API网关将容器的工作负载对外开放前,需要在CCE服务控制台获取如下图所示信息,创建好集群和工作负载。注意工作负载的访问方式,需配置为“节点访问”。 1、查询访问端口 2、查询工作负载中实例所属弹性服务器的名称 二、创建VPC通道 1、登录控制台,进入API网关服务。 2、“创建VPC通道”的“基本信息”界面,单击“创建快速通道”,输入如图所示信息,其他参数保持默认值。 3、添加需要通过API网关访问的CCE工作负载的实例节点。可添加多个实例,API网关支持负载均衡功能。 点击“完成”,添加VPC通道。 三、开放API 1、创建分组 2、创建API。在“新建API”的“基本信息”界面,输入如下图所示信息。 在“定义API请求”界面,输入如下图所示信息。 在“定义后端服务”界面,输入如下图所示信息。 在“返回结果基础定义”界面,输入“成功响应示例”,在本示例中,输入内容仅供参考,无实际作用。单击“完成”,完成API的创建。 3、调试API。返回200,表示调用成功。 4、发布API 四、调用API 1、在API详情界面,复制“API URL”。 2、打开浏览器,在地址栏粘贴“API URL”的地址。请求API成功时,显示如下界面。如果想要设置一段时长内API的调用次数,请设置流控策略。 老大看过方案后很满意,并且要把这件事作为技术委员会成立后的第一个重点项目去做,申请专门的项目基金,还要给我成立项目小组,让我带着团队一起完成。现在的我:看向远方,目光坚定,嗯是时候表现真正的技术了~ 据了解,目前APIG网关开放了共享版和专享版两个版本,开发者可申请体验demo,进入共享版进行体验操作。

优秀的个人博客,低调大师

VS Code书写vue项目配置 eslint+prettier 统一代码风格

前言 以前公司的vue项目只是我一个人在写,代码风格统一,但是后来随着团队增加,统一的代码风格就越来越重要。我的主力工具是sublime,ws辅助,vscode基本很少使用(就下载安装放在冷宫),但是听说用来写vue项目还不错,就开启了一番折腾。当然工具么,没有谁好谁坏了~~ 不盲目站队,适合自己的就是最好的。 目标是:Eslint校验代码语法,prettier统一格式化代码,按下保存自动修复eslint错误,自动格式化代码(因为懒~) 安装vscode插件 首先,需要安装 Vetur、ESLint、Prettier - Code formatter这三个插件,安装完重启下,防止插件不生效。 另外这里有个坑, Beautify插件会占用格式化代码的快捷键,因此会和prettier产生冲突,所以直接禁用掉。 vscode插件配置 打开vscode工具的设置(快捷键 Ctrl + ,)里面有两个设置。 一个是 USER SETTINGS(用户设置)也就是全局配置,其他项目也会应用这个配置。 另一个是WORKSPACE SETTINGS(工作区设置)也就是项目配置,会在当前项目的根路径里创建一个.vscode/settings.json文件,然后配置只在当前项目生效。 我把配置写在了工作区设置,配置如下: { //.vue文件template格式化支持,并使用js-beautify-html插件 "vetur.format.defaultFormatter.html": "js-beautify-html", //js-beautify-html格式化配置,属性强制换行 "vetur.format.defaultFormatterOptions": { "js-beautify-html": { "wrap_attributes": "force-aligned" } }, //根据文件后缀名定义vue文件类型 "files.associations": { "*.vue": "vue" }, //配置 ESLint 检查的文件类型 "eslint.validate": [ "javascript", "javascriptreact", { "language": "vue", "autoFix": true } ], //保存时eslint自动修复错误 "eslint.autoFixOnSave": true, //保存自动格式化 "editor.formatOnSave": true } ESLint 和 Prettier 的冲突修复 由于需要同时使用prettier和eslint,而prettier的一些规则和eslint的一些规则可能存在冲突,例如prettier字符串默认是用双引号而esLint定义的是单引号的话这样格式化之后就不符合ESLint规则了。 所以要解决冲突就需要在Prettier的规则配置里也配置上和ESLint一样的规则,直接覆盖掉,ESLint和Prettier的配置文件内容如下: .eslintrc.js 配置使用单引号、结尾不能有分号。 module.exports = { root: true, env: { node: true }, extends: ['plugin:vue/essential', 'eslint:recommended'], rules: { 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', //强制使用单引号 quotes: ['error', 'single'], //强制不使用分号结尾 semi: ['error', 'never'] }, parserOptions: { parser: 'babel-eslint' } } .prettierrc 配置使用单引号、结尾不能有分号。 { //开启 eslint 支持 "eslintIntegration": true, //使用单引号 "singleQuote": true, //结尾不加分号 "semi": false } 也可以直接在vscode工作区配置prettier { //开启 eslint 支持 "prettier.eslintIntegration": true, //使用单引号 "prettier.singleQuote": true, //结尾不加分号 "prettier.semi": false, } 效果预览 最后 这下再也不用看到别人代码一团糟吐槽了。第一次折腾vscode,参考了很多网上大佬的文章,但是感觉这个配置好像还差了哪里,但又始终不知道问题在哪里,热烈欢迎大家交流指教。

优秀的个人博客,低调大师

阿里云短信套餐包-最低3分2/条-短信接码-短信群发平台

一、活动对象 1、阿里云官网注册的个人实名认证用户。其中,新老用户均可作为拼团活动的推荐者,但只有未购买过短信服务(即账号下无订单记录)的新用户方有资格参与拼团购买。 2、同一用户仅有一次参与拼团推荐或拼团购买指定云通信国内短信服务的机会。例如:同一用户使用不同账号作为推荐者参与本活动的,仅首个参与活动的账号可获赠;在阿里云官网已有消费的用户重新注册新账号参与拼团购买的,新老账号将被视为同一用户,不具有购买资格。 二、活动时间 2018年8月10日-2018年8月31日。 三、活动规则 1、活动期间,推荐者可推荐新用户通过活动专属页面购买指定云通信国内短信包,具体规格如下: 实例规格: ①5千条短信包价格:原价225元,活动价170元,单价0.034元/条 ②5万条短信包价格:原价2000元,活动价1650元,单价0.033元/条 ③50万条短信包价格:原价19000元,活动价16000元,单价0.032元/条 2、接受推荐的每一新用户通过活动专属页面,可以以上拼团价格购买1个指定短信包,每个用户仅限首笔订单购买一个套餐包。 3、用户应在15分钟内完成拼团订单的支付,否则订单将自动失效。 购买地址: https://promotion.aliyun.com/ntms/act/communication/aliyun-group/buy.html?group=cSdPIBfW7H

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册