Skip to content

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 при наведении мыши: var_ide_hover_docstring.jpg

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'].

Пример использования

Allure Test Report Action