Skip to content
clonegocdtpl.py 2.4 KiB
Newer Older
Yuanle Song's avatar
Yuanle Song committed
#!/usr/bin/env python3
# coding=utf-8

"""clone gocd template using API.

tested against
- go-server 19.7
- using gocd v4 api

see https://api.gocd.org/19.7.0/#get-template-config

dependencies for this script:
apt install -y python3 python3-requests

Yuanle Song's avatar
Yuanle Song committed
"""

import logging
import argparse
import sys
import json

import requests


logger = logging.getLogger(__name__)


def main():
    parser = argparse.ArgumentParser(description='\
clone gocd template using gocd API')
    parser.add_argument('-g', '--go-server-url', required=True,
                        help='go server url, usually ends with /go/')
    parser.add_argument('-u', '--user', required=True, help='API user')
    parser.add_argument('-p', '--password', required=True, help='API password')
    parser.add_argument('-v', '--verbose', help='show debug log')
    parser.add_argument('source_template')
    parser.add_argument('target_template')

    args = parser.parse_args()
    logging.basicConfig(
        format='%(asctime)s %(name)s %(levelname)-8s %(message)s',
        level=logging.DEBUG if args.verbose else logging.INFO)

    auth = (args.user, args.password)
    go_server_url = args.go_server_url
    if not go_server_url.endswith("/"):
        go_server_url += "/"
    r = requests.get(
        '%sapi/admin/templates/%s' % (go_server_url, args.source_template),
        auth=auth,
        headers={"Accept": "application/vnd.go.cd.v4+json"})
    if r.status_code != 200:
        logger.error("get source_template %s failed: %s %s",
                     args.source_template, r.status_code, r.content)
        sys.exit(1)
    source_template_obj = r.json()
    target_template_obj = {
        "name": args.target_template,
        "stages": source_template_obj['stages'],
    }
    body = json.dumps(target_template_obj, indent=4)
    logger.debug("new template: %s", body)
    r = requests.post(go_server_url + 'api/admin/templates',
                      body,
                      auth=auth,
                      headers={"Accept": "application/vnd.go.cd.v4+json",
                               "Content-Type": "application/json",
                               "X-GoCD-Confirm": 'true'})
    if r.status_code != 200:
        logger.error("create target_template %s failed: %s %s",
                     args.target_template, r.status_code, r.content)
        sys.exit(1)
    logger.info("template %s created", args.target_template)


if __name__ == '__main__':
    main()