diff --git a/Jenkinsfile b/Jenkinsfile index 6741c47..7cd63c9 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -7,53 +7,101 @@ pipeline { } stages { - stage('Build & Test (E2E)') { + // ========================================================= + // ETAP 1: DEVELOP (Testy i Merge) + // ========================================================= + stage('CI: Test & Merge (Develop)') { when { branch 'develop' } steps { + // 1. Uruchomienie Testów 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 up --build --abort-on-container-exit --exit-code-from cypress' } - } - } - stage('Merge Develop -> Main') { - when { - branch 'develop' - } - steps { + // 2. Scalanie (Bez zmiany wersji!) sshagent(credentials: ['gitea-ssh-key']) { 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.email '${GIT_AUTHOR_EMAIL}'" + // Pobieramy main, scalamy i wysyłamy sh 'git fetch origin main' - sh 'git fetch origin develop' - sh 'git checkout 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' } } } + 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 { - // Sprzątanie wykonujemy tylko, jeśli testy w ogóle ruszyły - // Ale komenda down jest bezpieczna nawet jak nic nie działało - sh 'docker compose -f docker-compose.test.yml down -v' + // ========================================================= + // 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 + } + + // 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' + } + } } } } \ No newline at end of file