Compare commits

..
15 Commits
Author SHA1 Message Date
brb 9513eb488b adapted to new definition 2023-07-06 15:58:25 +02:00
brb a51c49e8f4 adapted to new definition 2023-07-06 15:58:15 +02:00
brb dba476e78a updated definition 2023-07-06 15:58:03 +02:00
brb 87a738461c defined runner script 2023-07-06 15:54:20 +02:00
brb 40c9b7442d added printing of content from runner script 2023-07-06 15:53:34 +02:00
brb c1aa6f3c41 added function to read runner script 2023-07-06 15:53:15 +02:00
brb 9102d03ef4 created runner script 2023-07-06 15:53:00 +02:00
brb 5c21aa767f installed packages 2023-07-06 13:27:32 +02:00
brb 3187248fb9 [skip ci] fixed bug when accessing /test 2023-07-06 13:22:32 +02:00
brb ed05a8eca5 update root page 2023-07-06 13:20:24 +02:00
brb 02ec54fd16 updated response text 2023-07-06 13:15:16 +02:00
brb 9fffa861e7 added checking for presence of runner script 2023-07-06 13:10:13 +02:00
brb 3a73c9cf6e added more detailed responses to requests 2023-07-06 12:58:09 +02:00
brb 387e739a07 [skip ci] testing if ci is skipped correctly 2023-07-06 12:54:12 +02:00
brb 39d1ac1474 moved definition of class to separate file 2023-07-06 12:50:30 +02:00
7 changed files with 108 additions and 23 deletions
+45 -21
View File
@@ -1,50 +1,74 @@
import uvicorn import uvicorn
from fastapi import FastAPI, Request from fastapi import FastAPI, Request, HTTPException
from fastapi.responses import HTMLResponse
from dotenv import load_dotenv from dotenv import load_dotenv
import logging import logging
from pydantic import BaseModel
from typing import List from typing import List
import os import os
from utils import clone_repository from utils import clone_repository, load_runner_script
from setup_logging import setup_logging from setup_logging import setup_logging
from gitea_request import GiteaRequest
class GiteaRequest(BaseModel):
ref: str
before: str
after: str
compare_url: str
commits: List[dict]
total_commits: int
head_commit: dict
repository: dict
pusher: dict
sender: dict
app = FastAPI() app = FastAPI()
@app.get('/') @app.get('/', response_class=HTMLResponse)
async def root(): async def root():
return '<h1>Welcome to Gitea Runsner</h1>' content_str = """
<html>
<head>
<title>Gitea Runner</title>
</head>
<body>
<h1>Welcome to Gitea Runner</h1>
<p>see /docs for more information</p>
</body>
</html>
"""
return HTMLResponse(content=content_str, status_code=200)
@app.post('/test') @app.post('/test')
async def test(request: Request): async def test(request: Request):
""" Test connection to server. """ """ Test connection to server. """
logging.debug('Content-Type: ', request.headers.get('content-type')) logging.debug('Content-Type: ', request.headers.get('content-type'))
return {'status': 'success'} raise HTTPException(
status_code=200,
detail='test completed'
)
@app.post('/event') @app.post('/event')
def handle_event(request: GiteaRequest): def handle_event(request: GiteaRequest):
""" Handle event from webhook. """ """ Handle event from webhook. """
# stop early if allowed # stop early if asked
commit_msg = request.head_commit['message'] commit_msg = request.head_commit['message']
if commit_msg.lower().startswith('[skip ci]'): if commit_msg.lower().startswith('[skip ci]'):
return {'status': 'received task'} raise HTTPException(
status_code=200,
detail='skipping ci'
)
# clone repository # clone repository
repo_url = request.repository['clone_url'] repo_url = request.repository['clone_url']
logging.info('cloning repository: {repo_url}') logging.info('cloning repository: {repo_url}')
local_repo_dir = clone_repository(repo_url) local_repo_dir = clone_repository(repo_url)
return {'status': 'success'} logging.info(f'local_repo_dir: {local_repo_dir}')
# locate runner script
runner_script_path = local_repo_dir / 'runner_script.yml'
if not runner_script_path.exists():
raise HTTPException(
status_code=200,
detail="no runner_script.yml in repository root"
)
# load runner commands
runner_script = load_runner_script(path=runner_script_path)
for pipeline_name, pipeline_step in runner_script.pipelines.items():
print(pipeline_name)
print(pipeline_step)
# send response
raise HTTPException(
status_code=202,
detail='received task'
)
if __name__ == '__main__': if __name__ == '__main__':
load_dotenv('dev.env') load_dotenv('dev.env')
+14
View File
@@ -0,0 +1,14 @@
from pydantic import BaseModel
from typing import List
class GiteaRequest(BaseModel):
ref: str
before: str
after: str
compare_url: str
commits: List[dict]
total_commits: int
head_commit: dict
repository: dict
pusher: dict
sender: dict
+22
View File
@@ -0,0 +1,22 @@
from pydantic import BaseModel
from typing import List, Dict
import yaml
from pathlib import Path
class Pipeline(BaseModel):
name: str
requirements: str
script: List[str]
class RunnerScript(BaseModel):
pipelines: Dict[str, Pipeline]
if __name__ == '__main__':
path = Path(__file__).parent.parent / 'runner_script.yml'
with open(path, 'r') as fh:
script = yaml.safe_load(fh)
runner_script = RunnerScript.parse_obj(script)
print(runner_script)
for k, v in runner_script.pipelines.items():
print(k)
print(v)
+11
View File
@@ -1,9 +1,12 @@
from pydantic import AnyHttpUrl from pydantic import AnyHttpUrl
from typing import List
from pathlib import Path from pathlib import Path
from git import Repo from git import Repo
import logging import logging
import shutil import shutil
import os import os
import yaml
from runner_script import RunnerScript
def clone_repository(repo_url: AnyHttpUrl) -> Path: def clone_repository(repo_url: AnyHttpUrl) -> Path:
# extract repo name # extract repo name
@@ -19,3 +22,11 @@ def clone_repository(repo_url: AnyHttpUrl) -> Path:
Repo.clone_from(url=repo_url, to_path=dst_dir) Repo.clone_from(url=repo_url, to_path=dst_dir)
logging.debug('finished') logging.debug('finished')
return dst_dir return dst_dir
def load_runner_script(path: Path) -> RunnerScript:
assert path.exists()
with open(path, 'r') as fh:
script = yaml.safe_load(fh)
runner_script = RunnerScript.parse_obj(script)
return runner_script
+1
View File
@@ -37,6 +37,7 @@ pydantic==1.10.11
Pygments==2.15.1 Pygments==2.15.1
python-dateutil==2.8.2 python-dateutil==2.8.2
python-dotenv==1.0.0 python-dotenv==1.0.0
PyYAML==6.0
pyzmq==25.1.0 pyzmq==25.1.0
six==1.16.0 six==1.16.0
smmap==5.0.0 smmap==5.0.0
+1
View File
@@ -2,3 +2,4 @@ uvicorn==0.16.0
fastapi==0.99.1 fastapi==0.99.1
GitPython==3.1.31 GitPython==3.1.31
python-dotenv==1.0.0 python-dotenv==1.0.0
PyYAML==6.0
+12
View File
@@ -0,0 +1,12 @@
definitions:
steps:
step: &step-test
name: test
requirements: req-prod.txt
script:
- command arg1 arg2
- command2 arg1 arg2
pipelines:
default:
<<: *step-test