Files
wc-timer/Jenkinsfile
2026-01-05 22:31:13 +01:00

109 lines
4.4 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ę
def localVersion = sh(script: "grep '\"version\":' package.json | cut -d\\\" -f4", returnStdout: true).trim()
echo "Lokalna wersja w package.json: ${localVersion}"
// 2. Sprawdź wersję (tu używamy -w, ale bez tokenu, bo view jest publiczne)
def versionExists = false
try {
sh "docker compose -f docker-compose.test.yml run --rm -w /app/wc-timer app npm view wc-timer@${localVersion} version"
versionExists = true
} catch (err) {
versionExists = false
}
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ę..."
// 3. PUBLIKACJA "INJECTION METHOD"
// Nie montujemy pliku (-v).
// Przekazujemy token przez zmienną (-e).
// Tworzymy plik wewnątrz kontenera i publikujemy w jednej komendzie (sh -c).
sh """
docker compose -f docker-compose.test.yml run --rm \
-w /app/wc-timer \
-e NPM_TOKEN=${NPM_TOKEN} \
app \
sh -c "echo '//registry.npmjs.org/:_authToken=\${NPM_TOKEN}' > .npmrc && npm publish --access public"
"""
echo "✅ SUKCES: Wersja ${localVersion} została opublikowana."
}
}
}
}
post {
always {
echo '--- [MAIN] Sprzątanie ---'
sh 'docker compose -f docker-compose.test.yml down -v'
}
}
}
}
}