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

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

Maven

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

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

parent作為一個公共配置 晃洒,包括使用到的dependencies和plugins

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

項目的補(bǔ)充信息

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

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

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

Sonarlint,阿里編碼規(guī)約球及,前端的有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>

持續(xù)集成

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

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

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

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

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

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

  • 加密Token
    • 使用travis的對稱加密工具(需要ruby gem工具):travis encrypt COVERALLS_TOKEN=xxxxxx
    • 復(fù)制加密后的token到.travis.yml文件中
    • 使用變量名訪問
  • 在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 ,并調(diào)用coveralls-plugin上傳報告
  - mvn coveralls:report -DrepoToken="${COVERALLS_TOKEN}"

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

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

最后

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

TravisCI
Coveralls
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吕粗,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子旭愧,更是在濱河造成了極大的恐慌颅筋,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件输枯,死亡現(xiàn)場離奇詭異议泵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)桃熄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門先口,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瞳收,你說我怎么就攤上這事碉京。” “怎么了螟深?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵谐宙,是天一觀的道長。 經(jīng)常有香客問我界弧,道長凡蜻,這世上最難降的妖魔是什么搭综? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮咽瓷,結(jié)果婚禮上设凹,老公的妹妹穿的比我還像新娘。我一直安慰自己茅姜,他們只是感情好闪朱,可當(dāng)我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著钻洒,像睡著了一般奋姿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上素标,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天称诗,我揣著相機(jī)與錄音,去河邊找鬼头遭。 笑死寓免,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的计维。 我是一名探鬼主播袜香,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鲫惶!你這毒婦竟也來了蜈首?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤欠母,失蹤者是張志新(化名)和其女友劉穎欢策,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赏淌,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡踩寇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了六水。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俺孙。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖缩擂,靈堂內(nèi)的尸體忽然破棺而出鼠冕,到底是詐尸還是另有隱情添寺,我是刑警寧澤胯盯,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站计露,受9級特大地震影響博脑,放射性物質(zhì)發(fā)生泄漏憎乙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一叉趣、第九天 我趴在偏房一處隱蔽的房頂上張望泞边。 院中可真熱鬧,春花似錦疗杉、人聲如沸阵谚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梢什。三九已至,卻和暖如春朝聋,著一層夾襖步出監(jiān)牢的瞬間嗡午,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工冀痕, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留荔睹,地道東北人。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓言蛇,卻偏偏與公主長得像僻他,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子猜极,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容