summaryrefslogtreecommitdiff
path: root/scripts/merge-train
blob: a934971b869463f2ea8926fbd4f40e342acfeda8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#!/bin/sh

set -e

# The name (including namespace) of the EE repository to merge commits into.
EE_PROJECT='gitlab-org/gitlab-ee'

# The directory to clone GitLab EE into.
EE_DIRECTORY="$CI_PROJECT_DIR/gitlab-ee"

# The EE branch to merge the changes into.
EE_BRANCH='master'

# Runs an incremental or periodic merge of CE to EE. This script should be run
# from a container built using https://gitlab.com/gitlab-org/merge-train.

# Merges (or reverts) commits in a batch (based on CI_COMMIT_BEFORE_SHA and
# CI_COMMIT_SHA), or since a specific commit.
#
# The optional first argument of this function should be a SHA of a commit. When
# specified, all commits since this commit will be processed.
merge() {
    # We need to source the configure-ssh script instead of running it with
    # `sh`, since it uses `eval` for SSH agent and we want the result of that to
    # persist.
    #
    # shellcheck disable=SC1091
    . /app/bin/configure-ssh

    # We can not perform a shallow clone, as this results in Git sometimes
    # refusing to fetch from CE. To work around this, we perform a full clone
    # but cache the repository in CI. If a cached repository exists, we simply
    # just pull from `master`.
    if [ -d "$EE_DIRECTORY" ]
    then
        echo "Updating existing clone of $EE_PROJECT"

        git -C "$EE_DIRECTORY" pull --quiet origin "$EE_BRANCH"
    else
        echo "Cloning $EE_PROJECT"

        git clone --quiet --single-branch --branch "$EE_BRANCH" \
            "git@gitlab.com:$EE_PROJECT.git" "$EE_DIRECTORY"
    fi

    cd /app

    env GITLAB_TOKEN="$MERGE_TRAIN_API_TOKEN" \
        bundle exec /app/bin/merge-train "$CI_PROJECT_DIR" "$EE_DIRECTORY" \
        --source-name "$CI_PROJECT_PATH" \
        --target-branch "$EE_BRANCH" \
        ${1:+--before "$1"}
}

# Merges (or reverts) all commits since a point in time as supported by `git log
# --since`, such as "12 hours ago".
merge_since() {
    commit="$(git log --since="$MERGE_SINCE" --reverse --format=%H | head -n1)"

    if [ "$commit" = '' ]
    then
        echo "There are no commits to merge since $MERGE_SINCE"
    else
        merge "$commit"
    fi
}

if [ "$MERGE_SINCE" ]
then
    merge_since
else
    merge
fi