規(guī)范開源項(xiàng)目 - Maven/TravisCI/Coveralls

在GitHub上開了不少坑 ,但為了方便都是直接編寫代碼 。參考了不少優(yōu)秀的作者,除了良好的代碼風(fēng)格之外,項(xiàng)目的描述/構(gòu)建/Issue管理都有很好的規(guī)范。今年首要目標(biāo)就是完善之前的坑,從項(xiàng)目構(gòu)建開始~

Maven

還是延續(xù)之前的parent-pom/child-jar的結(jié)構(gòu)

  • parent中只留配置 : dependencies/plugins 都替換成 management節(jié)點(diǎn)

parent作為一個(gè)公共配置 ,包括使用到的dependencies和plugins

  • 補(bǔ)充scm/issue等節(jié)點(diǎn)信息 ,供其他工具集成

項(xiàng)目的補(bǔ)充信息

  • 增加source/javadoc等plugin ,方便第三方使用者使用.

開源項(xiàng)目必備,當(dāng)然你得在寫代碼時(shí)就寫好doc

  • 增加代碼掃描工具(最好是通過IDEA的編寫時(shí)工具檢測(cè)更好)

Sonarlint,阿里編碼規(guī)約,前端的有jslint,編寫時(shí)檢測(cè)可以盡早提示你修改代碼,也更容易記憶。

新的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>

持續(xù)集成

之前嘗試在阿里云上搭Jenkins ,因?yàn)閮?nèi)存爆炸(1G) ,以失敗告終.在添加SCM節(jié)點(diǎn)時(shí) ,搜索了一下集成的工具 ,發(fā)現(xiàn)了 Travis CI.

Travis是一個(gè)持續(xù)集成的平臺(tái) ,自帶與GitHub的集成 ,能夠檢測(cè)代碼提交并觸發(fā)繼承腳本.

  • 進(jìn)入官網(wǎng)使用GitHub登錄 ,然后選擇想要繼承的repo
  • 在repo下新建.travis.yml文件 ,寫入自動(dòng)集成觸發(fā)的腳本
  • push代碼到github ,然后就可以到travis首頁(yè)查看編譯情況

coveralls是一個(gè)測(cè)試報(bào)告展示平臺(tái) ,能夠集成多種測(cè)試報(bào)告 .也是在使用travis的時(shí)候檢索到的 ,通過travis持續(xù)集成并生成測(cè)試報(bào)告 ,然后上傳到coveralls .

  • 使用GitHub賬號(hào)登錄 ,選擇repo
  • 復(fù)制repoToken

repoToken是你訪問測(cè)試報(bào)告的憑證 ,因此不能明文上傳到github上 ,但是我們又需要在CI中使用這個(gè)repoToken.

  • 加密Token
    • 使用travis的對(duì)稱加密工具(需要ruby gem工具):travis encrypt COVERALLS_TOKEN=xxxxxx
    • 復(fù)制加密后的token到.travis.yml文件中
    • 使用變量名訪問
  • 在travis腳本中使用token和測(cè)試報(bào)告生成工具
  • 生成并上傳測(cè)試報(bào)告

Java項(xiàng)目官方推薦了一個(gè)plugin使用 ,token不能使用明文 ,所以不能直接把token配置在pom中.而是在travis集成時(shí) ,把解密后的token拿來使用.

在子項(xiàng)目中使用插件

<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
  ## 生成測(cè)試報(bào)告
  - mvn jacoco:report
  ## 獲取travis解密的token ,并調(diào)用coveralls-plugin上傳報(bào)告
  - mvn coveralls:report -DrepoToken="${COVERALLS_TOKEN}"

## 加密后的token字串
env:
  global:
    - secure: "..............................."

這里是借助了travis的對(duì)稱加密:把 coveralls上獲取的倉(cāng)庫(kù)token加密后放到travis配置文件中。當(dāng)travis平臺(tái)運(yùn)行時(shí),會(huì)把配置文件中的密文都解密出來,其他配置(比如腳本)中就可以訪問到當(dāng)時(shí)加密的變量。
然后我再把token變量通過maven腳本傳遞到plugin中,就可以實(shí)現(xiàn)上傳report而不暴露明文的token了。

最后

就可以在主頁(yè)上看到持續(xù)集成和測(cè)試報(bào)告的結(jié)果 ,還可以導(dǎo)入非常有逼格的budge(主要目的)

TravisCI
Coveralls
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容