github-custom-actions
Библиотека упрощающая создание custom GitHub Actions.
Как создать свой GitHub Action за 5 минут.
Библиотека может работать даже с Python 3.8 чтобы поддерживать древние self-hosted action runners.
Быстрый старт
from github_custom_actions import ActionBase
class MyAction(ActionBase):
def main(self):
self.outputs["runner-os"] = self.env.runner_os
self.summary.text += (
self.render(
"### {{ inputs['my-input'] }}.\n"
"Have a nice day!"
)
)
if __name__ == "__main__":
MyAction().run()
Этот пример использует переменную runner_os из [переменных окружения GitHub][runner_os][github_custom_actions.GithubVars].
Все переменные из окружения GitHub доступны в env
,
описания которых отображаются в вашей IDE при наведении мыши:
Action получает значение из action input my-input
и отображает его
в step summary на странице билда GitHub.
Оно также возвращает значение в action output runner-os
.
run()
в основном блоке запускает метод main() реализующий вашу Github action.
Явно определенные входы и выходы
С явно определенными входами и выходами вы можете использовать автодополнение кода с проверкой на опечатки:
from pathlib import Path
from github_custom_actions import ActionBase, ActionInputs, ActionOutputs
class MyInputs(ActionInputs):
my_input: str
"""My input description"""
my_path: Path
"""My path description"""
class MyOutputs(ActionOutputs):
runner_os: str
"""Runner OS description"""
class MyAction(ActionBase):
inputs: MyInputs
outputs: MyOutputs
def main(self):
if self.inputs.my_path is None:
raise ValueError("my-path is required")
self.inputs.my_path.mkdir(exist_ok=True)
self.outputs.runner_os = self.env.runner_os
self.summary.text += (
self.render(
"### {{ inputs.my_input }}.\n"
"Have a nice day, {{ inputs['name'] }}!"
)
)
if __name__ == "__main__":
MyAction().run()
Обратите внимание, что вы только определяете типы входов и выходов, а экземпляры этих классов создаются автоматически при инициализации ActionBase.
Теперь вы можете использовать атрибуты, определенные в классах inputs
и outputs
действия.
Все имена атрибутов преобразуются в kebab-case
, что позволяет использовать точечную нотацию, например inputs.my_input
,
вместо inputs['my-input']
.
Если вы определили input как Path
, он будет преобразован в объект Path
.
При желании вы все также можете использовать стиль inputs['my-input']
.