| #!/bin/bash |
| # |
| # teamcity-run.sh - Trigger a Kotlin Aggregate build on TeamCity. |
| # |
| # Usage: |
| # scripts/teamcity-run.sh [OPTIONAL BRANCH] |
| # The script can also run on Windows via bash bundled with `Git for Windows`. |
| # |
| # Description: |
| # Starts the Aggregate build via KotlinDev_AggregateTrigger configuration on TeamCity. |
| # Requires the TeamCity CLI 1.3.0 or newer(see the install hint printed if it is missing) and |
| # authenticates via browser login on first use. |
| # |
| # If OPTIONAL BRANCH is given, the build is triggered for that branch directly. |
| # Otherwise, the script uses the current Git branch: it pushes any un-pushed |
| # commits (setting an upstream if needed) and then triggers the build for it. |
| set -euo pipefail |
| |
| SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" |
| cd "$SCRIPT_DIR/.." |
| |
| BRANCH="${1:-}" |
| |
| if ! command -v teamcity >/dev/null 2>&1; then |
| cat <<'EOF' |
| TeamCity CLI is not installed. Install it with: |
| |
| macOS (Homebrew): brew install jetbrains/utils/teamcity |
| Linux: curl -fsSL https://jb.gg/tc/install | bash |
| Windows: winget install JetBrains.TeamCityCLI |
| |
| Read more at: https://www.jetbrains.com/help/teamcity/teamcity-cli-get-started.html#install |
| EOF |
| exit 1 |
| fi |
| |
| REQUIRED_TEAMCITY_VERSION="1.3.0" |
| TEAMCITY_VERSION="$(teamcity --version 2>/dev/null | grep -Eo 'version[[:space:]]+[0-9]+\.[0-9]+\.[0-9]+' | grep -Eo '[0-9]+\.[0-9]+\.[0-9]+' | head -n 1 || true)" |
| if [ -z "$TEAMCITY_VERSION" ]; then |
| echo "Unable to determine the TeamCity CLI version. Please install version $REQUIRED_TEAMCITY_VERSION or newer." |
| exit 1 |
| fi |
| LOWEST_VERSION="$(printf '%s\n%s\n' "$REQUIRED_TEAMCITY_VERSION" "$TEAMCITY_VERSION" | sort -V | head -n 1)" |
| if [ "$LOWEST_VERSION" != "$REQUIRED_TEAMCITY_VERSION" ]; then |
| echo "TeamCity CLI version $TEAMCITY_VERSION is too old. Please install version $REQUIRED_TEAMCITY_VERSION or newer." |
| exit 1 |
| fi |
| |
| if ! teamcity auth status --json --no-input 2>/dev/null | grep -Eq '"status"[[:space:]]*:[[:space:]]*"authenticated"'; then |
| echo "You are not authenticated with TeamCity, starting browser login..." |
| teamcity auth login --server https://buildserver.labs.intellij.net/ |
| fi |
| |
| if [ -n "$BRANCH" ]; then |
| echo "Triggering TeamCity run for branch '$BRANCH'..." |
| teamcity run start Kotlin_KotlinDev_AggregateTrigger --branch "$BRANCH" |
| exit 0 |
| fi |
| |
| if ! git symbolic-ref -q HEAD >/dev/null 2>&1; then |
| cat <<'EOF' |
| You are in a detached HEAD state (not on any branch). |
| Please check out a branch before running this script. |
| EOF |
| exit 1 |
| fi |
| |
| if git rev-parse --abbrev-ref --symbolic-full-name '@{u}' >/dev/null 2>&1; then |
| if [ "$(git rev-list --count '@{u}..HEAD')" -gt 0 ]; then |
| if [ "$(git rev-list --count 'HEAD..@{u}')" -gt 0 ]; then |
| cat <<'EOF' |
| The current branch has diverged from its upstream and would require a force push. |
| Please force-push manually if that's intended, then re-run this script. |
| EOF |
| exit 1 |
| fi |
| echo "Pushing un-pushed commits on the current branch..." |
| git push |
| fi |
| else |
| echo "Current branch has no upstream. Pushing to origin..." |
| git push -u origin HEAD |
| fi |
| |
| teamcity run start Kotlin_KotlinDev_AggregateTrigger --branch @this |