test-ci-cd/Jenkinsfile

118 lines
5.5 KiB
Groovy
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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")
}
}
}
}
}
}