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?
- ¿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