自動產生建構相關的資訊
在部署到伺服器後,有時會弄不清楚這個到底是根據哪一個 commit 發布的、何時發布的、某個函示庫使用哪個版本,或是
- 不想一直修改版號,想要用發布時間代替版號
- 頻繁的部署到伺服器,甚至部署到不同的伺服器,你想知道目前這個伺服器上目前到底是哪一版、或執行哪個 commit 的 code
這時你可以把建構過程的資訊加入 manifest 中,再由程式讀出來顯示在適合的地方。
用 buildnumber 產生 git commit, git 分支 (branch) 等資訊
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>buildnumber-maven-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<goals><goal>create</goal></goals>
</execution>
</executions>
<configuration>
<revisionOnScmFailure>0</revisionOnScmFailure>
<useLastCommittedRevision>true</useLastCommittedRevision>
</configuration>
</plugin>
用 build-helper 產生台灣時間 (GMT+8)。因為 project.build.timestamp 是 UTC+0 時間。
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.9.1</version>
<executions>
<execution>
<id>timestamp-property</id>
<goals>
<goal>timestamp-property</goal>
</goals>
<configuration>
<name>tw-timestamp</name>
<pattern>yyyy/MM/dd HH:mm:ss</pattern>
<timeZone>GMT+8</timeZone>
</configuration>
</execution>
</executions>
</plugin>
再把以上產生的資訊,加到 manifest 中。
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<archive>
<manifestEntries>
<Build-Time>${tw-timestamp}</Build-Time>
<Project-Version>${project.version}</Project-Version>
<Git-Commit>${buildNumber}</Git-Commit>
<Git-Branch>${scmBranch}</Git-Branch>
</manifestEntries>
</archive>
</configuration>
</plugin>
可用 ServletContext 讀取 manifest 並顯示在頁面上。
InputStream inputStream = servletContext.getResourceAsStream("/META-INF/MANIFEST.MF");
遇到錯誤
我遇到幾個錯誤訊息如下:
-
The scm url cannot be null
pom.xml 中scm.url
必須設定 -
No such provider: ''
<connection>
內容語法錯誤,沒有填 provider,正確語法應該是scm:[PROVIDER]:[git repository URL]
<scm>
<connection>scm:git:http://gitlab.abc.com/abc/abc.git</connection>
<url>http://gitlab.hawk.com/abc/abc.git</url>
</scm>
其實 buildnumber plugin 也可以產生時間,預設插入 millisecond,但是我只要一設定日期格式,maven 就會插入我設定的語法字串如: yyyy/MM/dd,而不是日期字串,到 manifest 中,因此只好放棄改用 build-helper。
留言