crear - ¿Cómo recibir el nombre de la sucursal local de Git con el plugin Jenkins Git?
crear tag git (10)
Estoy usando la opción Branch Specifier del plugin Jenkins Git (v2.0) para ejecutar build en una rama específica, por ejemplo, 1.4
.
${GIT_BRANCH}
en este caso contiene el valor de origin/1.4
.
¿Cómo puedo recibir un nombre de la rama local de Git utilizada para la clonación (es decir, solo 1.4
sin origin/
prefijo?
Intenté Check out to specific local branch
comportamiento adicional de la Check out to specific local branch
con el nombre de la rama 1.4
, pero nada había cambiado.
He visto relaciones PR relacionadas en GitHub, pero se ha rechazado (ya que corrige solo un caso con el origin
remoto).
A partir de marzo de 2016 (Git Plugin v2.4.3), ahora es compatible de forma nativa. Simplemente coloque **
como el valor de Check out to specific local branch
en el complemento de Git, en lugar de cualquier macro / variable.
La descripción del campo detalla el nuevo comportamiento:
Si se selecciona, y su valor es una cadena vacía o "**", entonces el nombre de la rama se calcula desde la rama remota sin el origen. En ese caso, se enviará un origen / maestro de una sucursal remota a una sucursal local llamada maestra, y una sucursal remota origen / desarrollo / nueva-característica se verificará en una sucursal local llamada desarrollar / nueva característica.
Esto fue introducido por @roostergx y @NickVolynkin mencionado cuando fue lanzado. Solo estoy documentando aquí para ayudar a la gente en el futuro.
Basado en esta respuesta SO: ¿Cómo puedo obtener el resultado de un comando de shell ejecutado usando una variable de Jenkinsfile (groovy)?
Utilicé esto y, finalmente, pude hacer que funcionara (el ejemplo siguiente supone una variable de rama de $Branch
):
stage(''Checkout'') {
GIT_BRANCH_LOCAL = sh (
script: "echo $Branch | sed -e ''s|origin/||g''",
returnStdout: true
).trim()
echo "Git branch: ${GIT_BRANCH_LOCAL}"
git branch: "${GIT_BRANCH_LOCAL}", credentialsId: ''...'', url: ''[email protected]:......git''
}
En una tubería, puedes hacerlo así:
// get arround a git scm anoying feature
stage (''Bootstrap'') {
sh "echo GIT_BRANCH_LOCAL=///"$GIT_BRANCH///" | sed -e ''s|origin/||g'' | tee version.properties"
}
stage(''Checkout'') {
load(''version.properties'')
checkout([$class: ''GitSCM'', branches: [[name: ''**'']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: ''LocalBranch'', localBranch: "${GIT_BRANCH_LOCAL}"]], submoduleCfg: [], userRemoteConfigs: [[url: ''https://github.com/webofmars/grails-website.git'']]])
}
Logré hacer eso con un par de pasos:
Agregue
Execute shell
pre paso con estos:git_branch_local=$(echo $GIT_BRANCH | sed -e "s|origin/||g") echo GIT_BRANCH_LOCAL=$git_branch_local > build.properties
Agregue un paso de
Inject environment variables
debuild.properties
para el archivobuild.properties
entonces deberías tener una variable de entorno GIT_BRANCH_LOCAL
que no tiene origin/
Me encontré con el problema hoy. La razón es que el complemento Jenkins git agregará "origen /" a cualquier nombre de rama que hayas proporcionado al parámetro de compilación GIT_BRANCH. Ver https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin
El plugin git establece varias variables de entorno que puedes usar en tus scripts: GIT_BRANCH - Nombre de la rama que se está utilizando actualmente, por ejemplo, "master" u "origin / foo"
Como resultado, cuando compila con el parámetro GIT_BRANCH = foo, Jenkins simplemente agregará "origen /" delante de él. Entonces, cuando lo hagas
git check out ${GIT_BRANCH}
en realidad estás haciendo
git check out origin/foo
Lo que puede hacer para evitar esto, es usar algo más en su parámetro de compilación, como GIT_BRANCH_NAME o lo que sea, simplemente no use GIT_BRANCH. En la configuración, elimine el parámetro GIT_BRANCH y agregue otro con el nombre GIT_BRANCH_NAME. Luego, en "Crear con parámetro", en GIT_BRANCH_NAME, especifica tu sucursal.
Me encontré con este problema también hoy. Parece ser que cuando cambio el valor de Check out to specific local branch
, necesito eliminar el repositorio local en el servidor de compilación antes de activar una nueva compilación.
Publiqué un mensaje al grupo jenkins-ci ( https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!msg/jenkinsci-dev/xuweZbwn9zE/BAWfs-ZeFAAJ ) sugiriendo una mejora en el plugin de Git Opción "Check Out to Local Branch". Por defecto, el plugin git verifica una cabeza separada. La sucursal local le permite especificar un nombre de sucursal específico. Cuando se configura, utilizando este método, el nombre de la sucursal local es exactamente como se especificó.
Si está usando Jenkins para hacer una versión maven, es obligatorio que el nombre de la sucursal local sea el mismo que el nombre de la sucursal remota. Vea la publicación en grupos de google para más información sobre esto.
Para abordar este requisito, he creado una solicitud de extracción ( https://github.com/jenkinsci/git-plugin/pull/381 ) con código y casos de prueba.
También creó un problema JIRA ( https://issues.jenkins-ci.org/browse/JENKINS-33202 ) para documentar el problema.
Si alguien necesita esta función, le recomiendo que la publique en la discusión grupal y vote por la JENKINS-33202.
Puede quitar el prefijo de la variable con bastante facilidad: ${GIT_BRANCH##origin/}
Aunque esta no es una solución muy general, es bastante simple y no he visto un repositorio clonado por Jenkins, que utilizaría algo más que el origin
para el nombre remoto.
Actualización : en realidad, ${GIT_BRANCH#*/}
funcionará para cualquier origen e incluso para las ramas que contienen barras inclinadas. El #
hace un emparejamiento glob no codicioso, ##
permite el emparejamiento codicioso. Ver el Manual de referencia de Bash para más detalles.
Si bien es cierto, como dice dtabuenc en un comentario a la respuesta de Jan Včelák, la sintaxis del intérprete de comandos no funcionará directamente en las macros del token, si está intentando obtener el nombre de la sucursal en un paso de compilación del Shell de ejecución (o similar), todavía puedes usar la misma idea.
TEMP_GIT_BRANCH=${GIT_BRANCH}
MY_GIT_BRANCH="${TEMP_GIT_BRANCH#*/}"
funciona bien (y eso es válido POSIX, no se requiere bash).
Si lo comprueba como una sucursal local y luego usa $ {GIT_LOCAL_BRANCH} le da el nombre de la sucursal local (es decir, ''desarrollar'' en lugar de ''origen / desarrollar''. (Git Plugin versión 3.0.0)