Artifacts/linux-vsts-build-agent/agent-install.py (92 lines of code) (raw):

#!/usr/bin/python3 from argparse import ArgumentParser from socket import gethostname from os import path, makedirs, environ from sys import argv from tempfile import TemporaryDirectory from subprocess import run, PIPE, STDOUT from requests import get from json import loads def parse_args(args): parser = ArgumentParser() parser.add_argument("-p", "--agent_path", required = True) parser.add_argument("-t", "--ado_pat", required = True) parser.add_argument("-a", "--ado_account", required = True) parser.add_argument("-l", "--ado_pool", required = True) parser.add_argument("-n", "--agent_name", required = False) result = parser.parse_args(args) if not result.agent_name: result.agent_name = gethostname() return result def combine_command(command): return " ".join(command) def failed(results): return results.returncode != 0 def execute_command_silent(command, cwd = None, env = None): results = run(command, stdout = PIPE, stderr = STDOUT, cwd = cwd, env = env) if failed(results): raise Exception(f"{combine_command(command)} failed. stdout={results.stdout} stderr={results.stderr}") return results def execute_command(command, cwd = None, env = None): print (combine_command(command)) return execute_command_silent(command, cwd = cwd, env = env) def ensure_directory(dir): if not path.exists(dir): makedirs(dir) def get_package_url(args): url = f"https://{args.ado_account}.visualstudio.com/_apis/distributedtask/packages/agent/linux-x64?$top=1&api-version=3.0" print(f"fetching {url} to determine agent package url") response = get(url, auth=("AzureDevTestLabs", args.ado_pat)) as_json = loads(response.text) return as_json["value"][0]["downloadUrl"] def download_and_extract_agent_package(args): with TemporaryDirectory() as temp_dir: execute_command([ "wget", "--secure-protocol", "TLSv1_2", "-O", "agent.tgz", get_package_url(args) ], cwd = str(temp_dir)) execute_command([ "tar", "zxvf", f"{temp_dir}/agent.tgz" ], cwd = args.agent_path) def install_dependencies(agent_path): execute_command([ "sudo", "bin/installdependencies.sh" ], cwd = agent_path) def configure_agent(args): d = dict(environ) d["AGENT_ALLOW_RUNASROOT"] = str("1") execute_command([ "./config.sh", "--unattended", "--url", f"https://{args.ado_account}.visualstudio.com", "--auth", "pat", "--pool", args.ado_pool, "--agent", args.agent_name, "--work", f"{args.agent_path}/_work", "--token", args.ado_pat ], cwd = args.agent_path, env = d) def install_and_start(agent_path): execute_command([ "sudo", "./svc.sh", "install" ], cwd = agent_path) execute_command([ "sudo", "./svc.sh", "start" ], cwd = agent_path) def main(): args = parse_args(argv[1:]) ensure_directory(args.agent_path) download_and_extract_agent_package(args) install_dependencies(args.agent_path) configure_agent(args) install_and_start(args.agent_path) return 0 if __name__ == "__main__": exit(main())