#!/usr/bin/env bash # vim:ts=4:sts=4:sw=4:et # # Author: Hari Sekhon # Date: 2020-08-27 16:38:30 +0100 (Thu, 27 Aug 2020) # # https://github.com/HariSekhon/bash-tools # # License: see accompanying Hari Sekhon LICENSE file # # If you're using my code you're welcome to connect with me on LinkedIn and optionally send me feedback to help steer this or other code I publish # # https://www.linkedin.com/in/HariSekhon # set -euo pipefail [ -n "${DEBUG:-}" ] && set -x srcdir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # shellcheck disable=SC1090 . "$srcdir/lib/utils.sh" # shellcheck disable=SC2034,SC2154 usage_description=" Queries the Teamcity API Requires \$TEAMCITY_TOKEN be available in the environment, generation a token here: \$TEAMCITY_URL/profile.html?item=accessTokens or https://\$TEAMCITY_HOST:\$TEAMCITY_PORT/profile.html?item=accessTokens \$TEAMCITY_URL or \$TEAMCITY_HOST must be set to point to the Teamcity server If \$TEAMCITY_HOST is used, then the following may also be set: \$TEAMCITY_PORT - defaults to 8111 and is only used if \$TEAMCITY_URL is not used \$TEAMCITY_SSL - defaults to http, any value enables https API Reference: https://www.jetbrains.com/help/teamcity/rest-api.html https://www.jetbrains.com/help/teamcity/rest-api-reference.html The API version used by default is latest, but you can specify an older API version like so: \$TEAMCITY_API_VERSION=2018.1 At time of writing, prior API versions are: 2018.1, 2017.2, 2017.1, 10.0, 9.1, 9.0, 8.1, 8.0. See: https://www.jetbrains.com/help/teamcity/rest-api.html#REST+API+Versions Examples: (don't forget to add '\$help' to the end to find out what attributes endpoints support): Remember you can check logs/teamcity-rest.log server log for these API requests See also: teamcity_builds.sh teamcity_agents.sh Explore API: ${0##*/} /server Explore supported requests and parameters: ${0##*/} /application.wadl Swagger endpoint: ${0##*/} /swagger.json Show Teamcity agents: ${0##*/} /agents Get an agent's details: ${0##*/} /agents/id:3 Get list of builds: ${0##*/} /builds Get list of builds filtered by successful status with a specific tag: ${0##*/} /builds?locator=status:SUCCESS,tag=dev Get list of projects: ${0##*/} /projects Get details on a specific project: ${0##*/} /projects/ or ${0##*/} /projects/id: Get list of revision control repositories roots: ${0##*/} /vcs-roots Get details on one specific revision control repository: ${0##*/} /vcs-roots/id: Get list of cloud profiles (kubernetes is configured here): ${0##*/} /cloud/profiles " # used by usage() in lib/utils.sh # shellcheck disable=SC2034 usage_args="/path []" # to speed up http basic auth: # # https://youtrack.jetbrains.com/issue/TW-14209 # # https://youtrack.jetbrains.com/issue/TW-36844#comment=27-752545 # # used to put this in /tmp but it is created world readable by default and when securing it there is a race condition # between the 2 curl and chmod lines, whereas $HOME is more likely to be read restricted # now additionally this is initialized with restricted permissions before it is ever used to avoid this race condition cookie_jar="$HOME/.teamcity_cookie_jar_${EUID}" touch "$cookie_jar" chown "$(whoami)" "$cookie_jar" chmod 0600 "$cookie_jar" CURL_OPTS="-sS --fail --connect-timeout 3 -b $cookie_jar -c $cookie_jar ${CURL_OPTS:-}" # don't enforce as hard requirements here, instead try alternation further down and construct from what's available #check_env_defined "TEAMCITY_URL" #check_env_defined "TEAMCITY_HOST" #check_env_defined "TEAMCITY_TOKEN" help_usage "$@" min_args 1 "$@" if [ -n "${TEAMCITY_URL:-}" ]; then url_base="${TEAMCITY_URL%%/}" else protocol="http" if [ -n "${TEAMCITY_SSL:-}" ]; then protocol="https" fi [ -n "${TEAMCITY_HOST:-}" ] || usage "neither \$TEAMCITY_URL nor \$TEAMCITY_HOST defined in environment" host="$TEAMCITY_HOST" port="${TEAMCITY_PORT:-8111}" url_base="$protocol://$host:$port" fi # for superuser account, empty username and system generated password, but curl_auth.sh won't allow that by default so you'd have to USERNAME="" USER="" curl_auth.sh to prevent it trying to infer an username if [ -n "${TEAMCITY_TOKEN:-}" ]; then export TOKEN="$TEAMCITY_TOKEN" else # XXX: might have to disable this is configuring CORS, see here: # # https://www.jetbrains.com/help/teamcity/rest-api.html#CORS-support # # for HTTP basic auth, set this to force it url_base+="/httpAuth" fi url_base+="/app/rest" # fix to a specific API version, but teamcity only supports one legacy API version so this is more likely to break things over time :-/ (currently 2018.1) if [ -n "${TEAMCITY_API_VERSION:-}" ]; then #url_base+="/2018.1" url_base+="/${TEAMCITY_API_VERSION##/}" fi url_path="$1" shift || : url_path="${url_path##/}" # need CURL_OPTS splitting, safer than eval # shellcheck disable=SC2086 # XML by default :-/ "$srcdir/curl_auth.sh" -H "Accept: application/json" $CURL_OPTS "$url_base/$url_path" "$@" chmod 0600 "$cookie_jar" # args: /swagger.json | jq . # args: /server | jq . # get all the API details, takes a moment to query # args: /projects | jq . # args: /users | jq . # you might get a 403 Forbidden # args: /application.wadl | jq . # 406 # args: /agents | jq . # args: /agents/id:10 | jq. # args: /builds | jq . # args: /builds?locator=status:SUCCESS,tag=dev | jq . # args: /vcs-roots | jq . # run: teamcity_api.sh /vcs-roots | jq -r '."vcs-root"[].id' | while read -r id; do teamcity_api.sh "/vcs-roots/id:$id"; break; done | jq . # args: /cloud/profiles