From 9c78fca70aa48b97c10e23b58de022f2648edd80 Mon Sep 17 00:00:00 2001 From: "aleksandr.vodyanov" Date: Thu, 16 Nov 2023 17:33:49 +0300 Subject: [PATCH] DO-143_feature_freeze (#4) + Add Feeature freeze for tavro Reviewed-on: https://git.avroid.tech/DevOps/jenkins-pipelines/pulls/4 Reviewed-by: Denis Patrakeev Co-authored-by: aleksandr.vodyanov Co-committed-by: aleksandr.vodyanov --- jobs-dsl/folders/Release_activity.groovy | 8 ++ .../tavro/feature_freeze.groovy | 68 +++++++++++ .../tavro/feature_freeze.groovy | 107 ++++++++++++++++++ 3 files changed, 183 insertions(+) create mode 100644 jobs-dsl/folders/Release_activity.groovy create mode 100644 jobs-dsl/jobs/Release-activity/tavro/feature_freeze.groovy create mode 100644 pipelines/Release-activity/tavro/feature_freeze.groovy diff --git a/jobs-dsl/folders/Release_activity.groovy b/jobs-dsl/folders/Release_activity.groovy new file mode 100644 index 0000000..3845afb --- /dev/null +++ b/jobs-dsl/folders/Release_activity.groovy @@ -0,0 +1,8 @@ +folder('Release-activity') { + displayName('Release-activity') + description('Release activity') +} + +folder('Release-activity/tavro') { + description('Release activity for TAVRO team') +} diff --git a/jobs-dsl/jobs/Release-activity/tavro/feature_freeze.groovy b/jobs-dsl/jobs/Release-activity/tavro/feature_freeze.groovy new file mode 100644 index 0000000..5f4dfdf --- /dev/null +++ b/jobs-dsl/jobs/Release-activity/tavro/feature_freeze.groovy @@ -0,0 +1,68 @@ +pipelineJob('Release-activity/tavro/feature_freeze') { + logRotator { + numToKeep(10) + artifactNumToKeep(10) + } + + parameters { + choiceParameter { + name('SOURCE_BRANCH_NAME') + randomName('') + filterable(true) + filterLength(1) + script { + groovyScript { + fallbackScript { + script('') + sandbox(false) + } + script { + sandbox(false) + script( +"""import groovy.json.JsonSlurperClassic +def sout = new StringBuffer(), serr = new StringBuffer() +def proc = 'curl --connect-timeout 15 -u \${gitLogin}:\${gitPass} \${env.JENKINS_GIT_REPOSITORY_HTTP_URL}/api/v1/repos/\${repoName}/branches'.execute() +proc.consumeProcessOutput(sout, serr) +proc.waitForOrKill(5000) +JSONInfo = new JsonSlurperClassic().parseText(sout.toString()) +List branches = [] +JSONInfo.each{ branch -> +branches.add(branch.name) +} +return branches.sort() +""" + ) + } + } + } + choiceType('PT_SINGLE_SELECT') + } + + string { + name('RC_VERSION') + defaultValue('') + description('Release version eg. (1.4 or 1.4-demo)') + } + + booleanParam { + name('TEST_RC_BRANCH') + defaultValue(false) + description('Test RC branch or no. If value is true, branch will be looks as RC_MODC_test_2.0.0') + } + } + + definition { + cpsScm { + scm { + git { + remote { + url("${JENKINS_GIT_REPOSITORY_URL}/DevOps/jenkins-pipelines.git") + credentials("${JENKINS_GIT_CREDENTIALS_HTTP}") + } + branch('master') + } + } + scriptPath('pipelines/Release-activity/tavro/feature_freeze.groovy') + } + } +} diff --git a/pipelines/Release-activity/tavro/feature_freeze.groovy b/pipelines/Release-activity/tavro/feature_freeze.groovy new file mode 100644 index 0000000..ab2acc1 --- /dev/null +++ b/pipelines/Release-activity/tavro/feature_freeze.groovy @@ -0,0 +1,107 @@ +@Library('shared-lib') _ + +import tech.avroid.api.Gitea + +String rcBranch +String gitToken +String apiRepoURL = "${env.JENKINS_GIT_REPOSITORY_URL}/api/v1/repos/TAVRO/TAVRO" +List parentJobs = ['jobs-dsl'] + + +withCredentials([usernamePassword(credentialsId: "${JENKINS_GIT_CREDENTIALS_HTTP}", + usernameVariable: 'GITEA_USER', passwordVariable: 'GITEA_USER_PASSWORD')]) { + gitLogin = GITEA_USER + gitPass = GITEA_USER_PASSWORD +} + +properties([ + buildDiscarder(logRotator(artifactNumToKeepStr: '10', + numToKeepStr: '10')), + disableConcurrentBuilds(), + parameters( + [[$class: 'ChoiceParameter', + choiceType: 'PT_SINGLE_SELECT', + filterLength: 1, + filterable: true, + name: 'SOURCE_BRANCH_NAME', + script: [$class: 'GroovyScript', + script: [sandbox: false, script: """import groovy.json.JsonSlurperClassic +def sout = new StringBuffer(), serr = new StringBuffer() +def proc = 'curl --connect-timeout 15 -u ${gitLogin}:${gitPass} ${apiRepoURL}/branches'.execute() +proc.consumeProcessOutput(sout, serr) +proc.waitForOrKill(5000) +JSONInfo = new JsonSlurperClassic().parseText(sout.toString()) +List branches = [] +JSONInfo.each{ branch -> +branches.add(branch.name) +} +return branches.sort() +"""]], + ], + string(name: 'RC_VERSION', defaultValue: '', description: 'Release version eg. (1.4 or 1.4-demo)'), + booleanParam(name: 'TEST_RC_BRANCH', + defaultValue: false, + description: 'Test RC branch or no. If value is true, branch will be looks as test_rc_1.4') +] + + ) +]) + +// Check if job triggered by parent job +boolean isContainsParentJob = parentJobs.any {job -> currentBuild.upstreamBuilds.projectName.contains(job) } + +if (isContainsParentJob) { + currentBuild.result = 'SUCCESS' + println("This job was triggered by one or more of following upstream jobs ${parentJobs}, so it will be exited without running the steps.") + return +} + +podTemplate(workspaceVolume: hostPathWorkspaceVolume(hostPath: "/data"), + yaml: ''' + apiVersion: v1 + kind: Pod + spec: + containers: + - name: linux + image: harbor.avroid.tech/devops/base-build-image:1.0 + tty: true + resources: + limits: + cpu: 300m + memory: 256Mi + requests: + cpu: 300m + memory: 256Mi + imagePullPolicy: Always + imagePullSecrets: + - name: harbor-registry-secret +''' +) { + node(POD_LABEL) { + stage('Create RC branch') { + currentBuild.description = "Build from ${params.SOURCE_BRANCH_NAME}" + Gitea tavroRepo = new Gitea(this, apiRepoURL, "${env.JENKINS_GIT_CREDENTIALS_HTTP}") + String versionPattern = /^\d+\.\d+.*/ + String rcPrefix = 'rc' + String rcTest = params.TEST_RC_BRANCH == true ? 'test_' : '' + rcBranch = rcTest + rcPrefix + params.RC_VERSION + + if (!params.RC_VERSION.matches(versionPattern)) { + println('You must specify correct version, see description!') + error() + } + + boolean result = tavroRepo.createBranch(params.SOURCE_BRANCH_NAME, rcBranch) + + if (!result) { + println("RC Branch doesn't create, maybe ${rcBranch} already exists") + error() + } + } + + stage('Run build') { + sleep(10) + build(job: "TAVRO Team/TAVRO/${rcBranch}") + } + } +}