tutorial steps multibranch example espaƱol jenkins jenkins-pipeline

steps - Jenkinsfile y diferentes estrategias para sucursales



jenkins pipeline tutorial (5)

1) No sé si es apropiado, pero si resuelve tu problema, creo que es lo suficientemente apropiado.

2) Para conocer el nombre de la sucursal puede usar la variable BRANCH_NAME, su nombre se toma del nombre de la sucursal.

${env.BRANCH_NAME}

Aquí está la respuesta: tubería Jenkins Multibranch: ¿Cuál es la variable del nombre de la rama?

Intento usar el archivo de Jenkins para todas nuestras compilaciones en Jenkins, y tengo el siguiente problema. Básicamente tenemos 3 tipos de compilaciones:

  • compilación pull-request: se fusionará con el maestro después de la revisión del código, y si la construcción funciona
  • compilación manual de petición de extracción: una compilación que hace lo mismo que la anterior, pero que puede ser activada manualmente por el usuario (por ejemplo, en caso de que tengamos alguna prueba inestable)
  • una línea de entrega continua inicial: esto generará el código, se implementará en el repositorio, instalará los artefactos del repositorio en el servidor de destino y comenzará la aplicación allí

¿Cómo debo incluir todas las compilaciones anteriores en un único Jenkinsfile? En este momento, la única idea que tengo es hacer un gigante si eso comprueba qué rama es y hará los pasos.

Entonces tengo dos preguntas:

1. ¿Es esa la forma apropiada de hacerlo en Jenkinsfile?

  1. ¿Cómo obtener el nombre de la rama que se está ejecutando actualmente en el tipo de trabajo de múltiples ramas?

Como referencia, aquí está mi Jenkinsfile actual:

def servers = [''server1'', ''server2''] def version = "1.0.0-${env.BUILD_ID}" stage ''Build, UT, IT'' node { checkout scm env.PATH = "${tool ''Maven''}/bin:${env.PATH}" withEnv(["PATH+MAVEN=${tool ''Maven''}/bin"]) { sh "mvn -e org.codehaus.mojo:versions-maven-plugin:2.1:set -DnewVersion=$version -DgenerateBackupPoms=false" sh ''mvn -e clean deploy'' sh ''mvn -e scm:tag'' } } def nodes = [:] for (int i = 0; i < servers.size(); i++) { def server = servers.get(i) nodes["$server"] = { stage "Deploy to INT ($server)" node { sshagent([''SOME-ID'']) { sh """ ssh ${server}.example.com <<END hostname /apps/stop.sh yum -y update-to my-app.noarch /apps/start.sh END""".stripIndent() } } } } parallel nodes

EDIT: pregunta eliminada basada en la opinión


No sé si esto es lo que quieres ... prefiero porque es más estructurado.

Jenkinsfile

node { def rootDir = pwd() def branchName = ${env.BRANCH_NAME} // Workaround for pipeline (not multibranches pipeline) def branchName = getCurrentBranch() echo ''BRANCH.. '' + branchName load "${rootDir}@script/Jenkinsfile.${branchName}.Groovy" } def getCurrentBranch () { return sh ( script: ''git rev-parse --abbrev-ref HEAD'', returnStdout: true ).trim() }

Jenkinsfile. mybranch .Groovy

echo ''mybranch'' // Pipeline code here


Puede agregar la instrucción If para varias etapas si desea omitir varias etapas de acuerdo con la rama como en:

if(env.BRANCH_NAME == ''master''){ stage("Upload"){ // Artifact repository upload steps here } stage("Deploy"){ // Deploy steps here } }

o, puede agregarlo a la etapa individual como en:

stage("Deploy"){ if(env.BRANCH_NAME == ''master''){ // Deploy steps here } }


Seguimos el modelo utilizado por fabric8 para las construcciones, fabric8 según lo necesitáramos, donde el Jenkinsfile se usa para definir la rama y la lógica de manejo de la implementación, y un archivo de release.groovy para la lógica de compilación.

Jenkinsfile es lo que parece nuestro Jenkinsfile para una canalización que se despliega continuamente en DEV desde la rama principal:

#!groovy import com.terradatum.jenkins.workflow.* node { wrap([$class: ''TimestamperBuildWrapper'']) { checkout scm echo "branch: ${env.BRANCH_NAME}" def pipeline = load "${pwd()}/release.groovy" if (env.DEPLOY_ENV != null) { if (env.DEPLOY_ENV.trim() == ''STAGE'') { setDisplayName(pipeline.staging() as Version) } else if (env.DEPLOY_ENV.trim() == ''PROD'') { setDisplayName(pipeline.production() as Version) } } else if (env.BRANCH_NAME == ''master'') { try { setDisplayName(pipeline.development() as Version) } catch (Exception e) { hipchatSend color: ''RED'', failOnError: true, message: "<p>BUILD FAILED: </p><p>Check console output at <a href=''${env.BUILD_URL}''>${env.JOB_NAME} [${env.BUILD_NUMBER}]</a></p><p><pre>${e.message}</pre></p>", notify: true, room: ''Aergo'', v2enabled: false throw e; // rethrow so the build is considered failed } } else { setDisplayName(pipeline.other() as Version) } } } def setDisplayName(Version version) { if (version) { currentBuild.displayName = version.toString() } }

Nota: aquí puede encontrar el código de nuestra biblioteca global de tuberías.


para la pregunta 2, puede hacer

sh ''git branch> GIT_BRANCH'' def gitBranch = readFile ''GIT_BRANCH''

ya que estás saliendo de Git