118 lines
5.5 KiB
Groovy
118 lines
5.5 KiB
Groovy
def notify(
|
||
String context,
|
||
String giteaUser,
|
||
String giteaPass,
|
||
String repositoryUrl,
|
||
String repositoryName,
|
||
String commitHash,
|
||
String buildStatus
|
||
) {
|
||
def status = buildStatus == 'success' ? 'success' : 'failure'
|
||
def description = buildStatus == 'success' ? 'Build succeeded' : 'Build failed'
|
||
|
||
sh """
|
||
curl -X POST \
|
||
-u "\${giteaUser}:\${giteaPass}" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"context":"${context}","state": "${status}", "description": "${description}"}' \
|
||
${repositoryUrl}deployer3000/${repositoryName}/statuses/${commitHash}
|
||
"""
|
||
}
|
||
|
||
pipeline {
|
||
agent any
|
||
parameters {
|
||
string(
|
||
name: 'VERSION',
|
||
description: 'Версия в формате X.Y.Z (например, 1.0.0). Оставьте пустым для автоматического определения',
|
||
trim: true
|
||
)
|
||
}
|
||
environment {
|
||
REGISTRY_NAME = 'registry.entcor/trust-module'
|
||
IMAGE_NAME = "test-ci-cd"
|
||
GITEA_REPOSITORY_URL = "http://git.entcor/api/v1/repos/"
|
||
}
|
||
stages {
|
||
stage ('Initialize variables') {
|
||
steps {
|
||
script {
|
||
// Если версия указана в параметрах - используем её
|
||
if (params.VERSION) {
|
||
env.IMAGE_TAG = params.VERSION
|
||
env.NEW_VERSION = params.VERSION
|
||
echo "Using manual version: ${params.VERSION}"
|
||
}
|
||
// Иначе пытаемся получить последнюю версию из Gitea
|
||
else {
|
||
withCredentials([usernamePassword(credentialsId: 'gitea_creds', usernameVariable: 'GITEA_USER', passwordVariable: 'GITEA_PASS')]) {
|
||
def lastVersion = sh(script: """
|
||
curl -s -u "\${GITEA_USER}:\${GITEA_PASS}" \
|
||
"${env.GITEA_REPOSITORY_URL}deployer3000/${env.IMAGE_NAME}/releases" | \
|
||
sed -n 's/.*"tag_name": *"\\([^"]*\\).*/\\1/p' | sort -V | tail -n1
|
||
""", returnStdout: true).trim()
|
||
|
||
if (!lastVersion) {
|
||
lastVersion = "0.0.0"
|
||
echo "No versions found in Gitea, using default: ${lastVersion}"
|
||
} else {
|
||
echo "Found last version in Gitea: ${lastVersion}"
|
||
}
|
||
|
||
// Инкрементим версию
|
||
def (major, minor, patch) = lastVersion.tokenize('.')
|
||
def newVersion = "${major}.${minor}.${patch.toInteger() + 1}"
|
||
env.IMAGE_TAG = newVersion
|
||
env.NEW_VERSION = newVersion
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
stage ('Build docker image') {
|
||
when {
|
||
expression { env.CHANGE_BRANCH?.startsWith('rc') }
|
||
}
|
||
steps {
|
||
script {
|
||
def image = docker.build("${env.IMAGE_NAME}:${env.IMAGE_TAG}")
|
||
sh "docker tag ${env.IMAGE_NAME}:${env.IMAGE_TAG} ${env.REGISTRY_NAME}/${env.IMAGE_NAME}:${env.IMAGE_TAG}"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
post {
|
||
success {
|
||
script {
|
||
if (env.CHANGE_BRANCH?.startsWith('rc')) {
|
||
withCredentials([usernamePassword(credentialsId: 'gitea_creds', usernameVariable: 'GITEA_USER', passwordVariable: 'GITEA_PASS')]) {
|
||
// Создаем релиз только если версия НЕ была указана вручную
|
||
if (!params.VERSION) {
|
||
sh """
|
||
curl -X POST -u "\${GITEA_USER}:\${GITEA_PASS}" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"tag_name": "${env.NEW_VERSION}", "name": "Release ${env.NEW_VERSION}", "target_commitish": "${env.GIT_COMMIT}"}' \
|
||
"${env.GITEA_REPOSITORY_URL}deployer3000/${env.IMAGE_NAME}/releases"
|
||
"""
|
||
echo "New release ${env.NEW_VERSION} created in Gitea"
|
||
}
|
||
|
||
// Остальной код (мердж PR, нотификации)
|
||
def prId = env.CHANGE_ID
|
||
sh """
|
||
curl -X POST \
|
||
-u "\${GITEA_USER}:\${GITEA_PASS}" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"do":"merge"}' \
|
||
"http://git.entcor/api/v1/repos/deployer3000/${env.IMAGE_NAME}/pulls/${prId}/merge"
|
||
"""
|
||
|
||
def context = "test-org/${env.IMAGE_NAME}/pipeline/pr-${env.CHANGE_TARGET}"
|
||
def commitHash = sh(script: "git rev-parse HEAD~1", returnStdout: true).trim()
|
||
notify(context, GITEA_USER, GITEA_PASS, env.GITEA_REPOSITORY_URL, env.IMAGE_NAME, commitHash, "success")
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
} |