Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .github/script/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Container image that runs your code
FROM python:3.6

RUN pip3 install requests -i https://mirrors.aliyun.com/pypi/simple/ && pip3 install art -i https://mirrors.aliyun.com/pypi/simple/
# Copies your code file from your action repository to the filesystem path `/` of the container
COPY seekdb.py /seekdb.py

# Code file to execute when the docker container starts up (`entrypoint.sh`)
ENTRYPOINT ["python3", "-u", "/seekdb.py"]
24 changes: 24 additions & 0 deletions .github/script/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# action.yml
name: 'call SeekDB Farm2 to run task'
description: ''
inputs:
pipeline_id:
description: 'pipeline_id'
required: true
project:
description: 'project'
required: true
timeout:
description: 'timeout'
required: false
default: '10800'
outputs:
success:
description: 'the status for the task'
runs:
using: 'docker'
image: 'Dockerfile'
args:
- ${{ inputs.pipeline_id }}
- ${{ inputs.project }}
- ${{ inputs.timeout }}
191 changes: 191 additions & 0 deletions .github/script/seekdb.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,191 @@
# -*- coding: utf-8 -*-
import copy
import os
import sys
import traceback
import time
import json
import requests
from enum import Enum
from http import HTTPStatus

from art import text2art

OUTPUT = {}
RESULT_FILE_KEY = "farm/seekdb_results/"
TASK_QUEUE_FILE_KEY = "farm/seekdb_jobs/{}.json"


def _range(start, last):
def to_str(pos):
if pos is None:
return ''
else:
return str(pos)

return to_str(start) + '-' + to_str(last)


def _make_range_string(range):
if range is None:
return ''

start = range[0]
last = range[1]

if start is None and last is None:
return ''

return 'bytes=' + _range(start, last)


class OssProxy:

def __init__(self, endpoint=""):
self.endpoint = endpoint

def get_object(self, key, _range=None):
url = "{}/{}".format(self.endpoint, key)
headers = {}
if _range is not None:
_range = (_range, None)
headers.update({"range": _make_range_string(_range)})
res = requests.get(url, headers=headers)
if res.status_code < 400:
result = res.content.decode()
return result
return ""

def get_object_meta(self, key):
url = "{}/{}".format(self.endpoint, key)
headers = {}
res = requests.head(url, headers=headers)
return res.headers

def exists_object(self, key):
...


class GithubProxy:

def __init__(self, host="api.github.com"):
self.host = host

def get_job_by_id(self, project, pipeline_id):
url = "https://{}/repos/{}/actions/runs/{}".format(
self.host, project, pipeline_id
)
try:
res = requests.get(
url, headers={
"Accept": "application/vnd.github+json"
}
)
status_code = res.status_code
if status_code == HTTPStatus.NOT_FOUND:
return {}
return res.json()
except:
traceback.print_exc()
return {}


class TaskStatusEnum(Enum):
submitting = 0
pending = 1
running = 2
stopping = 3
success = 4
fail = -1
kill = -2
timeout = -3
submit_task_fail = -4


def request(method, url, params=None, payload=None, timeout=10, data=None, without_check_status=False):
params = params or {}
try:
response = requests.request(
method,
url,
params=params,
json=payload,
data=data,
timeout=timeout
)
if not without_check_status and response.status_code >= 300:
try:
msg = response.json()["msg"]
except:
msg = response.text
print("[ERROR] MSG:{}".format(msg))
exit(1)
return response
except Exception:
import traceback
traceback.print_exc()
print("Please contact the management personnel for assistance !")
if not without_check_status:
exit(1)


def monitor_tasks(oss_proxy: OssProxy, github_pipeline_id, timeout):
end_time = time.time() + int(timeout)
end_task = False
while time.time() <= end_time:
if end_task is True:
pass
task_data = get_task_res(oss_proxy, github_pipeline_id)
if task_data:
end_task = True

time.sleep(1)
if task_data is not None:
task_status = int(task_data["status"])
if task_status <= TaskStatusEnum.fail.value:
print(TaskStatusEnum._value2member_map_[task_status])
print("there is the output url: {}".format(
"https://ce-farm.oceanbase-dev.com/farm2/ci/?id={}".format(task_data["task_id"])))
return False
elif task_status >= TaskStatusEnum.success.value:
print(TaskStatusEnum._value2member_map_[task_status])
print("there is the output url: {}".format(
"https://ce-farm.oceanbase-dev.com/farm2/ci/?id={}".format(task_data["task_id"])))
return True

time.sleep(5)
else:
...


def get_task_res(oss_proxy: OssProxy, github_pipeline_id):
try:
result_key = RESULT_FILE_KEY + "{}.json".format(github_pipeline_id)
origin_task_data = oss_proxy.get_object(result_key)
return json.loads(origin_task_data)
except:
return


def main(pipeline_id, project, timeout):
print("create a new task")
print("working....")
logo = text2art('SeekDB Farm2')
print(logo)
oss_proxy = OssProxy("https://obfarm-ce.oss-cn-hongkong.aliyuncs.com")
github_proxy = GithubProxy()
job_info = github_proxy.get_job_by_id(project, pipeline_id)
attempt_number = job_info["run_attempt"]
run_pipeline_id = "{}-{}".format(pipeline_id, attempt_number)
result = monitor_tasks(oss_proxy, run_pipeline_id, timeout)
if not result:
exit(1)


if __name__ == "__main__":
print(sys.argv)
if len(sys.argv) < 4:
print("Missing relevant parameters !")
OUTPUT.update({"success": -1})
sys.exit(1)
main(sys.argv[1], sys.argv[2], sys.argv[3])
30 changes: 30 additions & 0 deletions .github/workflows/seekdb-farm2.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
name: SeekDB Farm2

on:
pull_request:
branches: [ master,develop ]
types: [opened, reopened, synchronize, ready_for_review]
paths-ignore:
- 'docs/**'
- '.github/ISSUE_TEMPLATE/**'
- '.github/pull_request_template.md'
- 'README.md'
- 'README_CN.md'
- 'CONTRIBUTING.md'
schedule:
- cron: '30 9 * * *'

jobs:
seekdb:
if: ${{ github.repository_owner == 'oceanbase' && !github.event.pull_request.draft }}
name: seekdb
runs-on: ubuntu-latest
steps:
- name: Checkout workspace
uses: actions/checkout@v3
- name: action by seekdb
uses: ./.github/script/
id: seekdb
with:
pipeline_id: ${{ github.run_id }}
project: ${{ github.repository }}
Loading