ericteubert
ericteubert

Reputation: 4601

How can I customize / override the "git clone" step in Travis CI?

On the install step, Travis CI clones the repo, which looks similar to this:

git clone --depth=50 --branch=master https://github.com/user/repo.git user/repo

How can I customize / override this?


Background: I am using tag based deploys. The way Travis checks out tagged builds (--branch=<tagname>), the git repository is in a detached state without access to branches. However, for deployment I need to know on which branch I am. My solution is to do a "normal" clone and then switch to the tagged commit.

Upvotes: 29

Views: 10082

Answers (8)

Arafat Hasan
Arafat Hasan

Reputation: 3187

Disable git clone and then clone the repository again in the install step. The repository will be cloned only once in this way. In this "normal" clone you will able to do what ever you want.

git:
  clone: false
install:
  - git clone https://github.com/$TRAVIS_REPO_SLUG.git $TRAVIS_REPO_SLUG
  - cd $TRAVIS_REPO_SLUG

Upvotes: 1

jonrsharpe
jonrsharpe

Reputation: 122142

Per the Travis docs you can add the following to your .travis.yml to remove the --depth flag:

git:
  depth: false

As --depth implies --single-branch, removing this flag means that all branches will be checked out, which isn't the default behaviour.

Upvotes: 12

thisismydesign
thisismydesign

Reputation: 25162

I found that in order to get access to your whole repo you need the following:

install:
  - git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
  - git fetch --unshallow --tags

This way you'll have access to remote branches and tags (e.g. can do checkout).

If you're on a tag but no longer want to be in a detached HEAD state you can create a new branch that points to the tag (according to this 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

Note: git symbolic-ref --short HEAD will fail if you're in a detached HEAD state.

Upvotes: 3

rolebi
rolebi

Reputation: 1181

Run this during your build to have access to origin tags / branches

git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*" 1>/dev/null
git fetch origin -q

After that you can run this command to find branches containing your commit

BRANCHES=`git branch -a --contains "$TRAVIS_TAG"`

I've created a script a loooong time ago to fetch the 'environment' branch where the tag was created for continuous deployment purpose.

It may inspire you: https://gist.github.com/rolebi/a0eb1f783b7f3a5f21a631c8da1582dc

Use it like that:

TARGET_ENV="`test $TRAVIS_TAG && bash scripts/get_branch_for_git_reference.sh $TRAVIS_TAG`"

Upvotes: 1

Aryeh Leib Taurog
Aryeh Leib Taurog

Reputation: 5608

Or you could just query the remote. Add the following to .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$"

(I am surprised that the git gurus hadn’t come up with this one already)

Upvotes: 0

little-dude
little-dude

Reputation: 1674

The problem is not really that you are in a detached branch. It is that git does not allow you to fetch the tags: git fetch --tags will only fetch the branch spcified by --branch in the git clone command you gave.

I explain this in more details this answer.

To solve you issue (checking out a specific tag) you can call a script that looks like this, after the repo is cloned:

    # 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}

Upvotes: 2

Florian Dreier
Florian Dreier

Reputation: 419

You can convert the already existing shallow clone to a full clone. To do so execute git fetch --unshallow (available since git version 1.8.3) during the install step.

# .travis.yml
install:
  - git fetch --unshallow --tags

The --tags flag forces to fetch all tags even if they don't belong to the checked out branch. This is needed if your build also depends on tags from other branches.

Upvotes: -1

ericteubert
ericteubert

Reputation: 4601

You can clone the repository again in the install step. That way you clone the repository twice, but it seems to work.

# .travis.yml
install:
  - git clone https://github.com/$TRAVIS_REPO_SLUG.git $TRAVIS_REPO_SLUG
  - cd $TRAVIS_REPO_SLUG
  - git checkout -qf $TRAVIS_COMMIT

Upvotes: 17

Related Questions