From 3ed9fe10b99ce4b06ab8de7c3deee9b9bad274b9 Mon Sep 17 00:00:00 2001 From: David Ali Date: Mon, 5 Jan 2026 22:17:27 +0100 Subject: [PATCH] fix: npm publish --- Jenkinsfile | 103 ++++++++++++++++++++++++++++------------------------ 1 file changed, 55 insertions(+), 48 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 7cd63c9..59a9626 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -51,57 +51,64 @@ pipeline { } // ========================================================= - // ETAP 2: MAIN (Weryfikacja wersji i Publikacja) - // ========================================================= - 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ę 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 - } + // 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. 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." - } + // 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' } } } - post { - always { - sh 'rm -f .npmrc' - } - } - } } } \ No newline at end of file