Ajout Gitea

This commit is contained in:
nyanloutre 2018-11-04 23:06:23 +01:00
parent 57293bd7bc
commit 9634d053e8
1 changed files with 67 additions and 2 deletions

View File

@ -10,12 +10,12 @@ import tarfile
from tempfile import TemporaryDirectory from tempfile import TemporaryDirectory
from multiprocessing import Pool from multiprocessing import Pool
from gitlab import Gitlab from gitlab import Gitlab
import urllib.request
import json
import argparse import argparse
def gitlab_build(payload, gl): def gitlab_build(payload, gl):
payload = payload
gl = gl
commit = gl.projects.get(payload['project']['path_with_namespace']).commits.get(payload['checkout_sha']) commit = gl.projects.get(payload['project']['path_with_namespace']).commits.get(payload['checkout_sha'])
commit.statuses.create({'state': 'running', 'name': 'Python CI'}) commit.statuses.create({'state': 'running', 'name': 'Python CI'})
@ -66,6 +66,69 @@ class GitlabHook(object):
raise HTTPNotFound raise HTTPNotFound
def gitea_status_update(repo, commit, token, status):
url = 'https://gitea.nyanlout.re/api/v1/repos/' + repo + '/statuses/' + commit
print(url)
req = urllib.request.Request(url)
req.add_header('Content-Type', 'application/json; charset=utf-8')
req.add_header('accept', 'application/json')
req.add_header('Authorization', 'token ' + token)
jsondata = json.dumps({'state': status}).encode('utf-8')
req.add_header('Content-Length', len(jsondata))
urllib.request.urlopen(req, jsondata)
def gitea_build(payload, token):
commit = payload['after']
repo = payload['repository']['full_name']
gitea_status_update(repo, commit, token, 'pending')
print("push from " + payload['pusher']['username'])
print("repo: " + repo)
print("commit: " + commit)
temp_dir = TemporaryDirectory()
repo_dir = temp_dir.name + '/' + payload['repository']['name']
archive_url = payload['repository']['html_url'] + '/archive/' + commit + '.tar.gz'
with urllib.request.urlopen(archive_url) as gitea_archive:
with tarfile.open(fileobj=gitea_archive, mode='r|gz') as gitea_repo_files:
gitea_repo_files.extractall(path=temp_dir.name)
check_call(['ls', '-lha', repo_dir])
try:
check_call(['nix-build', '-o', args.output + '/' + repo, repo_dir])
except CalledProcessError:
gitea_status_update(repo, commit, token, 'failure')
print("erreur build")
else:
gitea_status_update(repo, commit, token, 'success')
print("build terminé")
@view_defaults(
route_name="gitea_payload", renderer="json", request_method="POST"
)
class GiteaHook(object):
def __init__(self, request):
self.request = request
self.payload = self.request.json
self.whitelist = ['nyanloutre/site-musique']
self.secret = open(args.secret, 'r').readline().splitlines()[0]
self.gitea_token = open(args.gitea_token, 'r').readline().splitlines()[0]
@view_config(header="X-Gitea-Event:push")
def push_hook(self):
if self.payload['repository']['full_name'] in self.whitelist and self.payload['secret'] == self.secret:
pool.apply_async(gitea_build, (self.payload, self.gitea_token))
return "build started"
else:
raise HTTPNotFound
if __name__ == "__main__": if __name__ == "__main__":
parser = argparse.ArgumentParser(description='CI server') parser = argparse.ArgumentParser(description='CI server')
parser.add_argument('--address', help='listening address', default='127.0.0.1') parser.add_argument('--address', help='listening address', default='127.0.0.1')
@ -73,6 +136,7 @@ if __name__ == "__main__":
parser.add_argument('--output', help='output directory') parser.add_argument('--output', help='output directory')
parser.add_argument('--secret', help='repo secret file') parser.add_argument('--secret', help='repo secret file')
parser.add_argument('--gitlab-token', help='gitlab token file') parser.add_argument('--gitlab-token', help='gitlab token file')
parser.add_argument('--gitea-token', help='gitea token file')
args = parser.parse_args() args = parser.parse_args()
pool = Pool(1) pool = Pool(1)
@ -80,6 +144,7 @@ if __name__ == "__main__":
config = Configurator() config = Configurator()
config.add_route("gitlab_payload", "/gitlab_payload") config.add_route("gitlab_payload", "/gitlab_payload")
config.add_route("gitea_payload", "/gitea_payload")
config.scan() config.scan()
app = config.make_wsgi_app() app = config.make_wsgi_app()