travis ci
作为顾问,我在不同的“企业”环境中完成了许多Java项目。 通常,持续集成堆栈(如果有的话)包括:
- Github Enterprise或Atlassian Stash用于源代码版本控制
- Jenkins作为CI服务器,有时但很少使用Atlassian Bamboo
- Maven构建工具
- JaCoCo进行代码覆盖
- Artifactory作为工件存储库-一旦我拥有Nexus
最近,我开始开发Koadlin DSL Kaadin ,以设计Vaadin应用程序。 我自然地将它托管在Github上,并希望具有与上述现实生活项目相同的功能。 这篇文章描述了如何使用全新的堆栈来实现所有所需的功能,而这可能是企业Java开发人员可能不熟悉的。
Github是绝配。 然后我继续寻找Jenkins云提供商来运行我的构建...无济于事。 这并不令人惊讶,因为我去年已经在搜索“持续集成”课程时没有取得任何成功。 我绝对可以在任何IaaS平台上安装我自己的实例,但是惯用它总是值得的。 Github上托管了许多Java项目。 他们大多使用Travis CI ,所以我走了这条路。
Travis CI注册
注册就像使用Github凭据登录,接受所有条件并设置需要构建的项目一样容易。
基本
从.travis.yml
文件的根目录中读取项目配置。 从历史上讲,该平台是针对Ruby的,但如今可以构建使用不同语言的不同类型的项目。 最重要的配置部分是定义语言。 因为我的是Java项目,所以第二重要的是使用哪个JDK:
language:java
jdk:oraclejdk8
从那时起,对Github存储库的每次推送都将触发构建- 包括分支。
汇编
如果项目的根目录中存在POM,则会自动检测到该POM,在这种情况下,Maven(或Maven包装器)将用作构建工具。 使用包装器设置Maven版本是一个好主意。 除此之外,没有使用任何版本的提示。
如上所述,Travis CI最初是为Ruby项目设计的。 在Ruby中,依赖项是在系统范围内安装的,而不是像Maven那样按项目安装的。 因此,生命周期包括:
- 安装依赖项阶段,默认情况下转换为
./mvnw install -DskipTests=true -Dmaven.javadoc.skip=true -B -V
- 每个项目明确定义的构建阶段
这种两阶段映射与Maven项目无关,因为Maven使用了一种惰性方法:如果依赖项不在本地存储库中,则将在需要时下载它们。 对于更惯用的管理,可以绕过第一个阶段,而只需要设置第二个阶段:
install:true
script:./mvnw clean install
提高构建速度
为了加快将来的构建,最好在不同的运行之间保留Maven本地存储库,就像Jenkins或本地计算机上的情况一样。 通过以下配置即可实现:
cache:
directories:
-$HOME/.m2
测试和构建失败
至于标准的Maven构建,阶段是按顺序运行的,因此调用install
将首先使用compile
然后进行test
。 单个失败的测试,构建将失败。 报告通过电子邮件发送。
大多数开源项目在其主页上显示其构建状态标志,以建立与用户的信任。 该徽章由Travis CI提供,只需进行热链接即可,如下所示:
代码覆盖率
Travis CI不使用在Maven构建期间生成的JaCoCo报告。 一个人必须使用另一种工具。 有几种可用的方法:我之所以选择https://codecov.io/ ,除了Mockito也使用它之外,没有其他原因。 演练是相同的,使用Github注册,接受条件,这是可行的。
Codecov乐于使用JaCoCo覆盖率报告,但选择仅显示行覆盖率- 不太有意义的指标 IMHO。 但是,它已经足够广泛了,所以让我们通过一个可以热链接的漂亮徽章向用户显示它:
构建配置文件需要更新:
script:
-./mvnw clean install
-bash <(curl -s https://codecov.io/bash)
在每次构建时,Travis CI都会调用在线Codecov Shell脚本,该脚本将以某种方式基于上一个构建命令期间生成的JaCoCo报告来更新代码覆盖率值。
部署到Bintray
公司通常在内部存储库上部署构建的工件。 开源项目应部署在公共存储库上,以供用户下载-这意味着Bintray和JCenter。 幸运的是,Travis CI提供了许多不同的远程要部署到其中,包括Bintray。
通常,只有专用分支应该部署到远程release
例如 release
。 该参数在配置文件中可用:
deploy:
-
on:
branch:release
provider:bintray
skip_cleanup:true
file:target/bin/bintray.json
user:nfrankel
key:$BINTRAY_API_KEY
请注意上面的$BINTRAY_API_KEY
变量。 Travis CI提供了环境变量以提供一定的灵活性。 可以将它们中的每一个定义为不显示在日志中。 请注意,在这种情况下,它被视为机密 ,并且无法在用户界面中再次显示。
对于Bintray,这意味着要掌握Bintray上的API密钥,使用相关名称创建变量并设置其值。 当然,可以根据需要创建其他变量。
大多数部署配置都委派给Bintray专用的JSON文件。 除其他信息外,它还包含来自Maven POM的artifactId
和version
值。 Maven筛选配置为自动从POM获取内容并将其来源配置文件以供使用:请注意,路径引用在生成的target
文件夹下。
结论
在Github上进行开源开发需要与内部企业开发不同的方法。 特别是,标准构建管道基于完全不同的堆栈。 由于使用不同的默认值和所有需要阅读的文档,因此使用此堆栈非常耗时,但这绝非不可能。
更进一步:
翻译自: https://blog.frankel.ch/travis-ci-tutorial-for-java-projects/
travis ci