pipeline { agent any environment { DOCKER_CREDS = 'rschneider@docker.rschneider.hu' GIT_USER = "Roland Schneider" GIT_EMAIL = "rocho02@gmail.com" GIT_REPO = "gitea.rschneider.hu/rschneider/yogastic.git" GIT_BRANCH = "main" GIT_CREDS_ID = "rschneider_gitea.rschneider.hu" CMS_IMAGE= "docker.rschneider.hu/infra/yoga-cms" APP_IMAGE= "docker.rschneider.hu/infra/yoga-app" } stages { stage('Checkout') { steps { git branch: 'main', credentialsId: "${GIT_CREDS_ID}", url: "https://${GIT_REPO}" sh ''' ls -lah ''' } } stage('Collect project info - cms') { agent{ docker { reuseNode true image 'linuxserver/yq' } } steps { withCredentials([usernamePassword(credentialsId: "${GIT_CREDS_ID}", passwordVariable: 'DOCKER_PASSWORD', usernameVariable: 'DOCKER_USERNAME')]) { script { def block = "" block = sh returnStdout:true, script:''' yq -y '.services.cms.image' environment/prod/docker-compose/yogastic/docker-compose.yaml ''' block = block.readLines(); env.CMS_CURRENT = block[0]; block = sh returnStdout:true, script:''' cat environment/dev/docker/cms/scripts/version.txt ''' block = block.readLines(); env.CMS_LATEST = block[0]; def apiUrl = "https://docker.rschneider.hu/v2/infra/yoga-cms/tags/list" def tagsResponse = sh(script: """ curl -s -u "${DOCKER_USERNAME}:${DOCKER_PASSWORD}" ${apiUrl} """, returnStdout: true).trim() // Step 3: Use JsonSlurper to parse the JSON response def jsonSlurper = new groovy.json.JsonSlurper() def tags = jsonSlurper.parseText(tagsResponse) // Extract the tag names def availableTags = tags.tags.collect { it } availableTags = availableTags.reverse() println availableTags env.CMS_TAGS = availableTags.join("\n") } } } } stage('Collect project info - app') { agent{ docker { reuseNode true image 'linuxserver/yq' } } steps { withCredentials([usernamePassword(credentialsId: 'rschneider@docker.rschneider.hu', passwordVariable: 'DOCKER_PASSWORD', usernameVariable: 'DOCKER_USERNAME')]) { script { def block = "" block = sh returnStdout:true, script:''' yq -y '.services.app.image' environment/prod/docker-compose/yogastic/docker-compose.yaml ''' block = block.readLines(); env.APP_CURRENT = block[0]; block = sh returnStdout:true, script:''' cat environment/dev/docker/app/scripts/version.txt ''' block = block.readLines(); env.APP_LATEST = block[0]; def apiUrl = "https://docker.rschneider.hu/v2/infra/yoga-app/tags/list" def tagsResponse = sh(script: """ curl -s -u "${DOCKER_USERNAME}:${DOCKER_PASSWORD}" ${apiUrl} """, returnStdout: true).trim() // Step 3: Use JsonSlurper to parse the JSON response def jsonSlurper = new groovy.json.JsonSlurper() def tags = jsonSlurper.parseText(tagsResponse) // Extract the tag names def availableTags = tags.tags.collect { it } availableTags = availableTags.reverse() env.APP_TAGS = availableTags.join("\n") } } } } stage('Select version CMS') { steps { echo "new tags" println env.CMS_TAGS script{ env.CMS_VERSION = input message: 'Select version for PROD', ok: 'Update', parameters: [choice(name: 'Select version', choices: env.CMS_TAGS, description: """ Latest: ${env.CMS_LATEST} Current: ${env.CMS_CURRENT} """ )] echo "You have selected Docker Tag: ${env.CMS_VERSION}" } } } stage('Select version APP') { steps { echo "new APP tags" println env.APP_TAGS script{ env.APP_VERSION = input message: 'Select version for PROD', ok: 'Update', parameters: [choice(name: 'Select version', choices: env.APP_TAGS, description: """ Latest: ${env.APP_LATEST} Current: ${env.APP_CURRENT} """)] echo "You have selected Docker Tag: ${env.APP_VERSION}" } } } stage('Update version CMS') { agent{ docker { reuseNode true image 'node:22' } } steps { script{ env.TARGET_FILE='../prod/docker-compose/yogastic/docker-compose.yaml' env.TARGET_SERVICE='cms' env.TARGET_IMAGE= "${CMS_IMAGE}:${CMS_VERSION}" sh ''' cd environment/common npm i -c npx ts-node src/update.service.version.ts ''' } } } stage('Update version APP') { agent{ docker { reuseNode true image 'node:22' } } steps { script{ env.TARGET_FILE='../prod/docker-compose/yogastic/docker-compose.yaml' env.TARGET_SERVICE='app' env.TARGET_IMAGE= "${APP_IMAGE}:${APP_VERSION}" sh ''' cd environment/common npm i -c npx ts-node src/update.service.version.ts ''' } } } stage('Update git ') { /* agent{ docker { reuseNode true image 'alpine/git' args '--entrypoint /bin/sh' } } */ environment{ GIT_CREDS = credentials("${GIT_CREDS_ID}") ENV_NAME = "Prod yoga-app" IMAGE_VERSION = "${CMS_VERSION}" } steps { sh ''' git status git config user.email "${GIT_EMAIL}" git config user.name "${GIT_USER}" git commit -a -m "[ci-skip] New ${ENV_NAME} deployment version: ${IMAGE_VERSION}" git push --tags https://$GIT_CREDS@$GIT_REPO $GIT_BRANCH ''' } } } }