- Overview
- Version Calculation
- Branch Matching Strategy
- Usage
- Plugin Extension Properties
- Plugin Tasks
- Using with CI/CD
A Mill plugin with a flexible approach to generating versions, typically for use within a Mill project. It supports running under Github Actions and Jenkins*.
It comes bundled with a single Version Calculator that implements a Git target branch calculator: the version of the current branch is based on the latest version of the branch it targets, eg develop is branched from main, thus the version of develop is based on the current version of main.
The GitTargetBranchVersionCalculator includes two VersionCalculatorStrategys:
-
Flow - broadly based on a Git Flow workflow without release branches, the following branches are supported (configurable):
branch pre release label target branch calculated version mainmain 1.2.3 developbeta main 1.2.4-beta.13 feature/mycool_feature[derived from the branch name] develop 1.2.5-mycool_feature.1 hotfix/badthingsrc main 1.2.4-rc.2 -
Flat - ideal for simpler projects without an integration branch such as
develop:branch pre release label target branch example mainmain 1.2.3 xxx[derived from the branch name] main 1.2.4-xxx.13
TODO: Custom VersionCalculatorStrategy can be configured eg. to match your specific branch naming convention.
TODO: The Flow strategy is automatically selected if a develop branch is present, otherwise the Flat strategy is selected.
The Calculator can be selected by overriding the versionCalculatorStrategy function in your GitSemVerVersionCalculatorModule, see Usage.
The semver is calculated primarily based on:
- the version of the target branch
- the current branch
- the branchMatching strategy
A Strategy contains a list of BranchMatchingConfiguration instances which are applied in order until the first match (regex applied to branch name) is reached, it contains the following properties:
- branch name regex
- target branch
- version modifier: modifies the major, minor or patch components of the semver
- version qualifier: optionally qualifies the semver with a prerelease label and build metadata
The VersionModifier can be set for every BranchMatchingConfiguration instance in the strategy with a property, see Plugin Extension Properties.
object versionCalculator extends GitSemVerVersionCalculatorModule {
override def versionCalculatorStrategy = flowVersionCalculatorStrategy()
override val initialVersion: String = "0.0.1"
// cached calculated version
def calculatedVersion: Target[String] = T { calculateVersion() }
}
trait MyPublishModule extends ArtifactoryPublishModule {
def publishVersion = versionCalculator.calculatedVersion()
}Using a custom Strategy:
TODO
initialVersion: Stringspecify an initial version for new repositoriesoverrideVersion: Option[String]specifies a version to use and override the dynamic calculation, defaults to None, use-D semver.override=1.2.3versionFileName: Stringspecifies the filename for writing the version to, defaults torelease.txttagPrefix: Stringspecifies the prefix to apply to the version to construct a tag name, defaults tovmodifier: Stringspecifies which component of the SemVer to rev, defaults topatch, use-D semver.modifier=major|minor|patch
calculateVersion()calculate the current versionwriteVersionFile()will generate./release.txtcontaining the raw version, useful for integrating with other GHA steps
Make sure to check out all branches & tags, eg. with the checkout GHA action by specifying the fetch-depth: 0:
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
Jenkins is a bit more involved and context specific but broadly one needs to:
- git fetch --tags
- git fetch "https://github.com/org/repo" +refs/heads/main:refs/remotes/origin/main (or whatever other missing target branches you might need)