มาลองใช้ Maven Release Plugin กันเถอะ
ในการ release project ของ Java นั้นมีเครื่องมือหลากหลายตัวที่สร้างมาเพื่อรองรับการ release นี้ แต่ Maven tools เป็น build tools ที่ใช้งานกันอย่างแพร่หลาย (น่าจะมากที่สุดของ Java) ก็มี plugin ที่มารองรับการ release นี้เช่นกัน ในบทความนี้เราจะมาลองใช้ Maven Release plugin มา release Spring Boot project แบบง่ายๆ ดู
Maven Release Plugin
เป็น plugin ที่ใช้สำหรับการ Release project ด้วย maven ซึ่งเป็น plugin ที่ช่วยเราได้มากสำหรับงานที่เป็นงานที่ทำซ้ำๆ และ งาน manual ซึ่งการ release project ด้วย maven release plugin ประกอบด้วย 2 ขั้นตอน คือ prepare
และ perform
ซึ่ง Maven ที่รองรับ Release plugin นี้จะต้องเป็น version 3.0.4 ขึ้นไป เนื่องจากจะมีการตั้งค่าบางอย่างที่เกี่ยวข้อง
เป้าหมายหลักของ Release plugin นี้คือการมี mechanism มาตรฐาน สำหรับการ release project โดยที่จะมีฟังก์ชันพื่นฐานที่จะสร้าง Release และอับเดต SCM ของ project ให้ด้วย
Create Project
ก่อนที่จะลองใช้ Maven Release plugin เราก็ต้องสร้า project ก่อน โดยในบทความนี้จะใช้ Spring Boot project ที่เป็น Maven ซึ่งใช้เป็นโครง project เฉยๆ ไม่ได้ให้มีความสามารถอะไร เพราะเราจะละ implementation ของ project ไปก่อน โดยการ focus ที่การ release project เท่านั้น
โดยการสร้าง Spring Boot project ก็ใช้ start.spring.io เลือกเป็น Maven Project
หลังจาก generate maven project แล้วก็ใช้ IDE อย่าง IntelliJ IDEA เพื่อเปิด project ขึ้นมา
Create Git Repository
เนื่องจากเราจะให้ Maven Release plugin สร้าง Release ให้ใน SCM ดังนั้นในบทความนี้จะใช้ GitHub Git Repository เป็น SCM ดั้งนั้นจะต้องสร้าง repository ใหม่ สำหรับ Spring Boot project ที่เราได้สร้างขึ้น
และสร้าง Git repository ใน Spring Boot project และ commit แรกตามที่ GitHub แนะนำ
$ echo "# demo-maven-release" >> README.md
$ git init
$ git add README.md
$ git commit -m "first commit"
$ git remote add origin https://github.com/iphayao/demo-maven-release.git
$ git push -u origin master
และ commit Spring Boot project ที่ generate มาไปที่ Git repository
$ git add .
$ git commit -m "Initialize spring boot project"
$ git push
เป็นอันว่าเราได้สร้าง Spring Boot project ที่เป็น Maven project และ commit code เริ่มต้นไปที่ Git repository เป็นที่เรียบร้อย
Release Prepare
ขั้นตอนแรกของการ release ด้วย Maven Release plugin นั้นก็คือ “Prepare” แต่ก่อนที่จะใช้คำสั่ง prepare
ได้นั้นจะต้องตั้งค่า Maven Release plugin เข้าไปใน Spring Boot project เสียก่อน โดยการเปิด pom.xml
ขึ้นมาและเพิ่ม plugin
tag เข้าไปใน plugins
tag หลังจาก spring-boot-maven-plugin
โดยที่เพิ่ม plugin maven-release-plugin
เข้าไป ซึ่งเป็นการเพิ่ม Maven Release plugin ใน project และเพิ่ม configuration
tag โดยกำหนดให้ tagBase
เป็น path ของ Git repository ที่สร้างบน GitHub
และเพิ่ม scm
tag โดยกำหนดให้ developerConnection
เป็น URL ใน format ของ scm:[scm-provider]
ซึ่งในบทความนี้จะเป็น Git repository จะได้เป็น scm:git:
เพิ่ม distributionManagement
tag เพื่อกำหนด Repository ที่ต้องการ release project ไปเก็บไว้ใช้งานต่อ ซึ่งจะอธิบายในตอน perform
<distributionManagement>
<repository>
<id>central</id>
<name>demo-releases</name>
<url>http://localhost:8081/artifactory/demo-repository</url>
</repository>
</distributionManagement>
<scm>
<developerConnection>scm:git:https://github.com/iphayao/demo-maven-release</developerConnection>
<tag>HEAD</tag>
</scm>
<dependencies>
.....
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<configuration>
<tagBase>https://github.com/iphayao/demo-maven-release/releases</tagBase>
</configuration>
</plugin>
</plugins>
</build>
เมื่อตั้งค่าสำหรับ Prepare เรียบร้อยแล้วก็ใช้คำสั่ง prepare
ได้แล้ว โดยขั้นต้นนี้จะลอง prepare project ของเราด้วย mode DryRun ก่อนเพื่อดูว่าสิ่งที่เราตั้งค่ามานั้นใช้งานได้หรือไม่ และจะไม่กระทบกับ project ด้วยคำสั่ง
$ mvn release:prepare -DdryRun=true
ซึ่งจะเห็นได้ว่าเกิด error ขึ้น เนื่องจากเราแก้ไข pom.xml
แต่ยังไม่ได้ commit การแก้ไขนี้
เนื่องจากว่าเราได้ใช้คำสั่ง release:prepare
ด้วย mode DryRun ไปแล้ว ก่อนที่จะ commit การแก้ไข จะต้อง clean project ด้วยคำสั่ง release:clean
เพื่อลบสิ่งต่างๆ ที่ Maven Release plugin สร้างขึ้นมาก่อน แล้วจึง commit การแก้ไขนั้น
$ mvn release:clean
และลองใช้คำสั่ง release:prepare
ใน mode DryRun ดูว่ามี error อีกไหม
จะเห็นได้ว่า Maven Release plugin จะถามเกี่ยวกับ release version, release tag และ new development version ถ้าเราไม่ได้มี version เฉพาะก็สามารถใช้ค่า default ได้เลย
ซึ่งขั้นตอนนี้ maven จะ execute goal clean
และ verify
จะไม่มีการเปลี่ยนค่าของ pom.xml
ใน mode DryRun แต่จะมีการสร้างไฟล์ต่างๆ เพื่อให้ตรวจสอบ
ถ้าใน mode DryRun ไม่มี error ใดๆ ก็ใช้คำสั่ง release:clean
เพื่อลบข้อมูลต่างๆ จากคำสั่ง release:prepare
ใน DryRun และใช้คำสั่ง release:prepare
ใน mode ปรกติ จะเห็นได้ว่าจะมีคำถามเหมือนกับ mode DryRun
$ mvn release:prepare
แต่ใน mode ปรกตินี้ Maven Release plugin จะแก้ไข pom.xml และทำการสร้าง tag และ release ใน SCM (Git) Repository ให้เราทั้งหมด ซึ่งเราจะสังเกตได้จาก คำสั่งใน terminal
เมื่อดู Releases ของ project ใน GitHub จะเห็นได้ว่า Maven Release plugin สร้าง release ให้เรียบร้อย
Release Perform
ในขั้นตอนของ release perform จะเป็นขั้นตอนที่จะนำ code ที่เราเตรียมการ release ไว้ในขั้นตอน prepare ส่งไปที่ Repository Manager ซึ่งในบทความนี้จะในเป็น Jfrog Artifactory ที่ run บน Docker
จากการตั้งค่า Repository Manager ใน pom.xml
จากตอนแก้ไข pom.xml นั้น เพื่อให้ Maven Release plugin ทำการ release project ไปที่ Artifactory ด้วยการกำหนด url tag ให้กับ distributionManager tag โดยเป็น URL ของ Repository ที่ต้องการ deploy project ซึ่งในบทความนี้จะเป็น Repository demo-repository
...<distributionManagement>
<repository>
<id>central</id>
<name>demo-releases</name>
<url>http://localhost:8081/artifactory/demo-repository</url>
</repository>
</distributionManagement>...
ใช้คำสั่ง release:perform
เพื่อ release code ไปยัง Repository Management
$ mvn release:perform
หลังจาก run คำสั่งนี้แล้ว Maven Release plugin จะทำขั้นตอนดังนี้
- แตกไฟล์ที่เตรียมไว้แล้ว จาก SCM (Git) ภายใต้ชื่อ Tag ใหม่
- ดำเนินการ maven build lifecycle บนไฟล์ที่ extract มาแล้ว ไม่ได้ทำกับไฟล์ของ project
- Deploy artifacts ที่ได้ไปยัง Repository ที่กำหนดใน pom.xml
ซึ่งคำสั่ง release:perform
จำเป็นต้องใช้ไฟล์ release.properties ที่ได้จากคำสั่ง release:prepare
ที่อยู่ใน root directory
สามารถตรวจสอบได้ใน Jfrog Artifactory ก็จะเห็นว่ามี artifact ของ version 0.0.1
ใน demo-repository
Artifact ต่างๆ ที่ได้จาก release ของ Maven Release plugin ดังนี้
- artifact
id-version.jar
เป็น binary ของ current release ของ project - artifact
id-version-javadoc.jar
เป็น javadoc ของ current release - artifact
id-version-source.jar
เป็น source code ของ current release - artifact
id-version.pom
เป็น content ของไฟล์ pom.xml ที่ใช้สร้าง current release
สรุป
จากการที่ได้ลองใช้งาน Maven Release plugin ในบทความนี้แบบเบื้องต้นนั้น ทำให้เราเห็นว่า plugin นี้มีประโยชน์อย่างมากในการ release project ที่สร้างขึ้น และดูแล้วสามารถเอาไปใช้ใน CI/CD pipeline ของ Jenkins ได้ด้วยทำให้การใช้งาน maven เป็นเครื่องมือในการจัดการ project ได้อย่างมีประสิทธิภาพมากขึ้น