Как настроить/переопределить шаг "git clone" в Travis CI?
На этапе установки Travis CI клонирует репо, похожее на это:
git clone --depth=50 --branch=master https://github.com/user/repo.git user/repo
Как я могу настроить/переопределить это?
Справочная информация. Я использую развертывание на основе тегов. То, как Travis проверяет тегированные сборки (--branch=<tagname>
), репозиторий git находится в отдельном состоянии без доступа к ветвям. Однако для развертывания мне нужно знать, в какой ветке я. Мое решение - сделать "нормальный" клон, а затем переключиться на тегированное коммитирование.
Ответы
Ответ 1
Вы можете клонировать репозиторий еще раз на этапе установки. Таким образом, вы клонируете репозиторий дважды, но, похоже, он работает.
# .travis.yml
install:
- git clone https://github.com/$TRAVIS_REPO_SLUG.git $TRAVIS_REPO_SLUG
- cd $TRAVIS_REPO_SLUG
- git checkout -qf $TRAVIS_COMMIT
Ответ 2
Проблема не в том, что вы находитесь в отдельной ветке. Дело в том, что git не позволяет вам извлекать теги: git fetch --tags
будет извлекать только ветвь с помощью --branch
в команде git clone
, которую вы указали.
Я объясняю это более подробно этот ответ.
Чтобы решить проблему (проверяя конкретный тег), вы можете вызвать script, который выглядит следующим образом, после клонирования репо:
# 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}
Ответ 3
Или вы можете просто запросить пульт. Добавьте к .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$"
(Я удивлен, что гуру git уже не придумали это)
Ответ 4
Запустите это во время сборки, чтобы иметь доступ к тегам/веткам происхождения
git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*" 1>/dev/null
git fetch origin -q
После этого вы можете запустить эту команду, чтобы найти ветки, содержащие вашу фиксацию
BRANCHES=`git branch -a --contains "$TRAVIS_TAG"`
Я создал script loooong time ago, чтобы извлечь ветвь "среда", где тег был создан для целей непрерывного развертывания.
Это может вас вдохновить: https://gist.github.com/rolebi/a0eb1f783b7f3a5f21a631c8da1582dc
Используйте его так:
TARGET_ENV="`test $TRAVIS_TAG && bash scripts/get_branch_for_git_reference.sh $TRAVIS_TAG`"
Ответ 5
Я обнаружил, что для того, чтобы получить доступ ко всему вашему репо, вам нужно следующее:
install:
- git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
- git fetch --unshallow --tags
Таким образом, у вас будет доступ к удаленным ветким и тэгам (например, можно сделать проверку).
Если вы используете тег, но больше не хотите находиться в отдельном состоянии HEAD, вы можете создать новую ветвь, указывающую на тег (в соответствии с это обсуждение):
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
Примечание: git symbolic-ref --short HEAD
завершится с ошибкой, если вы находитесь в состоянии автономного состояния HEAD.
Ответ 6
Вы можете преобразовать уже существующий мелкий клон в полный клон. Для этого выполните git fetch -unshallow (доступный с git версии 1.8.3) на этапе установки.
# .travis.yml
install:
- git fetch --unshallow --tags
Флаг -tags заставляет извлекать все теги, даже если они не принадлежат к выделенной ветке. Это необходимо, если ваша сборка также зависит от тегов из других ветвей.