From dbb1bc30735fce9ff23540484536d37ec9af271b Mon Sep 17 00:00:00 2001 From: Schneider Roland Date: Sun, 18 May 2025 11:14:48 +0200 Subject: [PATCH] [yoga-0] improve deployment scripts --- .../prod/jenkins/update.versions.Jenkinsfile | 221 ++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 environment/prod/jenkins/update.versions.Jenkinsfile diff --git a/environment/prod/jenkins/update.versions.Jenkinsfile b/environment/prod/jenkins/update.versions.Jenkinsfile new file mode 100644 index 0000000..e51b8e1 --- /dev/null +++ b/environment/prod/jenkins/update.versions.Jenkinsfile @@ -0,0 +1,221 @@ +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 + + ''' + + } + } + } +} + + +