简历上内容简介:
1、CI=>基于Jenkins的持续集成CI
CI(continuous integration)持续集成
持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。
就是指对于开发人员的每一次代码提交,都自动地把Repository中所有代码Check out到一个空目录,并且自动运行所有Test Case。如果成功则接受这次提交,否则告诉所有人,这是一个失败的Revision
一次构建:可能包含编译,测试,审查和部署,以及其他一些事情,一次构建就是将源代码放在一起,并验证软件是否可以作为一个一致的单元运行的过程。可以理解为频繁的在多个团队的工作中集成,并且给与反馈的过程。团队开发成员经常集成它们的工作,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。
CI场景如下:
(1)开发人员向版本控制库提交代码,同时,集成构建计算机上的CI服务器正在轮询检查版本控制库中的变更
(2)在提交发生之后,CI服务器检测到版本控制库中发生了变更,所以CI服务器会从库中取得最新的代码副本,执行构建脚本,该脚本将对软件进行集成
(3)CI服务器向指定的项目成员发成电子邮件,提供构建结果的反馈信息。
(4)CI服务器继续轮询版本控制库中的变更。
CI持续集成周期
一个典型的持续集成周期包括以下几个步骤:
(1)持续集成服务器不断从版本控制服务器上检查代码状态,看代码是否有更新。
(2)如果发现代码有最新的提交,那么就从版本控制服务器下载最新的代码。
(3)等代码完全更新以后,调用自动化编译脚本,进行代码编译。
(4)运行所有的自动化测试。
(5)进行代码分析。
(6)产生可执行的软件,能够提供给测试人员进行测试。
CI工具
持续集成工具:jenkins、CruiseControl、Hudson、gauntlet
构建工具:Maven、Ant、groovy
CDBI:持续数据库集成,即每次项目的版本控制库中发生变更时,重建数据库和测试数据。
Jenkins
Jenkins 是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上。同时 Jenkins 能实施监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。Jenkins 还提供了非常丰富的插件支持,这使得 Jenkins 变得越来越强大。我们可以方便的安装各种第三方插件,从而方便快捷的集成第三方的应用。
首先要知道一个持续集成环境需要包括三个方面要素:代码存储库、构建过程和持续集成服务器。
持续集成并不能消除Bug,而是让它们非常容易发现和改正
持续集成的价值与成本
(1)减小风险;(2) 减少手动过程;(3) 生成构建结果;(4) 安全感。
过程:
在Jenkins首页选择“新建”,输入名字,选择“构建一个Pipline项目”:
在配置页中,源码管理选择Git,填入地址:
…
Jenkins中使用Pipeline插件:
1)通过groovy脚本实现pipeline
使用groovy实现的pipeline流程,可以将对应的groovy脚本存储在文件Jenkinsfile, 且实现与源代码一起的版本控制。
Jenkinsfile与源代码一起版本控制,使得整个pipeline流程和源代码一起可重现。 通过Jenkinsfile实现的pipeline job,可以更容易地支持多个分支multi-branch, 更容易地支持组织和团队(GitHub organiztion and BitBucket Team)里的多个项目。
最好在groovy脚本Jenkinsfile的第一行增加#!groovy, 使得各种ide工具或web page能够支持groovy的语法高亮。
2)尽可能地在stage里实现所有的任务
所有pipeline里非配置的任务最好在stage块里实现。通过stage使得pipeline里所有的任务被组织为多个stage,每个stage都是一组相关的任务。
例如:
stage 'build' //build
stage 'test' //test
stage 'Checkout'
pipeline view 插件使得 pipeline的stage的view和monitor更加的清楚。
3)所有资源消耗的操作都应该放到node上执行
默认地,Jenkinsfile里的脚本在jenkins master上执行,如果资源消耗的操作都在master上执行的话将影响jenkins master的运行。 所以任何资源消耗的操作都应该放到node中被分布到agent上执行,例如从git server clone代码,java代码的编译等都应该在node中执行。
stage 'build'
node{
checkout scm
sh 'mvn clean install'
}
4)应该使用withEnv来修改环境变量
不建议使用env来修改全局的环境变量,这样后面的groovy脚本也将被影响。
一般使用withEnv来修改环境变量,变量的修改只在withEnv的块内起作用。
withEnv(["PATH+MAVEN=${tool 'm3'}/bin"]) {
sh "mvn clean verify"
}
2、soapUI
通过编写TestCase,在TestCase中添加Step,进行接口,http等的测试
3、postman
Postman说明
Postman是一种网页调试与发送网页http请求的chrome插件。我们可以用来很方便的模拟get或者post或者其他方式的请求来调试接口
HTTP请求的4部分:URL,请求的method,headers,body。
身份验证Authentication
postman有一个helpers可以帮助我们简化一些重复和复杂的任务。当前的一套helpers可以帮助你解决一些authentication protocols的问题。
3、其他
Github回滚
git reset --hard <commit ID号> 或者 git reset --hard HEAD^来进行回退
maven解决冲突
SpringBoot
SpringBoot特性
创建独立的Spring项目
内置Tomcat和Jetty容器
提供一个starter POMs来简化Maven配置
提供了一系列大型项目中常见的非功能性特性,如安全、指标,健康检测、外部配置等
完全没有代码生成和xml配置文件
加载配置可以用@PropertySource("classpath:com/ecej/test2/test.properties")
多线程
spring通过 TaskExecutor来实现多线程并发编程。使用ThreadPoolExecutor可实现基于线程池的TaskExecutor,使用@EnableAsync开启对异步任务的支持,并通过在实际执行bean方法中使用@Async注解来声明一个异步任务
@SpringBootApplication 和入口
这个标签是个组合注解,包含了@Configuration @EnableAutoConfiguration @ComponentScan三个标签
@EnableAutoConfiguration 让spring boot根据类路径中的jar包依赖为当前项目进行自动配置
MySQL 的各种 text 字段有不同的限制, 要手动区分 small text, middle text, large text... Pg 没有这个限制, text 能支持各种大小.
按照 SQL 标准, 做 null 判断不能用 = null, 只能用 is null
the result of any arithmetic comparison with NULL is also NULL
但 pg 可以设置 transform_null_equals 把 = null 翻译成 is null 避免踩坑
不少人应该遇到过 MySQL 里需要 utf8mb4 才能显示 emoji 的坑, Pg 就没这个坑.
MySQL 的事务隔离级别 repeatable read 并不能阻止常见的并发更新, 得加锁才可以, 但悲观锁会影响性能, 手动实现乐观锁又复杂. 而 Pg 的列里有隐藏的乐观锁 version 字段, 默认的 repeatable read 级别就能保证并发更新的正确性, 并且又有乐观锁的性能. 附带一个各数据库对隔离级别的行为差异比较调查: http://www.cs.umb.edu/~poneil/iso.pdf
MySQL 不支持多个表从同一个序列中取 id, 而 Pg 可以.
MySQL 不支持 OVER 子句, 而 Pg 支持. OVER 子句能简单的解决 "每组取 top 5" 的这类问题.
几乎任何数据库的子查询 (subquery) 性能都比 MySQL 好.
react只负责ui渲染,想要做好一个项目,往往需要其他库和工具的配合,比如用redux来管理数据,react-router管理路由,react已经全面拥抱es6,所以es6也得掌握,webpack就算是不会配置也要会用,要想提高性能,需要按需加载,immutable.js也得用上,还有单元测试。。。。
它创造了虚拟dom并且将它们储存起来,每当状态发生变化的时候就会创造新的虚拟节点和以前的进行对比,让变化的部分进行渲染。整个过程没有对dom进行获取和操作,只有一个渲染的过程,所以react说是一个ui框架。
react的一个组件很明显的由dom视图和state数据组成,两个部分泾渭分明。state是数据中心,它的状态决定着视图的状态,react采用setState来控制视图的更新。
它们一个将组件与redux关联起来,一个将store传给组件。组件通过dispatch发出action,store根据action的type属性调用对应的reducer并传入state和这个action,reducer对state进行处理并返回一个新的state放入store,connect监听到store发生变化,调用setState更新组件,此时组件的props也就跟着变化。