From 3fafe644a9ce713000107100fc653c5343a21abf Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Sun, 7 Jul 2019 20:46:41 +0300 Subject: Change: vcsworker now sets GitLab CI project variable to API token --- api.py | 55 +++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 39 insertions(+), 16 deletions(-) diff --git a/api.py b/api.py index 234ebc7..cbde310 100755 --- a/api.py +++ b/api.py @@ -203,8 +203,9 @@ class VCSWorker(API): GITLAB_DOMAIN = 'wmf-gitlab3.vm.liw.fi' GITLAB_PROJECT = 'liw' - def __init__(self, gitlab_token): - self._token = gitlab_token + def __init__(self, gitlab_token, artifact_token): + self._gitlab_token = gitlab_token + self._artifact_token = artifact_token self._tmpdir = tempfile.mkdtemp() logging.info('Workspace: %s', self._tmpdir) @@ -227,17 +228,22 @@ class VCSWorker(API): name = spec['gitlab'] dirname = os.path.join(self._tmpdir, name) - if self._clone(url, ref, dirname): - ok = self._remove( - self._token, self.GITLAB_DOMAIN, self.GITLAB_PROJECT, name) - if ok: - ok = self._create_repo(self._token, self.GITLAB_DOMAIN, name) - if ok: - ok = self._push( - dirname, self.GITLAB_DOMAIN, self.GITLAB_PROJECT, ref, - name) - if ok: - return 'Repository copied successfully\n' + T = self._gitlab_token + D = self.GITLAB_DOMAIN + P = self.GITLAB_PROJECT + + key = 'ARTIFACT_TOKEN' + value = self._artifact_token + + def update(): + return (self._clone(url, ref, dirname) and + self._remove(T, D, P, name) and + self._create_repo(T, D, name) and + self._set_var(T, D, P, name, key, value) and + self._push(dirname, D, P, ref, name)) + + if update(): + return 'Repository copied successfully\n' logging.error('Something went wrong when copying repository') return bottle.HTTPError(418) @@ -267,6 +273,23 @@ class VCSWorker(API): ] return runcmd('.', argv, self.MAX_CREATE_REPO_TIME) + + def _set_var(self, token, gitlab_domain, gitlab_project, name, key, value): + logging.info( + 'Setting variable for %s/%s: %s=%s', + gitlab_project, name, key, value) + name = urllib.parse.quote('%s/%s' % (gitlab_project, name), safe='') + url = 'https://%s/api/v4/projects/%s/variables' % (gitlab_domain, name) + argv = [ + 'curl', + url, + '-sv', '-X' 'POST', + '-d', 'key=%s' % key, + '-d', 'value=%s' % value, + '-HPRIVATE-TOKEN: %s' % token, + ] + return runcmd('.', argv, self.MAX_CREATE_REPO_TIME) + def _push(self, dirname, gitlab_domain, gitlab_project, ref, name): logging.info('Pushing %s to %s as %s', dirname, gitlab_domain, name) url = 'ssh://git@%s/%s/%s.git' % (gitlab_domain, gitlab_project, name) @@ -324,9 +347,9 @@ def main(): if cmd == 'controller': api = Controller() elif cmd == 'vcsworker': - gitlab_token_filename = args.pop(0) - gitlab_token = get_token_from_file(gitlab_token_filename) - api = VCSWorker(gitlab_token) + gitlab_token = get_token_from_file(args.pop(0)) + artifact_token = get_token_from_file(args.pop(0)) + api = VCSWorker(gitlab_token, artifact_token) else: sys.exit('Unknown command %s' % cmd) -- cgit v1.2.1