61 lines
1.5 KiB
Python
61 lines
1.5 KiB
Python
|
#!/usr/bin/env python
|
||
|
|
||
|
# internal use only
|
||
|
# called by CI jobs to determine if it need to be executed
|
||
|
|
||
|
import os
|
||
|
import re
|
||
|
import sys
|
||
|
import json
|
||
|
|
||
|
|
||
|
RE_FILTER_PATTERN = re.compile(r'^r"(.+)?"$')
|
||
|
|
||
|
RE_TYPE = type(re.compile("", 0))
|
||
|
|
||
|
|
||
|
def parse_filter(filter_name):
|
||
|
filter_raw = os.getenv(filter_name)
|
||
|
filters = []
|
||
|
if filter_raw:
|
||
|
filter_data = json.loads(filter_raw)
|
||
|
for _filter in filter_data:
|
||
|
match = RE_FILTER_PATTERN.search(_filter)
|
||
|
if match:
|
||
|
filters.append(re.compile(match.group(1)))
|
||
|
else:
|
||
|
filters.append(_filter)
|
||
|
return filters
|
||
|
|
||
|
|
||
|
def process_filter(filter_name, ci_name):
|
||
|
execute = True
|
||
|
|
||
|
# bot message is case insensitive (processed with lower case). so we also convert ci_name to lower case.
|
||
|
ci_name = ci_name.lower()
|
||
|
|
||
|
filter_list = parse_filter(filter_name)
|
||
|
|
||
|
for _filter in filter_list:
|
||
|
if isinstance(_filter, RE_TYPE):
|
||
|
match = _filter.search(ci_name) is not None
|
||
|
else:
|
||
|
match = _filter == ci_name
|
||
|
|
||
|
if match:
|
||
|
execute = True
|
||
|
break
|
||
|
else:
|
||
|
execute = False
|
||
|
return execute
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
need_to_execute = process_filter("BOT_STAGE_FILTER", os.getenv("CI_JOB_STAGE")) \
|
||
|
and process_filter("BOT_JOB_FILTER", os.getenv("CI_JOB_NAME"))
|
||
|
if need_to_execute:
|
||
|
sys.exit(0)
|
||
|
else:
|
||
|
print("Skip this job as it doesn't fit @bot's filter")
|
||
|
sys.exit(-1)
|