By default, any job will run unless a filter is given, in that case the filter will determine if the job should run or not. Some jobs do not need to be run by default, and should only be triggered using the bot. For such jobs, BOT_NEEDS_TRIGGER_BY_NAME can added to environment variables.
64 lines
1.7 KiB
Python
Executable file
64 lines
1.7 KiB
Python
Executable file
#!/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(execute_by_default, filter_name, ci_name):
|
|
execute = execute_by_default
|
|
|
|
# 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__":
|
|
execute_by_default = True
|
|
if os.getenv("BOT_NEEDS_TRIGGER_BY_NAME", "0") == "1":
|
|
execute_by_default = False
|
|
|
|
need_to_execute = process_filter(True, "BOT_STAGE_FILTER", os.getenv("CI_JOB_STAGE")) \
|
|
and process_filter(execute_by_default, "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)
|