From 323bec567678efbb673934eef62c231a2f9f6700 Mon Sep 17 00:00:00 2001 From: Brian Scholer <1260690+briantist@users.noreply.github.com> Date: Sun, 16 Jan 2022 14:05:26 -0500 Subject: [PATCH 1/5] add some ansible to generate MD from actions/workflows --- .../internal/gha_docs/README.md | 3 ++ .../internal/gha_docs/galaxy.yml | 8 ++++ .../internal/gha_docs/meta/runtime.yml | 2 + .../gha_docs/playbooks/generate_docs.yml | 44 +++++++++++++++++++ .../roles/generate/files/output/.gitignore | 2 + .../roles/generate/meta/argument_specs.yml | 21 +++++++++ .../gha_docs/roles/generate/tasks/main.yml | 34 ++++++++++++++ .../roles/generate/templates/action.md.j2 | 20 +++++++++ .../roles/generate/templates/workflow.md.j2 | 27 ++++++++++++ 9 files changed, 161 insertions(+) create mode 100644 .internal/ansible/ansible_collections/internal/gha_docs/README.md create mode 100644 .internal/ansible/ansible_collections/internal/gha_docs/galaxy.yml create mode 100644 .internal/ansible/ansible_collections/internal/gha_docs/meta/runtime.yml create mode 100644 .internal/ansible/ansible_collections/internal/gha_docs/playbooks/generate_docs.yml create mode 100644 .internal/ansible/ansible_collections/internal/gha_docs/roles/generate/files/output/.gitignore create mode 100644 .internal/ansible/ansible_collections/internal/gha_docs/roles/generate/meta/argument_specs.yml create mode 100644 .internal/ansible/ansible_collections/internal/gha_docs/roles/generate/tasks/main.yml create mode 100644 .internal/ansible/ansible_collections/internal/gha_docs/roles/generate/templates/action.md.j2 create mode 100644 .internal/ansible/ansible_collections/internal/gha_docs/roles/generate/templates/workflow.md.j2 diff --git a/.internal/ansible/ansible_collections/internal/gha_docs/README.md b/.internal/ansible/ansible_collections/internal/gha_docs/README.md new file mode 100644 index 0000000..4cb20bf --- /dev/null +++ b/.internal/ansible/ansible_collections/internal/gha_docs/README.md @@ -0,0 +1,3 @@ +## `internal.gha_docs` + +An internal collection for generating markdown docs from the actions and shared workflows in this repo. diff --git a/.internal/ansible/ansible_collections/internal/gha_docs/galaxy.yml b/.internal/ansible/ansible_collections/internal/gha_docs/galaxy.yml new file mode 100644 index 0000000..66776e0 --- /dev/null +++ b/.internal/ansible/ansible_collections/internal/gha_docs/galaxy.yml @@ -0,0 +1,8 @@ +--- +namespace: internal +name: gha_docs +description: A collection internal to this repository for generating documentation from GHA content. +version: 0.1.0 +readme: README.md +authors: + - Brian Scholer (@briantist) diff --git a/.internal/ansible/ansible_collections/internal/gha_docs/meta/runtime.yml b/.internal/ansible/ansible_collections/internal/gha_docs/meta/runtime.yml new file mode 100644 index 0000000..3b8a2bb --- /dev/null +++ b/.internal/ansible/ansible_collections/internal/gha_docs/meta/runtime.yml @@ -0,0 +1,2 @@ +--- +requires_ansible: '>=2.11,<2.13' diff --git a/.internal/ansible/ansible_collections/internal/gha_docs/playbooks/generate_docs.yml b/.internal/ansible/ansible_collections/internal/gha_docs/playbooks/generate_docs.yml new file mode 100644 index 0000000..6af35e2 --- /dev/null +++ b/.internal/ansible/ansible_collections/internal/gha_docs/playbooks/generate_docs.yml @@ -0,0 +1,44 @@ +--- +- hosts: localhost + gather_facts: false + vars: + # /.internal/ansible/ansible_collections/internal/gha_docs/playbooks + # ^6 ^5 ^4 ^3 ^2 ^1 ^ playbook_dir + repo_root: >- + {{ + playbook_dir + | dirname + | dirname + | dirname + | dirname + | dirname + | dirname + }} + actions_root: '{{ repo_root }}/actions' + workflows_root: '{{ repo_root }}/.github/workflows' + output_dir: '{{ role_path }}/files/output' + tasks: + - name: Find actions + ansible.builtin.find: + paths: '{{ actions_root }}' + recurse: true + patterns: action.yml + register: actions + + - name: Generate actions docs + ansible.builtin.include_role: + name: internal.gha_docs.generate + vars: + type: action + file: '{{ item.path }}' + output: '{{ output_dir }}/action_{{ item.path | dirname | basename }}.md' + loop: '{{ actions.files }}' + + - name: Generate workflow docs + ansible.builtin.include_role: + name: internal.gha_docs.generate + vars: + type: workflow + file: '{{ item }}' + output: '{{ output_dir }}/workflow{{ item | basename | splitext | first }}.md' + with_fileglob: '{{ workflows_root }}/_shared-*.yml' diff --git a/.internal/ansible/ansible_collections/internal/gha_docs/roles/generate/files/output/.gitignore b/.internal/ansible/ansible_collections/internal/gha_docs/roles/generate/files/output/.gitignore new file mode 100644 index 0000000..1287e9b --- /dev/null +++ b/.internal/ansible/ansible_collections/internal/gha_docs/roles/generate/files/output/.gitignore @@ -0,0 +1,2 @@ +** +!.gitignore diff --git a/.internal/ansible/ansible_collections/internal/gha_docs/roles/generate/meta/argument_specs.yml b/.internal/ansible/ansible_collections/internal/gha_docs/roles/generate/meta/argument_specs.yml new file mode 100644 index 0000000..a77651b --- /dev/null +++ b/.internal/ansible/ansible_collections/internal/gha_docs/roles/generate/meta/argument_specs.yml @@ -0,0 +1,21 @@ +--- +argument_specs: + main: + options: + file: + type: path + required: true + description: The path to the action or workflow file to parse. + + type: + type: str + required: true + description: The type of input file. + choices: + - action + - workflow + + output: + type: path + required: true + description: The path to the output file. diff --git a/.internal/ansible/ansible_collections/internal/gha_docs/roles/generate/tasks/main.yml b/.internal/ansible/ansible_collections/internal/gha_docs/roles/generate/tasks/main.yml new file mode 100644 index 0000000..45c892c --- /dev/null +++ b/.internal/ansible/ansible_collections/internal/gha_docs/roles/generate/tasks/main.yml @@ -0,0 +1,34 @@ +--- +- name: Load the file + set_fact: + _src: "{{ lookup('ansible.builtin.file', file) | from_yaml }}" + +- name: Template the workflow docs + when: type == 'workflow' + vars: + full: '{{ _src }}' + name: '{{ _src.name }}' + reference: '{{ file | basename }}' + jobs: '{{ _src.jobs }}' + inputs: '{{ _src[true].workflow_call.inputs | default({}) }}' + outputs: '{{ _src[true].workflow_call.outputs | default({}) }}' + ansible.builtin.template: + src: workflow.md.j2 + dest: '{{ output }}' + force: true + mode: '644' + +- name: Template the action docs + when: type == 'action' + vars: + full: '{{ _src }}' + name: '{{ _src.name }}' + reference: '{{ file | dirname | basename }}' + description: '{{ _src.description }}' + inputs: '{{ _src.inputs | default({}) }}' + outputs: '{{ _src.outputs | default({}) }}' + ansible.builtin.template: + src: action.md.j2 + dest: '{{ output }}' + force: true + mode: '644' diff --git a/.internal/ansible/ansible_collections/internal/gha_docs/roles/generate/templates/action.md.j2 b/.internal/ansible/ansible_collections/internal/gha_docs/roles/generate/templates/action.md.j2 new file mode 100644 index 0000000..9493a03 --- /dev/null +++ b/.internal/ansible/ansible_collections/internal/gha_docs/roles/generate/templates/action.md.j2 @@ -0,0 +1,20 @@ +# `{{ reference }}` +## {{ name }} + +{{ description }} + +### Inputs +| Name (✅required) | Default | Description | +| ----------------- | ------- | ----------- | +{% for name, inp in inputs.items() %} +| `{{ name }}`{% if inp.required %}✅{% endif %} | {% if inp.default is defined %}{% if "\n" in inp.default %}✳ _see `action.yml` for full default value_{% else %}{{ inp.default.replace('`', '\`') }}{% endif %}{% endif %} | {{ (inp.description.replace("\n", '
')) }} | +{% endfor %} + +
+ +### Outputs +| Name | Description | +| ---- | ----------- | +{% for name, out in outputs.items() %} +| `{{ name }}` | {{ (out.description | default('')).replace("\n", '
') }} | +{% endfor %} diff --git a/.internal/ansible/ansible_collections/internal/gha_docs/roles/generate/templates/workflow.md.j2 b/.internal/ansible/ansible_collections/internal/gha_docs/roles/generate/templates/workflow.md.j2 new file mode 100644 index 0000000..f715e37 --- /dev/null +++ b/.internal/ansible/ansible_collections/internal/gha_docs/roles/generate/templates/workflow.md.j2 @@ -0,0 +1,27 @@ +# `{{ reference }}` +## {{ name }} + +### Jobs +| ID | Name | Permissions | +| --- | ---- | ----------- | +{% for id, job in jobs.items() %} +| `{{ id }}` | {{ job.name | default(id) }} | {% if job.permissions is not defined %}_default_{% else %}