มาลองใช้ Maven Release Plugin กันเถอะ

Phayao Boonon
5 min readJan 14, 2020

ในการ 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 ได้อย่างมีประสิทธิภาพมากขึ้น

--

--

Phayao Boonon

Software Engineer 👨🏻‍💻 Stay Hungry Stay Foolish