114 lines
4.5 KiB
Groovy
114 lines
4.5 KiB
Groovy
pipeline {
|
|
agent any
|
|
|
|
environment {
|
|
GIT_AUTHOR_NAME = 'Jenkins Bot'
|
|
GIT_AUTHOR_EMAIL = 'jenkins@alidavid.hu'
|
|
}
|
|
|
|
stages {
|
|
// =========================================================
|
|
// ETAP 1: DEVELOP (Testy i Merge)
|
|
// =========================================================
|
|
stage('CI: Test & Merge (Develop)') {
|
|
when {
|
|
branch 'develop'
|
|
}
|
|
steps {
|
|
// 1. Uruchomienie Testów
|
|
script {
|
|
echo '--- [DEVELOP] 1. Uruchamianie testów E2E ---'
|
|
sh 'docker compose -f docker-compose.test.yml down -v || true'
|
|
sh 'docker compose -f docker-compose.test.yml up --build --abort-on-container-exit --exit-code-from cypress'
|
|
}
|
|
|
|
// 2. Scalanie (Bez zmiany wersji!)
|
|
sshagent(credentials: ['gitea-ssh-key']) {
|
|
script {
|
|
echo '--- [DEVELOP] 2. Testy OK. Scalanie do Main ---'
|
|
|
|
sh "git config user.name '${GIT_AUTHOR_NAME}'"
|
|
sh "git config user.email '${GIT_AUTHOR_EMAIL}'"
|
|
|
|
// Pobieramy main, scalamy i wysyłamy
|
|
sh 'git fetch origin main'
|
|
sh 'git checkout main'
|
|
sh 'git pull origin main'
|
|
|
|
sh 'git merge origin/develop --no-ff -m "Release: Merge develop to main"'
|
|
|
|
// To uruchomi pipeline na branchu MAIN
|
|
sh 'GIT_SSH_COMMAND="ssh -o StrictHostKeyChecking=no" git push origin main'
|
|
}
|
|
}
|
|
}
|
|
post {
|
|
always {
|
|
echo '--- [DEVELOP] Sprzątanie ---'
|
|
sh 'docker compose -f docker-compose.test.yml down -v'
|
|
}
|
|
}
|
|
}
|
|
|
|
// =========================================================
|
|
// ETAP 2: MAIN (Weryfikacja wersji i Publikacja w Dockerze)
|
|
// =========================================================
|
|
stage('CD: Publish to NPM (Main)') {
|
|
when {
|
|
branch 'main'
|
|
}
|
|
steps {
|
|
withCredentials([string(credentialsId: 'npm-token', variable: 'NPM_TOKEN')]) {
|
|
script {
|
|
echo '--- [MAIN] Start procedury publikacji ---'
|
|
|
|
// 1. Pobierz wersję używając grep i cut (działa bez Node.js na hoście)
|
|
// Szuka linii "version": "x.x.x", wycina 4. pole (wersję)
|
|
def localVersion = sh(script: "grep '\"version\":' package.json | cut -d\\\" -f4", returnStdout: true).trim()
|
|
echo "Lokalna wersja w package.json: ${localVersion}"
|
|
|
|
// 2. Przygotuj środowisko w kontenerze
|
|
// Tworzymy plik .npmrc lokalnie
|
|
sh 'echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" > .npmrc'
|
|
|
|
// WAŻNE: Przebudowujemy obraz 'app', aby wciągnął .npmrc i aktualny kod do środka
|
|
// (Rozwiązuje to problem montowania plików w Docker-outside-of-Docker)
|
|
sh 'docker compose -f docker-compose.test.yml build app'
|
|
|
|
// 3. Sprawdź wersję w NPM (używając kontenera z Node)
|
|
def versionExists = false
|
|
try {
|
|
// Uruchamiamy npm view wewnątrz kontenera
|
|
// Jeśli wersja nie istnieje, npm zwróci błąd (exit 1), który złapiemy
|
|
sh "docker compose -f docker-compose.test.yml run --rm app npm view wc-timer@${localVersion} version"
|
|
versionExists = true
|
|
} catch (err) {
|
|
versionExists = false
|
|
}
|
|
|
|
// 4. Decyzja
|
|
if (versionExists) {
|
|
echo "❌ BŁĄD: Wersja ${localVersion} jest już opublikowana w NPM!"
|
|
error("Przerwano publikację: Wersja ${localVersion} już istnieje.")
|
|
} else {
|
|
echo "🚀 Wersja ${localVersion} jest nowa. Publikuję z kontenera..."
|
|
|
|
// Publikacja z wewnątrz kontenera
|
|
sh 'docker compose -f docker-compose.test.yml run --rm app npm publish --access public'
|
|
|
|
echo "✅ SUKCES: Wersja ${localVersion} została opublikowana."
|
|
}
|
|
}
|
|
}
|
|
}
|
|
post {
|
|
always {
|
|
echo '--- [MAIN] Sprzątanie ---'
|
|
sh 'rm -f .npmrc'
|
|
// Czyścimy też obrazy dockerowe po publikacji
|
|
sh 'docker compose -f docker-compose.test.yml down -v --rmi local'
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |