À l’étape de l’installation, Travis CI clone le dépôt, qui ressemble à ceci:
git clone --depth=50 --branch=master https://github.com/user/repo.git user/repo
Comment puis-je personnaliser/annuler cela?
Contexte: J'utilise des déploiements basés sur des balises. De la même manière que Travis extrait les constructions marquées (--branch=<tagname>
), le référentiel git est détaché sans accès aux branches. Cependant, pour le déploiement, j'ai besoin de savoir sur quelle branche je suis. Ma solution est de faire un clone "normal" puis de passer au commit étiqueté.
Vous pouvez cloner le référentiel à nouveau au cours de l'étape d'installation. De cette façon, vous clonez le référentiel deux fois, mais cela semble fonctionner.
# .travis.yml
install:
- git clone https://github.com/$TRAVIS_REPO_SLUG.git $TRAVIS_REPO_SLUG
- cd $TRAVIS_REPO_SLUG
- git checkout -qf $TRAVIS_COMMIT
J'ai constaté que pour avoir accès à l'ensemble de votre pension, vous avez besoin des éléments suivants:
install:
- git config remote.Origin.fetch +refs/heads/*:refs/remotes/Origin/*
- git fetch --unshallow --tags
De cette façon, vous aurez accès aux branches et balises distantes (par exemple, vous pouvez effectuer le paiement).
Si vous êtes sur une balise mais que vous ne voulez plus être dans un état détaché HEAD, vous pouvez créer une nouvelle branche qui pointe sur la balise (selon cette discussion ):
install:
- git config remote.Origin.fetch +refs/heads/*:refs/remotes/Origin/*
- git fetch --unshallow --tags
- git symbolic-ref --short HEAD || git checkout -b ${TRAVIS_BRANCH}-test $TRAVIS_BRANCH
Remarque: git symbolic-ref --short HEAD
échouera si vous êtes dans un état détaché HEAD.
Exécutez ceci pendant votre construction pour avoir accès aux tags/branches Origin
git config remote.Origin.fetch "+refs/heads/*:refs/remotes/Origin/*" 1>/dev/null
git fetch Origin -q
Après cela, vous pouvez exécuter cette commande pour trouver les branches contenant votre commit.
BRANCHES=`git branch -a --contains "$TRAVIS_TAG"`
J'ai créé un script il y a très longtemps pour récupérer la branche "environnement" où la balise a été créée à des fins de déploiement continu.
Cela peut vous inspirer: https://Gist.github.com/rolebi/a0eb1f783b7f3a5f21a631c8da1582dc
Utilisez-le comme ça:
TARGET_ENV="`test $TRAVIS_TAG && bash scripts/get_branch_for_git_reference.sh $TRAVIS_TAG`"
Le problème n'est pas vraiment que vous êtes dans une branche isolée. C’est que git ne vous autorise pas à récupérer les balises: git fetch --tags
ne cherchera que la branche spécifiée par --branch
dans la commande git clone
que vous avez donnée.
Je l'explique plus en détail cette réponse .
Pour résoudre votre problème (en extrayant une balise spécifique), vous pouvez appeler un script qui ressemble à ceci après le clonage du référentiel:
# Keep track of where Travis put us.
# We are on a detached head, and we need to be able to go back to it.
build_head=$(git rev-parse HEAD)
# fetch the tags
git config --replace-all remote.Origin.fetch +refs/heads/*:refs/remotes/Origin/*
git fetch --tags
# checkout the tagged commit
git checkout -qf <your tag>
# now do your stuff
# go back to where we were at the beginning
git checkout ${build_head}
Ou vous pouvez simplement interroger la télécommande. Ajoutez ce qui suit à .travis.yml
:
env:
global:
# get all the branches referencing this commit
- REAL_BRANCH=$(git ls-remote Origin | sed -n "\|$TRAVIS_COMMIT\s\+refs/heads/|{s///p}")
# or check if we are on a particular branch:
- IS_RELEASE=$(git ls-remote Origin | grep "$TRAVIS_COMMIT\s\+refs/heads/release$"
(Je suis surpris que les gourous n’aient pas déjà proposé celui-ci)
Vous pouvez convertir le clone superficiel existant en un clone complet. Pour ce faire, exécutez git fetch --unshallow (disponible depuis la version 1.8.3 de Git) au cours de l’étape de l’installation.
# .travis.yml
install:
- git fetch --unshallow --tags
Le drapeau --tags force de récupérer toutes les balises même si elles n'appartiennent pas à la branche extraite. Cela est nécessaire si votre construction dépend également des balises d'autres branches.