How to release maven project from Gitlab without Snapshot?

Viewed 49

.gitlab.yml has following

stages:
  - test
  - publish
  - deploy
  - manual

# Test all commits regardless of branch in a WildFly 10 instance
test:wf10:
  stage: test
  script:
    - mvn clean test -U -Dprofile.wildfly10 -Dwildfly10.servergroup=masterdata-web
  tags:
    - test
    
# Publish tagged release to Artifactory (WildFly 10)
publish-release:wf10:
  stage: publish
  only:
    - /^v-.*$/
  script:
    - mvn clean deploy -B -U -P wildfly10 -Dmaven.test.skip=true
  tags:
    - test

# Manually deploy any build to WildFly 10 servergroup Masterdata-web
deploy-test:wf10:
  stage: manual
  environment:
    name: test
  script:
    - mvn clean package wildfly:undeploy wildfly:deploy -B -U -P wildfly10 -Dmaven.test.skip=true -Dwildfly10.servergroup=masterdata-web 
  tags:
    - test
  when: manual

# Manually deploy tagged release to WildFly 10 servergroup Masterdata-web
deploy-qa:wf10:
  stage: manual
  environment:
    name: qa
  script:
    - mvn clean package wildfly:undeploy wildfly:deploy -B -U -P wildfly10 -Dmaven.test.skip=true -Dwildfly10.servergroup=masterdata-web 
  tags:
    - qa
  when: manual
  
# Automatically deploy build staged for release to WildFly 10 servergroup Masterdata-web
deploy-release-qa:wf10:
  stage: deploy
  environment:
    name: qa
  only:
    - master
  except:
    - /^v-.*$/
  script:
    - mvn clean package wildfly:undeploy wildfly:deploy -B -U -P wildfly10 -Dmaven.test.skip=true -Dwildfly10.servergroup=masterdata-web 
  tags:
    - qa
  when: manual

# Automaticaly deploy tagged release to WildFly 10 servergroup Masterdata-web
deploy-release-prod:wf10:
  stage: deploy
  environment:
    name: prod
  only:
    - /^v-.*$/
  script:
    - mvn clean package wildfly:undeploy wildfly:deploy -B -U -P wildfly10 -Dmaven.test.skip=true -Dwildfly10.servergroup=terp
  tags:
    - prod


# Manually generate project report for WildFly 10, report is stored for 2 weeks
generate-report:wf10:
  stage: manual
  script:
    - mvn clean test site:site -B -U -P wildfly10
    - mv target/site ./
  artifacts:
    name: report-wf10
    expire_in: 2 weeks
    paths:
    - site
  tags:
    - test
  when: manual
  
# Manual deploy tagged release to WildFly 10 servergroup servicedesk in PROD
deploy-prod:wf10:
  stage: deploy
  environment:
    name: prod
  #only:
  #  - /^v-.*$/
  script:
    - mvn clean package -B -U wildfly:undeploy wildfly:deploy -Dprofile.wildfly10 -Dmaven.test.skip=true -Dwildfly10.servergroup=terp
  tags:
    - prod
  when: manual 

For release every time, I need to run following commands by check out branch:

mvn release:prepare -Darguments=-Dprofile.wildfly10 -DignoreSnapshots=true
mvn release:clean
git push --follow-tags

Then it relaeases without SNAPSHOT

If i create manual branch it always append SNAPSHOT.

Can you suggest how to create manual pipeline which deploys without SNapshot and from Gitlab only?

1 Answers

Maven is doing exactly what you have ordered it to do. The command like:

mvn clean deploy -B -U -P wildfly10 -Dmaven.test.skip=true

orders maven to compile, package and deploy artifacts to remote repository, and when doing that maven picks up target version from pom.xml, thus to build and deploy artifacts with specific version you need to tell maven what version to use explicitly or implicitly, for example, when you are doing:

mvn release:prepare -Darguments=-Dprofile.wildfly10 -DignoreSnapshots=true
git push --follow-tags

maven-release-plugin creates two commits in SCM: the first one with "release" version in pom.xml (accompanied by tag/branch), the second one with "snapshot" version, and the first commit triggers your publish job. That explains why creating branch manually does not makes sense.

There are a couple of options to implement release management in maven project using GitLab:

  1. create pipeline forms in GitLab to request information about releaseVersion and developmentVersion, in that case maven release command would be something like mvn --batch-mode -Prelease release:clean release:prepare -DreleaseVersion=${releaseVersion} DdevelopmentVersion=${developmentVersion} (most likely extra setup will required to allow maven to push changes)
  2. let maven to choose versions automatically (or implement version policies), alternatively you make take advantage of using my extension: version-policy-extension
  3. use Maven CI Friendly Versions - in that case you will need to pass ${revision} from GitLab
  4. implement external tools (scripts, docker images) to automate that
Related