Как настроить/переопределить шаг "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 заставляет извлекать все теги, даже если они не принадлежат к выделенной ветке. Это необходимо, если ваша сборка также зависит от тегов из других ветвей.