LIGHT

  • News
  • Docs
  • Community
  • Reddit
  • GitHub

Light Release

Light consists of numeric repositories in github.com/networknt organization. Some of the repositories are libraries and some of them are applications built on top of other libraries. For libraries, they need to be released to maven central, and for applications, they need to be released to docker hub or both. Before we have light-bot, the manual release takes several days for testing and repeating the cycle. Sometimes we have to abort a release number as a defect is identified at a late stage of the release cycle.

The problem we were facing is common for large-scale microservices DevOps. There are too many repositories with libraries and applications with complex dependencies. Existing DevOps tools are focusing on a single repository and none of them can handler the integration test and multiple repositories or even organizations release process.

To make ours and our users lives easier, we have developed light-bot which is a DevOps pipeline that is focusing on microservices. Now, we are running the integration test continuously to ensure the quality of the codebase. And at release time, we just need to issue several commands on the terminal. The release notes are generated and uploaded to github.com repositories, but sometimes, we need to update it to add an upgrade guideline section for certain repositories. This is the only manual work that we cannot automate.

The following is a tutorial that walks through the release cycle. It allows our users to peek into it and learn how to leverage the same tool for their microservices projects.

Prerequisites

  • Gpg key must be installed on the release machine for maven release.
  • Github token environment variable CHANGELOG_GITHUB_TOKEN to allow release note generation.
  • Clone and build light-bot by following this build light-bot tutorial.
  • Clone light-config-test repository which contains the light-bot config files to the same workspace.
  • Start docker-compose-integration-test.yml and docker-compose-cdcserver-for-tram.yml from light-docker

Maven Release

All libraries must be release to maven central. The following is the steps to trigger the release.

Release Number

Update the light-config-test/light-bot/release-maven/release-all/config/release-maven.yml for new release number.

Here is the entire config file.

# Workspace that is used for this operation. Most of time, this is done on local.
workspace: releasemaven
# release version that is used to generate changelog. This need to be changed every time
version: 1.5.20
# github organization as the token is bound to the org in changelog generator. This
# means that you can only release multiple repositories within the same org each time.
organization: networknt
# You can skip checkout if you are sure that the code in workspace are the latest and
# you just want to repeat the release process due to some environmental issue before.
skip_checkout: false
# You can skip the merge step is this has been done in the previous execution.
skip_merge: false
# You can skip the last release step so that you can double check the merged result.
skip_release: false
# clone and switch to develop branch / checkout and pull from develop branch
checkout:
  - branch: develop
    repository:
    - [email protected]:networknt/light-4j.git
    - [email protected]:networknt/json-overlay.git
    - [email protected]:networknt/openapi-parser.git
    - [email protected]:networknt/light-rest-4j.git
    - [email protected]:networknt/light-graphql-4j.git
    - [email protected]:networknt/light-hybrid-4j.git
    - [email protected]:networknt/light-codegen.git
    - [email protected]:networknt/light-eventuate-4j.git
    - [email protected]:networknt/light-tram-4j.git
    - [email protected]:networknt/light-saga-4j.git
    - [email protected]:networknt/light-session-4j.git
    - [email protected]:networknt/light-spa-4j.git
    - [email protected]:networknt/light-proxy.git
    - [email protected]:networknt/light-router.git
    - [email protected]:networknt/light-oauth2.git
    - [email protected]:networknt/light-tokenization.git
    - [email protected]:networknt/light-consumer-4j.git
    - [email protected]:networknt/light-example-4j.git
    - [email protected]:networknt/light-docker.git
    - [email protected]:networknt/light-doc.git
    - [email protected]:networknt/light-config-test.git
    - [email protected]:networknt/light-bot.git
    - [email protected]:networknt/light-config-server.git
    - [email protected]:networknt/microservices-framework-benchmark.git
    - [email protected]:networknt/model-config.git
    - [email protected]:networknt/light-portal.git
    - [email protected]:networknt/react-schema-form.git
    - [email protected]:networknt/light-workflow-4j.git
    - [email protected]:networknt/light.git
    - [email protected]:networknt/swagger-bundler.git
    - [email protected]:networknt/http2client-benchmark.git
    - [email protected]:networknt/json-schema-validator-perftest.git
    - [email protected]:networknt/microbenchmark.git
    - [email protected]:networknt/react-schema-form-rc-select.git
    - [email protected]:networknt/light-config-prod.git
    - [email protected]:networknt/react-file-manager.git
    - [email protected]:networknt/light-commerce.git
    - [email protected]:networknt/light-cms.git
# merge develop to master and check in master for above repositories.
# It assumes that you always merge into master branch to release.
# Some of the repositories above are not going to be release but simple merge from
# develop to master in order to sync with other repo's release.
merge:
# generate changelog.md from github issues and check in
# release to maven central
# merge the changelog.md to develop branch
# publish the release to github repository
release:
  - light-4j
  - json-overlay
  - openapi-parser
  - light-rest-4j
  - light-graphql-4j
  - light-hybrid-4j
  - light-codegen
  - light-eventuate-4j
  - light-tram-4j
  - light-saga-4j
  - light-session-4j
  - light-spa-4j
  - light-consumer-4j
#  - light-proxy
#  - light-router
#  - light-oauth2

As you can see that the release number has been update to 1.5.20 release.

Release Command

From your workspace

cd light-config-test/light-bot/release-maven/release-all
./run.sh

Depending on your computer and network speed, it might take 30 to 40 minutes to complete.

After the release is done, you might need to update the generated release notes to add a section for upgrade guideline.

Docker Release

There are a lot of infrastructure services provided as part of the light platform to support large scale microservices deployment. There services are released as docker images in docker hub. In the entire release cycle, the docker release should be done after the maven release as these applications/services are depending on the cross-cutting concerns released to maven.

Release Number

First we need to update the release vesion in the config file located at

light-config-test/light-bot/release-docker/release-all/config

Here is the update config with release 1.5.20

# Workspace that is used for this operation. Most of time, this is done on local.
workspace: releasedocker
# new upgraded version. This needs to be changed for every release.
version: 1.5.20
# github organization as the token is bound to the org in changelog generator. This
# means that you can only release multiple repositories within the same org each time.
organization: networknt
# skip checkout if you know all latest code has been checkout in the previous build
skip_checkout: false
# skip merge if develop branch has been merged to master
skip_merge: false
# skip maven build if you know the build has been done already
skip_maven: false
# skip release if it is already done.
skip_release: false
# skip docker publish if it is done already.
skip_docker: false
# clone and switch to develop branch / checkout and pull from develop branch
checkout:
  # here we checkout master branch to publish the images. 
  - branch: develop
    repository:
    - [email protected]:networknt/light-proxy.git
    - [email protected]:networknt/light-router.git
    - [email protected]:networknt/light-oauth2.git
    - [email protected]:networknt/light-tokenization.git
    - [email protected]:networknt/light-portal.git
    - [email protected]:networknt/light-eventuate-4j.git
    - [email protected]:networknt/light-tram-4j.git
    - [email protected]:networknt/light-example-4j.git
    # - [email protected]:networknt/light-codegen.git
    # - [email protected]:networknt/light-docker.git
# merge develop to master for above repos
merge:
  - light-proxy
  - light-router
  - light-oauth2
  - light-tokenization
  - light-portal
  - light-eventuate-4j
  - light-tram-4j
  - light-example-4j
  # - light-codegen
  # - light-docker
# maven build
maven:
  - light-proxy
  - light-router
  - light-oauth2
  - light-tokenization
  - light-portal
  - light-eventuate-4j
  - light-tram-4j
  - light-example-4j/discovery/api_a/kubernetes
  - light-example-4j/discovery/api_b/kubernetes
  - light-example-4j/discovery/api_c/kubernetes
  - light-example-4j/discovery/api_d/kubernetes
  # - light-codegen

# update changelog in master, merge it to develop and publish to github.com
# please note that light-eventuate-4j and light-tram-4j are released in release-maven task.
release:
  - light-proxy
  - light-router
  - light-oauth2
  - light-tokenization
  - light-portal
  # - light-codegen

# build docker image and push to docker hub
docker:
  - light-proxy
  - light-router
  - light-oauth2/authorize
  - light-oauth2/client
  - light-oauth2/code
  - light-oauth2/key
  - light-oauth2/refresh-token
  - light-oauth2/service
  - light-oauth2/token
  - light-oauth2/user
  - light-tokenization
  - light-portal/hybrid-command
  - light-portal/hybrid-query
  - light-example-4j/discovery/api_a/kubernetes
  - light-example-4j/discovery/api_b/kubernetes
  - light-example-4j/discovery/api_c/kubernetes
  - light-example-4j/discovery/api_d/kubernetes
  # need to shutdown docker-compose-integration-test.yml before building the following two images.
  # moved to release-cdc sub task.
  # - light-eventuate-4j/eventuate-cdc-server
  # - light-tram-4j/tram-cdc-mysql-server
  # - light-docker/light-codegen

Command Line

Now let’s run the command line to start light-bot.

cd light-config-test/light-bot/release-docker/release-all
./run.sh

It will take about 30 minutes to get all docker images released.

Release light-codegen Docker

Light-codegen needs to be built within a docker container so it has to wait all maven libraries are available on maven central before starting it. Normally it takes about 30 minutes to several hours to have all the libraries ready.

There is a separate config of light-bot for this build and it depends on light-docker to be in the same workspace.

Release Number

First let’s update the config release-docker.yml for the new release number. The file is located at

light-config-test/light-bot/release-docker/release-codegen/config

Here is the content after the modification

# Workspace that is used for this operation. Most of time, this is done on local.
workspace: releasedocker
# new upgraded version. This needs to be changed for every release.
version: 1.5.20
# github organization as the token is bound to the org in changelog generator. This
# means that you can only release multiple repositories within the same org each time.
organization: networknt
# skip checkout if you know all latest code has been checkout in the previous build
skip_checkout: false
# skip merge if develop branch has been merged to master
skip_merge: false
# skip maven build if you know the build has been done already
skip_maven: false
# skip release if it is already done.
skip_release: true
# skip docker publish if it is done already.
skip_docker: false
# clone and switch to develop branch / checkout and pull from develop branch
checkout:
  # here we checkout master branch to publish the images. 
  - branch: develop
    repository:
    # - [email protected]:networknt/light-proxy.git
    # - [email protected]:networknt/light-router.git
    # - [email protected]:networknt/light-oauth2.git
    - [email protected]:networknt/light-codegen.git
    - [email protected]:networknt/light-docker.git
# merge develop to master for above repos
merge:
  # - light-proxy
  # - light-router
  # - light-oauth2
  - light-codegen
  - light-docker
# maven build
maven:
  # - light-proxy
  # - light-router
  # - light-oauth2
  - light-codegen

# update changelog in master, merge it to develop and publish to github.com
release:
  # - light-proxy
  # - light-router
  # - light-oauth2
  # - light-codegen

# build docker image and push to docker hub
docker:
  # - light-proxy
  # - light-router
  - light-docker/light-codegen
  # - light-oauth2/authorize
  # - light-oauth2/client
  # - light-oauth2/code
  # - light-oauth2/key
  # - light-oauth2/refresh-token
  # - light-oauth2/service
  # - light-oauth2/token
  # - light-oauth2/user

As you can see the version has been changed to 1.5.20

Command Line

Now go to the parent folder and execute run.sh

cd light-config-test/light-bot/release-docker/release-codegen
./run.sh

As this is only one image, it will take several minutes to release it.

Release CDC Images

During the entire release cycle we have some infrastructure services up and running to support the local build. Two of them are light-eventuate-4j and light-tram-4j cdc servers. There servers are deployed as docker images but we have to shutdown the docker-compose before create the new docker images.

Here is the docker containers running during thet release.

 docker ps
CONTAINER ID        IMAGE                                  COMMAND                  CREATED             STATUS              PORTS                                                      NAMES
3630a5df235e        networknt/tram-cdcserver:latest        "/bin/sh -c 'java -D…"   16 hours ago        Up 16 hours                                                                    lightdocker_tram-cdcserver_1
7ed60015bd59        networknt/eventuate-cdcserver:latest   "/bin/sh -c 'java -D…"   16 hours ago        Up 16 hours                                                                    lightdocker_eventuate-cdcserver_1
02095c08c2e2        networknt/kafka:latest                 "/bin/sh -c ./run-ka…"   16 hours ago        Up 16 hours         0.0.0.0:9092->9092/tcp                                     lightdocker_kafka_1
b4b2fd840a27        networknt/zookeeper:latest             "/docker-entrypoint.…"   16 hours ago        Up 16 hours         0.0.0.0:2181->2181/tcp, 0.0.0.0:2888->2888/tcp, 3888/tcp   lightdocker_zookeeper_1
8f21e0d4a152        redis                                  "docker-entrypoint.s…"   16 hours ago        Up 16 hours         0.0.0.0:6379->6379/tcp                                     lightdocker_redis_1
3d6b7f6201bd        networknt/mysql                        "docker-entrypoint.s…"   16 hours ago        Up 16 hours         0.0.0.0:3306->3306/tcp, 33060/tcp                          lightdocker_mysql_1
daf8d896f0a8        arangodb/arangodb:latest               "/entrypoint.sh aran…"   16 hours ago        Up 16 hours         0.0.0.0:8529->8529/tcp                                     lightdocker_arango_1

The following commands are used to shutdown down from light-docker folder.

docker-compose -f docker-compose-cdcserver-for-tram.yml down
docker-compose -f docker-compose-integration-test.yml down

User docker ps to check if all contains are down.

Release Number

Like other docker releases, we need to update the release number first in the release-docker.yml config file. It is located at the following folder.

light-config-test/light-bot/release-docker/release-cdc/config

Here is the updated file with release number 1.5.20

# Workspace that is used for this operation. Most of time, this is done on local.
workspace: releasedocker
# new upgraded version. This needs to be changed for every release.
version: 1.5.20
# github organization as the token is bound to the org in changelog generator. This
# means that you can only release multiple repositories within the same org each time.
organization: networknt
# skip checkout if you know all latest code has been checkout in the previous build
skip_checkout: true
# skip merge if develop branch has been merged to master
skip_merge: true
# skip maven build if you know the build has been done already
skip_maven: true
# skip release if it is already done.
skip_release: true
# skip docker publish if it is done already.
skip_docker: false
# clone and switch to develop branch / checkout and pull from develop branch
checkout:
  # here we checkout master branch to publish the images. 
  - branch: develop
    repository:
    # - [email protected]:networknt/light-proxy.git
    # - [email protected]:networknt/light-router.git
    # - [email protected]:networknt/light-oauth2.git
    # - [email protected]:networknt/light-tokenization.git
    # - [email protected]:networknt/light-portal.git
    # - [email protected]:networknt/light-eventuate-4j.git
    # - [email protected]:networknt/light-tram-4j.git
    # - [email protected]:networknt/light-example-4j.git
    # - [email protected]:lightapi/tokenization.git
    # - [email protected]:networknt/light-codegen.git
    # - [email protected]:networknt/light-docker.git
# merge develop to master for above repos
merge:
  # - light-proxy
  # - light-router
  # - light-oauth2
  # - light-tokenization
  # - light-portal
  - light-eventuate-4j
  - light-tram-4j
  # - tokenization
  # - light-example-4j
  # - light-codegen
  # - light-docker
# maven build
maven:
  # - light-proxy
  # - light-router
  # - light-oauth2
  # - light-tokenization
  # - light-portal
  # - light-eventuate-4j
  # - light-tram-4j
  # - light-example-4j/discovery/api_a/kubernetes
  # - light-example-4j/discovery/api_b/kubernetes
  # - light-example-4j/discovery/api_c/kubernetes
  # - light-example-4j/discovery/api_d/kubernetes
  # - tokenization
  # - light-codegen

# update changelog in master, merge it to develop and publish to github.com
# please note that light-eventuate-4j and light-tram-4j are released in release-maven task.
release:
  # - light-proxy
  # - light-router
  # - light-oauth2
  # - light-tokenization
  # - light-portal
  # - tokenization
  # - light-codegen

# build docker image and push to docker hub
docker:
  # - light-proxy
  # - light-router
  # - light-oauth2/authorize
  # - light-oauth2/client
  # - light-oauth2/code
  # - light-oauth2/key
  # - light-oauth2/refresh-token
  # - light-oauth2/service
  # - light-oauth2/token
  # - light-oauth2/user
  # - light-tokenization
  # - light-portal/hybrid-command
  # - light-portal/hybrid-query
  # - light-example-4j/discovery/api_a/kubernetes
  # - light-example-4j/discovery/api_b/kubernetes
  # - light-example-4j/discovery/api_c/kubernetes
  # - light-example-4j/discovery/api_d/kubernetes
  # need to shutdown docker-compose-integration-test.yml before building the following two images.
  - light-eventuate-4j/eventuate-cdc-server
  - light-tram-4j/tram-cdc-mysql-server
  # - tokenization
  # - light-docker/light-codegen

Command Line

cd light-config-test/light-bot/release-docker/release-cdc
./run.sh

It will take a few minutes to get two images released.

Upgrade Version

Once everything is released, we need to update the develop branch for each repositories to the next development version. To do that go to the following location.

light-config-test/light-bot/version-upgrade/upgrade-all

Here is the updated config file with version upgraded from 1.2.20 to 1.2.21. You need to change three places for the github comment, old version number and new version number. Here is the updated config file.

# Workspace that is used for this operation. Most of time, this is done on local.
workspace: versionupgrade
# git commit comment for this task
comment: 'upgrade to version 1.5.21'
# old existing version that need to be upgraded
old_version: 1.5.20
# new upgraded version. These two versions need to be updated every time to run this command
new_version: 1.5.21
# only skip the checkout if you are sure that the latest code is in the workspace. It is
# OK to execute it several times.
skip_checkout: false
# skip maven version upgrade. It should not be skip if you haven't run it yet. It is OK
# to execute it several times.
skip_maven: false
# skip the regular expression match and replace. It is safe to run it multiple times.
skip_version: false
# skip checkin if you want to review the changes before checking in to github.
skip_checkin: false
# clone and switch to develop branch / checkout and pull from develop branch
checkout:
  - branch: develop
    repository:
    - [email protected]:networknt/light-4j.git
    - [email protected]:networknt/json-overlay.git
    - [email protected]:networknt/openapi-parser.git
    - [email protected]:networknt/light-rest-4j.git
    - [email protected]:networknt/light-graphql-4j.git
    - [email protected]:networknt/light-hybrid-4j.git
    - [email protected]:networknt/light-codegen.git
    - [email protected]:networknt/light-eventuate-4j.git
    - [email protected]:networknt/light-tram-4j.git
    - [email protected]:networknt/light-saga-4j.git
    - [email protected]:networknt/light-session-4j.git
    - [email protected]:networknt/light-spa-4j.git
    - [email protected]:networknt/light-proxy.git
    - [email protected]:networknt/light-router.git
    - [email protected]:networknt/light-oauth2.git
    - [email protected]:networknt/light-tokenization.git
    - [email protected]:networknt/light-portal.git
    - [email protected]:networknt/light-example-4j.git
    - [email protected]:networknt/light-docker.git
    - [email protected]:networknt/light-consumer-4j.git
    - [email protected]:networknt/light-config-server.git
    - [email protected]:networknt/http2client-benchmark.git
    - [email protected]:networknt/microservices-framework-benchmark.git

# run mvn versions:set command in the following folders.
maven:
  - light-4j
  - json-overlay
  - openapi-parser
  - light-rest-4j
  - light-graphql-4j
  - light-hybrid-4j
  - light-codegen
  - light-eventuate-4j
  - light-tram-4j
  - light-saga-4j
  - light-session-4j
  - light-spa-4j
  - light-proxy
  - light-router
  - light-oauth2
  - light-tokenization
  - light-consumer-4j
  - light-config-server
  - light-portal/hybrid-command
  - light-portal/hybrid-query
# regex replacement for dependencies
version:
  json-overlay:
  - path: pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  openapi-parser:
  - path: pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: pom.xml
    match: <version.json-overlay>\d*\.\d*\.\d*</version.json-overlay>
  light-rest-4j:
  - path: pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: pom.xml
    match: <version.json-overlay>\d*\.\d*\.\d*</version.json-overlay>
  - path: pom.xml
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>
  light-graphql-4j:
  - path: pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  light-hybrid-4j:
  - path: pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  light-codegen:
  - path: pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: pom.xml
    match: <version.json-overlay>\d*\.\d*\.\d*</version.json-overlay>
  - path: pom.xml
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>
  - path: light-graphql-4j/src/main/resources/templates/graphql/pom.xml.rocker.raw
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: light-hybrid-4j/src/main/resources/templates/hybrid/server/pom.xml.rocker.raw
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: light-hybrid-4j/src/main/resources/templates/hybrid/service/pom.xml.rocker.raw
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: light-rest-4j/src/main/resources/templates/rest/openapi/pom.xml.rocker.raw
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: light-rest-4j/src/main/resources/templates/rest/openapi/pom.xml.rocker.raw
    match: <version.json-overlay>\d*\.\d*\.\d*</version.json-overlay>
  - path: light-rest-4j/src/main/resources/templates/rest/openapi/pom.xml.rocker.raw
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>
  - path: light-rest-4j/src/main/resources/templates/rest/swagger/pom.xml.rocker.raw
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  light-eventuate-4j:
  - path: pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  light-tram-4j:
  - path: pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  light-saga-4j:
  - path: pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  light-session-4j:
  - path: pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  light-spa-4j:
  - path: pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  light-proxy:
  - path: pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: pom.xml
    match: <version.json-overlay>\d*\.\d*\.\d*</version.json-overlay>
  - path: pom.xml
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>
  light-router:
  - path: pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: pom.xml
    match: <version.json-overlay>\d*\.\d*\.\d*</version.json-overlay>
  - path: pom.xml
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>
  light-oauth2:
  - path: pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: pom.xml
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>
  light-tokenization:
  - path: pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: pom.xml
    match: <version.json-overlay>\d*\.\d*\.\d*</version.json-overlay>
  - path: pom.xml
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>
  light-consumer-4j:
  - path: pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  light-config-server:
  - path: pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: pom.xml
    match: <version.json-overlay>\d*\.\d*\.\d*</version.json-overlay>
  - path: pom.xml
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>
  light-portal:
  - path: pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: api-certification/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: host-menu/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: host-menu/hybrid-command/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: host-menu/hybrid-query/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: oauth-playground/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: schema-form/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: schema-form/hybrid-command/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: schema-form/hybrid-query/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: user-management/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: user-management/common/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: user-management/command/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: user-management/query/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: user-management/hybrid-command/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: user-management/hybrid-query/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: hybrid-command/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: hybrid-query/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>

  light-example-4j:
  # eventuate framework examples
  # eventuate account management
  - path: eventuate/account-management/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  # eventuate todolist
  - path: eventuate/todo-list/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: eventuate/todo-list/rest-command/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: eventuate/todo-list/hybrid-command/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: eventuate/todo-list/rest-query/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: eventuate/todo-list/hybrid-query/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>

  # discovery
  # discovery api_a
  - path: discovery/api_a/consul-tls/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_a/http-health/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_a/consul/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_a/consuldocker/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_a/dynamic/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_a/generated/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_a/multiple/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_a/static/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_a/tag/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_a/token/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_a/kubernetes/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  # discovery api_b
  - path: discovery/api_b/consul-tls/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_b/http-health/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_b/consul/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_b/consuldocker/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_b/dynamic/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_b/generated/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_b/multiple/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_b/static/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_b/tag/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_b/token/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_b/kubernetes/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  # discovery api_c
  - path: discovery/api_c/consul-tls/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_c/http-health/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_c/consul/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_c/consuldocker/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_c/dynamic/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_c/generated/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_c/multiple/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_c/static/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_c/tag/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_c/token/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_c/kubernetes/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  # discovery api_d
  - path: discovery/api_d/consul-tls/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_d/http-health/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_d/consul/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_d/consuldocker/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_d/dynamic/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_d/generated/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_d/multiple/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_d/static/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_d/tag/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_d/token/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: discovery/api_d/kubernetes/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>

  # multidb
  - path: common/multidb/generated/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: common/multidb/generated/pom.xml
    match: <version.json-overlay>\d*\.\d*\.\d*</version.json-overlay>
  - path: common/multidb/generated/pom.xml
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>
  - path: common/multidb/dbconfig/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: common/multidb/dbconfig/pom.xml
    match: <version.json-overlay>\d*\.\d*\.\d*</version.json-overlay>
  - path: common/multidb/dbconfig/pom.xml
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>
  # router-demo
  - path: spa/react-stateless/router-demo/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: spa/react-stateless/router-demo/pom.xml
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>
  # secspa
  - path: graphql/secspa/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>


  # graphql framework
  # graphql subscription
  - path: graphql/subscription/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  # graphql helloworld
  - path: graphql/helloworld/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  # graphql mutation-idl
  - path: graphql/mutation-idl/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  # graphql relaytodo
  - path: graphql/relaytodo/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  # graphql mutation
  - path: graphql/mutation/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  # graphql starwars
  - path: graphql/starwars/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  # graphql secspa
  - path: graphql/secspa/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>

  # light-tram-4j framework
  # tram todolist
  - path: tram/light-tram-todolist/multi-module/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: tram/light-tram-todolist/multi-module/pom.xml
    match: <version.json-overlay>\d*\.\d*\.\d*</version.json-overlay>
  - path: tram/light-tram-todolist/multi-module/pom.xml
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>
  # tram todolist command
  - path: tram/light-tram-todolist/multi-module/tram-todo-command/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: tram/light-tram-todolist/multi-module/tram-todo-command/pom.xml
    match: <version.json-overlay>\d*\.\d*\.\d*</version.json-overlay>
  - path: tram/light-tram-todolist/multi-module/tram-todo-command/pom.xml
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>
  # tram todolist view
  - path: tram/light-tram-todolist/multi-module/tram-todo-view/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: tram/light-tram-todolist/multi-module/tram-todo-view/pom.xml
    match: <version.json-overlay>\d*\.\d*\.\d*</version.json-overlay>
  - path: tram/light-tram-todolist/multi-module/tram-todo-view/pom.xml
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>
  # tram todolist single module
  - path: tram/light-tram-todolist/single-module/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: tram/light-tram-todolist/single-module/pom.xml
    match: <version.json-overlay>\d*\.\d*\.\d*</version.json-overlay>
  - path: tram/light-tram-todolist/single-module/pom.xml
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>

  # light-saga-4j framework
  # saga customers orders
  - path: saga/light-saga-cutomers-and-orders/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: saga/light-saga-cutomers-and-orders/pom.xml
    match: <version.json-overlay>\d*\.\d*\.\d*</version.json-overlay>
  - path: saga/light-saga-cutomers-and-orders/pom.xml
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>
  # saga customers orders order service
  - path: saga/light-saga-cutomers-and-orders/order-service/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: saga/light-saga-cutomers-and-orders/order-service/pom.xml
    match: <version.json-overlay>\d*\.\d*\.\d*</version.json-overlay>
  - path: saga/light-saga-cutomers-and-orders/order-service/pom.xml
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>
  # saga customers orders customer service
  - path: saga/light-saga-cutomers-and-orders/customer-service/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: saga/light-saga-cutomers-and-orders/customer-service/pom.xml
    match: <version.json-overlay>\d*\.\d*\.\d*</version.json-overlay>
  - path: saga/light-saga-cutomers-and-orders/customer-service/pom.xml
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>

  # light-rest-4j framework
  # swagger
  # proxy-backend
  - path: rest/swagger/proxy-backend/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  # petstore
  - path: rest/swagger/petstore/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  # ms-chain
  - path: rest/swagger/ms_chain/api_a/generated/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/swagger/ms_chain/api_a/metrics/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/swagger/ms_chain/api_a/httpschain/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/swagger/ms_chain/api_a/security/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/swagger/ms_chain/api_a/httpchain/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>

  - path: rest/swagger/ms_chain/api_b/generated/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/swagger/ms_chain/api_b/metrics/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/swagger/ms_chain/api_b/httpschain/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/swagger/ms_chain/api_b/security/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/swagger/ms_chain/api_b/httpchain/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>

  - path: rest/swagger/ms_chain/api_c/generated/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/swagger/ms_chain/api_c/metrics/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/swagger/ms_chain/api_c/httpschain/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/swagger/ms_chain/api_c/security/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/swagger/ms_chain/api_c/httpchain/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>

  - path: rest/swagger/ms_chain/api_d/generated/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/swagger/ms_chain/api_d/metrics/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/swagger/ms_chain/api_d/httpschain/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/swagger/ms_chain/api_d/security/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/swagger/ms_chain/api_d/httpchain/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  # database
  - path: rest/swagger/database/generated/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/swagger/database/connection/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/swagger/database/oracle/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/swagger/database/postgres/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/swagger/database/queries/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/swagger/database/query/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/swagger/database/test/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/swagger/database/updates/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>

  # openapi
  - path: rest/openapi/proxy-backend/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/openapi/proxy-backend/pom.xml
    match: <version.json-overlay>\d*\.\d*\.\d*</version.json-overlay>
  - path: rest/openapi/proxy-backend/pom.xml
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>

  - path: rest/openapi/cors/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/openapi/cors/pom.xml
    match: <version.json-overlay>\d*\.\d*\.\d*</version.json-overlay>
  - path: rest/openapi/cors/pom.xml
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>

  - path: rest/openapi/petstore/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/openapi/petstore/pom.xml
    match: <version.json-overlay>\d*\.\d*\.\d*</version.json-overlay>
  - path: rest/openapi/petstore/pom.xml
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>

  - path: rest/openapi/ms-aggregate/aa/generated/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/openapi/ms-aggregate/aa/generated/pom.xml
    match: <version.json-overlay>\d*\.\d*\.\d*</version.json-overlay>
  - path: rest/openapi/ms-aggregate/aa/generated/pom.xml
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>
  - path: rest/openapi/ms-aggregate/ab/generated/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/openapi/ms-aggregate/ab/generated/pom.xml
    match: <version.json-overlay>\d*\.\d*\.\d*</version.json-overlay>
  - path: rest/openapi/ms-aggregate/ab/generated/pom.xml
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>
  - path: rest/openapi/ms-aggregate/ac/generated/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/openapi/ms-aggregate/ac/generated/pom.xml
    match: <version.json-overlay>\d*\.\d*\.\d*</version.json-overlay>
  - path: rest/openapi/ms-aggregate/ac/generated/pom.xml
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>
  - path: rest/openapi/ms-aggregate/ad/generated/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/openapi/ms-aggregate/ad/generated/pom.xml
    match: <version.json-overlay>\d*\.\d*\.\d*</version.json-overlay>
  - path: rest/openapi/ms-aggregate/ad/generated/pom.xml
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>

  - path: rest/openapi/ms-aggregate/aa/https/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/openapi/ms-aggregate/aa/https/pom.xml
    match: <version.json-overlay>\d*\.\d*\.\d*</version.json-overlay>
  - path: rest/openapi/ms-aggregate/aa/https/pom.xml
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>
  - path: rest/openapi/ms-aggregate/ab/https/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/openapi/ms-aggregate/ab/https/pom.xml
    match: <version.json-overlay>\d*\.\d*\.\d*</version.json-overlay>
  - path: rest/openapi/ms-aggregate/ab/https/pom.xml
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>
  - path: rest/openapi/ms-aggregate/ac/https/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/openapi/ms-aggregate/ac/https/pom.xml
    match: <version.json-overlay>\d*\.\d*\.\d*</version.json-overlay>
  - path: rest/openapi/ms-aggregate/ac/https/pom.xml
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>
  - path: rest/openapi/ms-aggregate/ad/https/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: rest/openapi/ms-aggregate/ad/https/pom.xml
    match: <version.json-overlay>\d*\.\d*\.\d*</version.json-overlay>
  - path: rest/openapi/ms-aggregate/ad/https/pom.xml
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>


  # client
  - path: client/standalone/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>

  - path: client/tomcat/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>

  - path: client/tableau/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>


  # webserver
  - path: webserver/api-simple-web/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>

  # middleware-performance
  - path: middleware-performance/service-config/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: middleware-performance/service-config/pom.xml
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>

  - path: middleware-performance/endpoint-individual/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: middleware-performance/endpoint-individual/pom.xml
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>

  - path: middleware-performance/endpoint-source/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: middleware-performance/endpoint-source/pom.xml
    match: <version.openapi-parser>\d*\.\d*\.\d*</version.openapi-parser>
  

  # http2client-benchmark
  http2client-benchmark:
  - path: httpserver/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>
  - path: lightclient/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>

  # microservices-framework-benchmark
  microservices-framework-benchmark:
  - path: light-4j/pom.xml
    match: <version.light[a-z-]+4j>\d*\.\d*\.\d*</version.light[a-z-]+4j>

The file is very long as we have numeric projects in light-example-4j that need to be upgraded to the new release number.

Once the file is updated, we can run the command line.

cd light-config-test/light-bot/version-upgrade/upgrade-all
./run.sh

It takes several minutes to upgrade all projects in networknt and push the develop branches to github.

Checkout

In the previous step, we have upgraded develop branches for all repositories in github. If you are a platform develop, you might need to consider to checkout all the develop branches for each repo to your workspace. I am using networknt under my home directory as my workspace and there is a light-bot config available to checkout every projects in one short. It will pull the latest develop branch if the repository is in the workspace already. Or clone it if it doesn’t exist.

To checkout all repositories into networknt workspace.

cd light-config-test/light-bot/checkout/checkout-all
./run.sh

There is no need to update the config file for this task as there is no version in the config.

If there are multiple developers are working on these projects, you should run the checkout task at least very morning or even several times per day to ensure that you are always working on the latest codebase.

Build and Test

Now we have the new develop version checked out into the workspace, we can build and run the integration test on this new version and this process can be repeated several times per day if necessary. It should be done on a build server but it is OK to run it on you local especially after new release.

Before running the build and test locally, we need to start all the infrastructure services that are supporting the build and integration test. You need to ensure that you have light-docker repository checked out into your workspace.

cd light-docker
docker-compose -f docker-compose-integration-test.yml up -d

After several minutes, start the docker-compose-cdcserver-for-tram.yml file. It should be in the integration-test YAML but there is a bug in tram cdcserver that need Kafka and Zookeeper to be up and running before starting it.

docker-compose -f docker-compose-cdcserver-for-tram.yml up -d

Now go to the following folder and run the command.

cd light-config-test/light-bot/develop-build/build-test-all
./run.sh

This will take a while to get everything built and tested. You can repeat this process daily or even more time automatically.

Summary

As you can see the entire process is just updating the config file and run several commands. All the config files mentioned in this tutorial are for networknt organization release. If you have microservices scattered into multiple repositories or even multiple organizations, you just need to update the config files and can follow the same process for release.

As light-bot is built on top of light-4j framework, all tasks are built as plugins that is wired in service.yml config file. That means it is very easy to be extended to meet your specific requirement.

Along with the release pipeline, there are other tools/pipelines to support shifting DevOps to the left. The integation for micorservices should be started the first endpoint is developed, not when you complete the entire service.

  • About Light
    • Overview
    • Testimonials
    • What is Light
    • Features
    • Principles
    • Benefits
    • Roadmap
    • Community
    • Articles
    • Videos
    • License
    • Why Light Platform
  • Getting Started
    • Get Started Overview
    • Environment
    • Light Codegen Tool
    • Light Rest 4j
    • Light Tram 4j
    • Light Graphql 4j
    • Light Hybrid 4j
    • Light Eventuate 4j
    • Light Oauth2
    • Light Portal Service
    • Light Proxy Server
    • Light Router Server
    • Light Config Server
    • Light Saga 4j
    • Light Session 4j
    • Webserver
    • Websocket
    • Spring Boot Servlet
  • Architecture
    • Architecture Overview
    • API Category
    • API Gateway
    • Architecture Patterns
    • CQRS
    • Eco System
    • Event Sourcing
    • Fail Fast vs Fail Slow
    • Integration Patterns
    • JavaEE declining
    • Key Distribution
    • Microservices Architecture
    • Microservices Monitoring
    • Microservices Security
    • Microservices Traceability
    • Modular Monolith
    • Platform Ecosystem
    • Plugin Architecture
    • Scalability and Performance
    • Serverless
    • Service Collaboration
    • Service Mesh
    • SOA
    • Spring is bloated
    • Stages of API Adoption
    • Transaction Management
    • Microservices Cross-cutting Concerns Options
    • Service Mesh Plus
    • Service Discovery
  • Design
    • Design Overview
    • Design First vs Code First
    • Desgin Pattern
    • Service Evolution
    • Consumer Contract and Consumer Driven Contract
    • Handling Partial Failure
    • Idempotency
    • Server Life Cycle
    • Environment Segregation
    • Database
    • Decomposition Patterns
    • Http2
    • Test Driven
    • Multi-Tenancy
    • Why check token expiration
    • WebServices to Microservices
  • Cross-Cutting Concerns
    • Concerns Overview
  • API Styles
    • Light-4j for absolute performance
    • Style Overview
    • Distributed session on IMDG
    • Hybrid Serverless Modularized Monolithic
    • Kafka - Event Sourcing and CQRS
    • REST - Representational state transfer
    • Web Server with Light
    • Websocket with Light
    • Spring Boot Integration
    • Single Page Application
    • GraphQL - A query language for your API
    • Light IBM MQ
    • Light AWS Lambda
    • Chaos Monkey
  • Infrastructure Services
    • Service Overview
    • Light Proxy
    • Light Mesh
    • Light Router
    • Light Portal
    • Messaging Infrastructure
    • Centralized Logging
    • COVID-19
    • Light OAuth2
    • Metrics and Alerts
    • Config Server
    • Tokenization
    • Light Controller
  • Tool Chain
    • Tool Chain Overview
  • Utility Library
  • Service Consumer
    • Service Consumer
  • Development
    • Development Overview
  • Deployment
    • Deployment Overview
    • Frontend Backend
    • Linux Service
    • Windows Service
    • Install Eventuate on Windows
    • Secure API
    • Client vs light-router
    • Memory Limit
    • Deploy to Kubernetes
  • Benchmark
    • Benchmark Overview
  • Tutorial
    • Tutorial Overview
  • Troubleshooting
    • Troubleshoot
  • FAQ
    • FAQ Overview
  • Milestones
  • Contribute
    • Contribute to Light
    • Development
    • Documentation
    • Example
    • Tutorial
“Light Release” was last updated: July 5, 2021: fixes #275 checked and corrected grammar/spelling for majority of pages (#276) (b3bbb7b)
Improve this page
  • News
  • Docs
  • Community
  • Reddit
  • GitHub
  • About Light
  • Getting Started
  • Architecture
  • Design
  • Cross-Cutting Concerns
  • API Styles
  • Infrastructure Services
  • Tool Chain
  • Utility Library
  • Service Consumer
  • Development
  • Deployment
  • Benchmark
  • Tutorial
  • Troubleshooting
  • FAQ
  • Milestones
  • Contribute