diff --git a/gitlab-api-opressor/.gitignore b/gitlab-api-opressor/.gitignore index 0a764a4de3a890dbe2a3336c648f7f6d1892c132..ef2f78902e2c569452265fa67753372a3a6cdbb4 100644 --- a/gitlab-api-opressor/.gitignore +++ b/gitlab-api-opressor/.gitignore @@ -1 +1,5 @@ env +venv +.venv +.idea +__pycache__ diff --git a/gitlab-api-opressor/README.md b/gitlab-api-opressor/README.md index d74f34d2546261c902d85462c5ed05e201826075..007b725bb99a576a24b4b5490def7fbcf6ceb13c 100644 --- a/gitlab-api-opressor/README.md +++ b/gitlab-api-opressor/README.md @@ -1,8 +1,10 @@ -# Scripts to regulate git.sch repo's +# Scripts to regulate repo's ## Usage ```sh +echo -n 'gitlab personal token' > env + # install virtualenv on your machine pip3 install --user virtualenv export PATH="~/.local/bin:$PATH" @@ -17,5 +19,5 @@ cp env.example env vim env # rule them all -./regulator.sh +./run.sh ``` \ No newline at end of file diff --git a/gitlab-api-opressor/delete_merged_branches.py b/gitlab-api-opressor/delete_merged_branches.py new file mode 100644 index 0000000000000000000000000000000000000000..1ad194364866719b699dd529342ee89a92c54844 --- /dev/null +++ b/gitlab-api-opressor/delete_merged_branches.py @@ -0,0 +1,14 @@ +from functions import * + + +def repo_action(project_meta): + path = "/projects/" + str(project_meta['id']) + "/repository/merged_branches" + r = requests.delete(url=get_url(path)) + if r.ok: + print("Updated: " + project_meta['name']) + else: + print("ERROR: " + project_meta['name']) + + +if __name__ == "__main__": + iterate_on_groups(repo_action) diff --git a/gitlab-api-opressor/env.example b/gitlab-api-opressor/env.example deleted file mode 100644 index d0898fe16755bc47f1e3182005d6a00127f00633..0000000000000000000000000000000000000000 --- a/gitlab-api-opressor/env.example +++ /dev/null @@ -1 +0,0 @@ -PERSONAL_API_TOKEN=secret diff --git a/gitlab-api-opressor/functions.py b/gitlab-api-opressor/functions.py new file mode 100644 index 0000000000000000000000000000000000000000..8df7133475ebccf55e0af7be82cee52fc11a7fdd --- /dev/null +++ b/gitlab-api-opressor/functions.py @@ -0,0 +1,35 @@ +import requests + +personal_token = "please create an env file" + + +def get_url(path, extra="") -> str: + url = 'https://git.sch.bme.hu/api/v4/' + url += path + url += "?" + url += "access_token=" + personal_token + extra + return url + + +def request(path): + r = requests.get(url=get_url(path)) + return r.json() + + +def iterate_group(group_id: str, repo_action): + url = "groups/" + group_id + group = request(url) + for project_meta in group['projects']: + if not project_meta['archived']: + repo_action(project_meta) + subgroups = request(url + "/subgroups") + + for subgroup in subgroups: + iterate_group(str(subgroup['id']), repo_action) + + +def iterate_on_groups(repo_action): + global personal_token + env_file = open("env", "r") + personal_token = env_file.read() + iterate_group("1604", repo_action) diff --git a/gitlab-api-opressor/list_projects.py b/gitlab-api-opressor/list_projects.py new file mode 100644 index 0000000000000000000000000000000000000000..b8bcdaebbf5c3186db903fd93140e14fbec061a7 --- /dev/null +++ b/gitlab-api-opressor/list_projects.py @@ -0,0 +1,9 @@ +from functions import * + + +def repo_action(project_meta): + print('git clone ' + project_meta['ssh_url_to_repo']) + + +if __name__ == "__main__": + iterate_on_groups(repo_action) diff --git a/gitlab-api-opressor/regulator.sh b/gitlab-api-opressor/regulator.sh deleted file mode 100755 index ce7a40e13004773a35649dcea49e3753d6116636..0000000000000000000000000000000000000000 --- a/gitlab-api-opressor/regulator.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -# halt on error -set -e - -source ./env -export PERSONAL_API_TOKEN - -log() { - echo '######################' - echo "# $*" - echo '######################' -} - -log 'Setup all the things' -python3 setup.py diff --git a/gitlab-api-opressor/requirements.txt b/gitlab-api-opressor/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..f2293605cf1b01dca72aad0a15c45b72ed5429a2 --- /dev/null +++ b/gitlab-api-opressor/requirements.txt @@ -0,0 +1 @@ +requests diff --git a/gitlab-api-opressor/setup.py b/gitlab-api-opressor/setup.py deleted file mode 100644 index 8fc7b830ad2a2d037d876a9634acf9c99feccb6f..0000000000000000000000000000000000000000 --- a/gitlab-api-opressor/setup.py +++ /dev/null @@ -1,126 +0,0 @@ -# importing the requests library -import requests -import os - -host = "git.sch.bme.hu" -personal_token = os.environ['PERSONAL_API_TOKEN'] - - -def get_url(path) -> str: - url = "https://" - url += host - url += "/api/v4/" - url += path - url += "?" - url += "access_token=" + personal_token - return url - - -def request(path): - r = requests.get(url=get_url(path)) - return r.json() - - -def iterate_group(group_id: int): - url = "groups/" + str(group_id) - group = request(url) - for project_meta in group['projects']: - repo_action(project_meta) - subgroups = request(url + "/subgroups") - - for subgroup in subgroups: - iterate_group(str(subgroup['id'])) - - -def repo_action(project_meta): - # print(project_meta) - setup_project(project_meta) - add_youtrack(project_meta) - add_mattermost(project_meta) - check_tags(project_meta) - - -def update_project(project_meta, data, postfix=''): - path = 'projects/' + str(project_meta['id']) + postfix - r = requests.put(url=get_url(path), data=data) - if r.ok: - print("Updated: " + project_meta['name']) - else: - print("ERROR: " + project_meta['name']) - - -def setup_project(project_meta): - data = { - 'merge_method': 'rebase_merge', - - 'merge_requests_enabled': True, - 'lfs_enabled': True, - 'only_allow_merge_if_pipeline_succeeds': True, - 'only_allow_merge_if_all_discussions_are_resolved': True, - 'remove_source_branch_after_merge': True, - - 'issues_enabled': False, - 'snippets_enabled': False, - 'wiki_enabled': False, - 'container_registry_enabled': False, - 'shared_runners_enabled': False, - 'auto_devops_enabled': False - } - update_project(project_meta, data) - - -def add_youtrack(project_meta): - postfix = '/services/youtrack' - yt = 'https://youtrack.kszk.bme.hu/' - data = { - 'issues_url': yt + 'issue/:id', - 'project_url': yt + '/projects/9b25aaac-1002-4fbc-ab29-c4bc7ff365da', - 'description': 'KSZK YouTrack' - } - update_project(project_meta, data, postfix) - - -def add_mattermost(project_meta): - postfix = '/services/mattermost' - mm = 'https://mattermost.kszk.bme.hu/hooks' - data = { - 'webhook': mm + '/c57a1tbduj8k9rsh71jd1gufey', - 'notify_only_broken_pipelines': True, - 'merge_requests_events': True, - 'tag_push_events': True - } - update_project(project_meta, data, postfix) - - -def check_tags(project_meta): - path = 'projects/' - path += str(project_meta['id']) - path += '/protected_tags' - tags = request(path) - # unprotect_tags(path, tags) - if len(tags) == 0: - protect_tags(path) - - -def protect_tags(path): - data = { - 'name': '1.*', - 'create_access_level': '40' - } - r = requests.post(url=get_url(path), data=data) - if r.ok: - print("Protected") - else: - print("ERROR protecting tag") - - -def unprotect_tags(path, tags): - path += '/' + tags[0]['name'] - r = requests.delete(url=get_url(path)) - if r.ok: - print("tag deleted") - else: - print("ERROR deleting tag") - - -iterate_group(1604) diff --git a/gitlab-api-opressor/setup_projects.py b/gitlab-api-opressor/setup_projects.py new file mode 100644 index 0000000000000000000000000000000000000000..d3efae6214e5dc1dc1ae837392a7fb95c0e4650c --- /dev/null +++ b/gitlab-api-opressor/setup_projects.py @@ -0,0 +1,39 @@ +from functions import * + + +def repo_action(project_meta): + setup_project(project_meta) + + +def update_project(project_meta, data, postfix=''): + path = 'projects/' + str(project_meta['id']) + postfix + r = requests.put(url=get_url(path), data=data) + if r.ok: + print("Updated: " + project_meta['name']) + else: + print("ERROR: " + project_meta['name']) + print(r.content) + + +def setup_project(project_meta): + data = { + 'merge_method': 'rebase_merge', + + 'merge_requests_enabled': True, + 'lfs_enabled': True, + 'only_allow_merge_if_pipeline_succeeds': True, + 'only_allow_merge_if_all_discussions_are_resolved': True, + 'remove_source_branch_after_merge': True, + + 'issues_enabled': False, + 'snippets_enabled': False, + 'wiki_enabled': False, + 'container_registry_enabled': False, + 'shared_runners_enabled': False, + 'auto_devops_enabled': False + } + update_project(project_meta, data) + + +if __name__ == "__main__": + iterate_on_groups(repo_action)