在GitHub上开了不少坑 ,但为了方便都是直接编写代码 。参考了不少优秀的作者,除了良好的代码风格之外,项目的描述/构建/Issue管理都有很好的规范。今年首要目标就是完善之前的坑,从项目构建开始~
Maven
还是延续之前的parent-pom/child-jar的结构
- parent中只留配置 : dependencies/plugins 都替换成 management节点
parent作为一个公共配置 ,包括使用到的dependencies和plugins
- 补充scm/issue等节点信息 ,供其他工具集成
项目的补充信息
- 增加
source/javadoc
等plugin ,方便第三方使用者使用.
开源项目必备,当然你得在写代码时就写好doc
- 增加代码扫描工具(最好是通过IDEA的编写时工具检测更好)
Sonarlint,阿里编码规约,前端的有jslint,编写时检测可以尽早提示你修改代码,也更容易记忆。
新的POM
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>site.koalazoo.cutekoala</groupId>
<artifactId>cute-koala</artifactId>
<version>0.1.0</version>
<packaging>pom</packaging>
<name>Cute Koala</name>
<url>https://github.com/Anddd7/cute-koala</url>
<description>Manage your Java Application easiler.</description>
<licenses>
<license>
<name>Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
<distribution>repo</distribution>
</license>
</licenses>
<issueManagement>
<system>GitHub Issues</system>
<url>https://github.com/Anddd7/cute-koala/issues</url>
</issueManagement>
<inceptionYear>2017</inceptionYear>
<scm>
<connection>scm:git:https://github.com/Anddd7/cute-koala.git</connection>
<developerConnection>scm:git:git@github.com:Anddd7/cute-koala.git</developerConnection>
<url>https://github.com/Anddd7/cute-koala</url>
</scm>
<developers>
<developer>
<id>and777</id>
<name>Eddy Liao</name>
<email>liaoad_space@sina.com</email>
<roles>
<role>owner</role>
<role>developer</role>
</roles>
<timezone>+8</timezone>
</developer>
</developers>
<modules>
<module>koala-core</module>
<module>koala-test</module>
</modules>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.build.jdk.v>1.8</project.build.jdk.v>
<junit.v>4.12</junit.v>
<slf4j-log4j12.v>1.7.5</slf4j-log4j12.v>
<lombok.v>1.16.18</lombok.v>
<fastjson.v>1.2.33</fastjson.v>
<mysql-jdbc.v>6.0.6</mysql-jdbc.v>
<guava.v>22.0</guava.v>
<beetl.v>2.7.16</beetl.v>
<snakeyaml.v>1.18</snakeyaml.v>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j-log4j12.v}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.v}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.v}</version>
<scope>provided</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>${project.build.jdk.v}</source>
<target>${project.build.jdk.v}</target>
</configuration>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.2</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.10.4</version>
<configuration>
<quiet>true</quiet>
<notimestamp>true</notimestamp>
<additionalparam>-Xdoclint:-html</additionalparam>
<encoding>${project.build.sourceEncoding}</encoding>
<docencoding>${project.build.sourceEncoding}</docencoding>
<charset>${project.build.sourceEncoding}</charset>
<additionalparam>-XDignore.symbol.file</additionalparam>
<additionalparam>-Xdoclint:-html</additionalparam>
<linksource>true</linksource>
</configuration>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-maven-plugin</artifactId>
<version>1.16.18.1</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>delombok</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.6.201602180812</version>
<executions>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.eluder.coveralls</groupId>
<artifactId>coveralls-maven-plugin</artifactId>
<version>4.3.0</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
持续集成
之前尝试在阿里云上搭Jenkins ,因为内存爆炸(1G) ,以失败告终.在添加SCM节点时 ,搜索了一下集成的工具 ,发现了 Travis CI.
Travis是一个持续集成的平台 ,自带与GitHub的集成 ,能够检测代码提交并触发继承脚本.
- 进入官网使用GitHub登录 ,然后选择想要继承的repo
- 在repo下新建
.travis.yml
文件 ,写入自动集成触发的脚本 - push代码到github ,然后就可以到
travis
首页查看编译情况
coveralls是一个测试报告展示平台 ,能够集成多种测试报告 .也是在使用travis的时候检索到的 ,通过travis持续集成并生成测试报告 ,然后上传到coveralls .
- 使用GitHub账号登录 ,选择repo
- 复制repoToken
repoToken是你访问测试报告的凭证 ,因此不能明文上传到github上 ,但是我们又需要在CI中使用这个repoToken.
- 加密Token
- 使用travis的对称加密工具(需要ruby gem工具):
travis encrypt COVERALLS_TOKEN=xxxxxx
- 复制加密后的token到
.travis.yml
文件中 - 使用变量名访问
- 使用travis的对称加密工具(需要ruby gem工具):
- 在travis脚本中使用token和测试报告生成工具
- 生成并上传测试报告
Java项目官方推荐了一个plugin使用 ,token不能使用明文 ,所以不能直接把token配置在pom中.而是在travis集成时 ,把解密后的token拿来使用.
在子项目中使用插件
<build>
<plugins>
<!-- 直接引用parent中配置好的plugin -->
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.eluder.coveralls</groupId>
<artifactId>coveralls-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
.travis.yml的配置
language: java
sudo: false
script: mvn clean verify
after_success:
- mvn clean test
## 生成测试报告
- mvn jacoco:report
## 获取travis解密的token ,并调用coveralls-plugin上传报告
- mvn coveralls:report -DrepoToken="${COVERALLS_TOKEN}"
## 加密后的token字串
env:
global:
- secure: "..............................."
这里是借助了travis的对称加密:把 coveralls上获取的仓库token加密后放到travis配置文件中。当travis平台运行时,会把配置文件中的密文都解密出来,其他配置(比如脚本)中就可以访问到当时加密的变量。
然后我再把token变量通过maven脚本传递到plugin中,就可以实现上传report而不暴露明文的token了。
最后
就可以在主页上看到持续集成和测试报告的结果 ,还可以导入非常有逼格的budge(主要目的)