Skip to content

Release hooks

axion-release-plugin supports registering custom actions to be hooked either before (pre) or after (post) the release:

scmVersion {
    hooks {
        pre {context -> ...}
        post {context -> ...}
    }
}

Implementing action for common tasks would be a waste, this is why axion-release comes bundled with two predefined actions. If you come up with some useful implementation, don't hesitate to create pull request!

fileUpdate

This action can update given file (or files) by evaluating regex pattern and replacing all matches with given replacement. Most common scenario is to update version in README:

scmVersion {
    hooks {
        pre 'fileUpdate', [file: 'README.md', pattern: {v, c -> /version: $v/}, replacement: {v, c -> "version: $v"}, encoding: 'utf-8']
    }
}

Syntax of action is simple: first comes name, then map of arguments. Supported arguments:

  • file - path to file in form of string or File instance to update
  • files - array of files, takes precedence over single file definition if not empty
  • pattern - closure that should return String pattern, arguments are previous version and context (described below)
  • replacement - closure that should return replacement, arguments are current version and context
  • encoding - the name of encoding to use during processing the specified files. By default, it uses default JVM encoding (described below)

All patterns have multiline flag switched on by default to match against content of whole file.

All files are processed using JVM encoding that by default is equal to the system's encoding, so this operation should be considered as OS-dependent. To avoid consequences of such behaviour, it's recommended to explicitly declare project's encoding through e.g. -Dfile.encoding=<encoding> flag in gradle.properties file. For individual cases, the fileUpdate.encoding can be used.

File update operation adds all changed files to set of files to commit in context, which are later processed by commit hook.

commit

Creates commit. Only files (patterns) that were added to context via HookContext#addCommitPattern get committed. Remember, that fileUpdate does it for you!:

scmVersion {
    hooks {
        pre 'fileUpdate', [...]
        pre 'commit'
    }
}

Default commit message is Release version: $version. It can be customized by passing closure that accepts current version and SCM position as arguments:

scmVersion {
   hooks {
        pre 'commit', {v, p -\> "This is my great new commit message for version $v"}
    }
}

push

Pushes all changes to the remote::

scmVersion {
    hooks {
        post 'push'
    }
}

There is no additional magic in this action. Use with care, only when you have some commits that need to be pushed for example as a post action. Remember, that push is always done during the release.

Custom action

Of course nothing can stop you from implementing own action. It can be any closure that accepts HookContext object:

scmVersion {
    hooks {
        pre {context -> /* do something important */}
    }
}

HookContext object fields and methods:

  • logger - instance of Gradle project logger
  • position - ScmPosition
  • previousVersion - version before release
  • currentVersion - released version
  • readVersion() - force reevaluation of version, returns fresh version as if called ./gradlew currentVersion command
  • commit(List patterns, String message) - force commit of given patterns with message
  • addCommitPattern(String pattern) - add pattern to commit, you can commit everything at once by adding commit hook to the chain