summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/merge-train73
1 files changed, 73 insertions, 0 deletions
diff --git a/scripts/merge-train b/scripts/merge-train
new file mode 100755
index 00000000000..a934971b869
--- /dev/null
+++ b/scripts/merge-train
@@ -0,0 +1,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