feature: npm publish

This commit is contained in:
David Ali
2026-01-05 22:10:12 +01:00
parent 095a6e2af4
commit 1c6d791ee2

92
Jenkinsfile vendored
View File

@@ -7,53 +7,101 @@ pipeline {
} }
stages { stages {
stage('Build & Test (E2E)') { // =========================================================
// ETAP 1: DEVELOP (Testy i Merge)
// =========================================================
stage('CI: Test & Merge (Develop)') {
when { when {
branch 'develop' branch 'develop'
} }
steps { steps {
// 1. Uruchomienie Testów
script { script {
echo '--- 1. Start środowiska testowego (pomijane na main) ---' 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 down -v || true'
sh 'docker compose -f docker-compose.test.yml up --build --abort-on-container-exit --exit-code-from cypress' sh 'docker compose -f docker-compose.test.yml up --build --abort-on-container-exit --exit-code-from cypress'
} }
}
}
stage('Merge Develop -> Main') { // 2. Scalanie (Bez zmiany wersji!)
when {
branch 'develop'
}
steps {
sshagent(credentials: ['gitea-ssh-key']) { sshagent(credentials: ['gitea-ssh-key']) {
script { script {
echo '--- 2. Testy zaliczone. Scalanie do produkcji ---' echo '--- [DEVELOP] 2. Testy OK. Scalanie do Main ---'
sh "git config user.name '${GIT_AUTHOR_NAME}'" sh "git config user.name '${GIT_AUTHOR_NAME}'"
sh "git config user.email '${GIT_AUTHOR_EMAIL}'" sh "git config user.email '${GIT_AUTHOR_EMAIL}'"
// Pobieramy main, scalamy i wysyłamy
sh 'git fetch origin main' sh 'git fetch origin main'
sh 'git fetch origin develop'
sh 'git checkout main' sh 'git checkout main'
sh 'git pull origin main' sh 'git pull origin main'
sh 'git merge origin/develop --no-ff -m "Merge branch develop into main (Jenkins CI)"'
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' 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'
}
}
} }
// Tutaj w przyszłości będzie ETAP 3: Publish to NPM
// On będzie miał warunek: when { branch 'main' }
}
post { // =========================================================
always { // ETAP 2: MAIN (Weryfikacja wersji i Publikacja)
// Sprzątanie wykonujemy tylko, jeśli testy w ogóle ruszyły // =========================================================
// Ale komenda down jest bezpieczna nawet jak nic nie działało stage('CD: Publish to NPM (Main)') {
sh 'docker compose -f docker-compose.test.yml down -v' when {
branch 'main'
}
steps {
withCredentials([string(credentialsId: 'npm-token', variable: 'NPM_TOKEN')]) {
script {
echo '--- [MAIN] Start procedury publikacji ---'
// 1. Pobierz wersję lokalną (tę, którą wpisałeś ręcznie)
def localVersion = sh(script: "node -p \"require('./package.json').version\"", returnStdout: true).trim()
echo "Lokana wersja w package.json: ${localVersion}"
// 2. Sprawdź wersję w NPM
def versionExists = false
try {
// Sprawdzamy czy ta konkretna wersja już jest
// Jeśli pakiet nie istnieje w ogóle, komenda zwróci błąd, więc łapiemy w catch
def npmCheck = sh(script: "npm view wc-timer@${localVersion} version", returnStatus: true)
if (npmCheck == 0) {
versionExists = true
}
} catch (err) {
versionExists = false
}
// 3. Decyzja: Publikuj albo Giń
if (versionExists) {
echo "❌ BŁĄD: Wersja ${localVersion} jest już opublikowana w NPM!"
echo "💡 ROZWIĄZANIE: Zmień wersję w package.json na branchu develop i wypchnij ponownie."
// To polecenie sprawi, że Build zaświeci się na CZERWONO (Failure)
error("Przerwano publikację: Wersja ${localVersion} już istnieje.")
} else {
echo "🚀 Wersja ${localVersion} jest nowa. Publikuję..."
sh 'echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" > .npmrc'
sh 'npm publish --access public'
echo "✅ SUKCES: Wersja ${localVersion} została opublikowana."
}
}
}
}
post {
always {
sh 'rm -f .npmrc'
}
}
} }
} }
} }