freeleaps-ops/first-class-pipeline/src/com/freeleaps/devops/SemanticReleasingExecutor.groovy

67 lines
2.8 KiB
Groovy
Raw Normal View History

package com.freeleaps.devops
class SemanticReleasingExecutor {
def steps
def workspace
def config
def plugins = [
'semantic-release',
'@semantic-release/git',
'@semantic-release/changelog',
'@semantic-release/exec',
'conventional-changelog-conventionalcommits'
]
SemanticReleasingExecutor(steps, workspace) {
this.steps = steps
this.workspace = workspace
// TODO: This should be a parameter, not hardcoded
this.config = 'com/freeleaps/devops/builtins/semantic-release/releaserc.json'
}
def release(credentialsId, branch) {
steps.log.warn("SemanticReleasingExecutor", "Configuration file customization is not supported yet, using builtin release rules as fallback")
steps.log.info("SemanticReleasingExecutor", "Releasing with config: ${config}")
steps.dir(steps.env.workroot) {
steps.withCredentials([steps.usernamePassword(credentialsId: credentialsId, passwordVariable: 'GIT_PASSWORD', usernameVariable: 'GIT_USERNAME')]) {
steps.env.GIT_CREDENTIALS = "${steps.env.GIT_USERNAME}:${steps.env.GIT_PASSWORD}"
steps.writeFile file: '.releaserc.json', text: steps.libraryResource(config)
steps.sh "git config --global --add safe.directory ${steps.env.workroot}"
steps.env.GIT_LOCAL_BRANCH = "${branch}"
// Store the version before semantic release
def previousVersion = ""
def versionFileExistsBefore = steps.sh(script: 'test -f "VERSION"', returnStatus: true) == 0
if (versionFileExistsBefore) {
previousVersion = steps.readFile('VERSION').trim()
steps.log.info("SemanticReleasingExecutor", "Previous version: ${previousVersion}")
}
steps.sh """
#!/bin/bash
semantic-release
"""
steps.log.info("SemanticReleasingExecutor", "Semantic release completed, read latest version from VERSION file")
// check if VERSION file exists
def versionFileExists = steps.sh(script: 'test -f "VERSION"', returnStatus: true) == 0
def released = false
if (versionFileExists) {
def currentVersion = steps.readFile('VERSION').trim()
released = !versionFileExistsBefore || (currentVersion != previousVersion)
if (released) {
steps.env.LATEST_VERSION = steps.readFile('VERSION').trim()
steps.env.SEMANTIC_RELEASED = true
steps.log.info("SemanticReleasingExecutor", "Semantic release completed, version: ${steps.env.LATEST_VERSION}")
} else {
steps.log.warn("SemanticReleasingExecutor", "No new version released, current version remains: ${currentVersion}")
}
} else {
steps.log.warn("SemanticReleasingExecutor", "VERSION file not found, semantic release may have failed ?")
}
}
}
}
}