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ę (bez zmian) def localVersion = sh(script: "grep '\"version\":' package.json | cut -d\\\" -f4", returnStdout: true).trim() echo "Lokalna wersja w package.json: ${localVersion}" // 2. Utwórz plik .npmrc lokalnie sh 'echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" > .npmrc' // UWAGA: Nie musimy robić 'docker compose build', bo używamy obrazu z testów // Jeśli chcesz mieć pewność, że obraz jest świeży, możesz zostawić build, // ale kluczowe jest mapowanie w następnych krokach. // 3. Sprawdź wersję w NPM def versionExists = false try { // Dodajemy flagę -w (workdir) aby npm widział package.json 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ę z kontenera..." // NAPRAWA GŁÓWNA: // -w /app/wc-timer : wchodzimy do folderu z plikiem package.json // -v $(pwd)/.npmrc:/app/wc-timer/.npmrc : montujemy plik z tokenem sh """ docker compose -f docker-compose.test.yml run --rm \ -w /app/wc-timer \ -v \$(pwd)/.npmrc:/app/wc-timer/.npmrc \ app \ npm publish --access public """ echo "✅ SUKCES: Wersja ${localVersion} została opublikowana." } } } } post { always { echo '--- [MAIN] Sprzątanie ---' sh 'rm -f .npmrc' sh 'docker compose -f docker-compose.test.yml down -v' } } } } }