From e91e7e969807ae0614c70de7b9c774c33a7cc2bc Mon Sep 17 00:00:00 2001 From: Matthew Stobbs Date: Thu, 5 Feb 2026 17:18:02 -0700 Subject: [PATCH] working on helpers --- CONTRIBUTING.md | 82 ++++++++++++++++----- tasks/config/firefox.yml | 2 +- tasks/helpers/archive.yml | 16 ++-- tasks/helpers/flatpak.yml | 11 +-- tasks/helpers/flatpak_remote.yml | 13 ++-- tasks/linux.yml | 8 +- tasks/main.yml | 123 +++++++++++++++---------------- tasks/pkgs/ansible.yml | 2 +- tasks/pkgs/go.yml | 41 +++-------- tasks/pkgs/hyprland.yml | 4 +- vars/main.yml | 9 ++- vars/maintainers.yml | 6 -- 12 files changed, 170 insertions(+), 147 deletions(-) delete mode 100644 vars/maintainers.yml diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 103eadc..a30c529 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -19,7 +19,7 @@ up the correct linter and language server when using neovim/vim. ### Metadata -The metadata consists of at minimum 6 key: value pairs +The metadata consists of `key: value` pairs, at minimum requiring: ```yaml # Package: @@ -32,6 +32,35 @@ The metadata consists of at minimum 6 key: value pairs This list should match package defaults where it makes sense, for example, the `Version:` should match the default installed version of the package. +### Default configuration + +Default, non-computed configuration must exist in `vars/main.yml`, generally consisting of +the default version, urls, internal dependencies (internal to Ansible package manager) and +list of files installed after a build, without the `install_prefix`. + +When adding default configuration, it MUST match the following: + +- Surround the configuration in `# {{{ configuration` and `# }}}` + - Where "package" is the name of the package +- Prefix the configuration with the name of the package, using snake case + - Example: `alacritty_version: v0.16.1` + - This keeps the configuration unique per package, and allows for the defaults + to be over-ridden where needed. + +The things that should be in the default configuration, if relevant, are: + +- Default version, as `_version` +- Git repository for pulling the source as `_git_repo` +- Archive URL as `_archive_url` +- Internal dependecies as `_pkg_deps: ` +- Files installed when building from source as `_build_files` +- Default compile flags for the build system. + - Example using cargo: `_cargo_build_flags: ` +- Package build dependencies per ansible_os_family. These are only for system + packages that are required for building the package from source. +- Package runtime dependencies as `_run_deps: ` + - These should only be system packages, not internal packages + ### Configuration acknowledgement The "Configuration acknowledgement" MUST be at the start of the yaml file, @@ -50,15 +79,7 @@ It looks like this, using the `air` package: - name: Finalize air configuration ansible.builtin.set_fact: - __air_configured: true -``` - -or alternatively: - -```yaml -- name: Start air configuration - when: - - __configured['air'] is undefined + __configured: "{{ __configured | combine( { 'air': true } ) }}" ``` This way, if a package is included as part of another packages build, it only happens once. @@ -68,17 +89,44 @@ This way, if a package is included as part of another packages build, it only ha Adding the configuration for a package is done by appending the configuration to the appropriate list. Each helper has it's own installation block in `tasks/main.yml`. -Depending on the package installation method, the package must be added to the appropriate list. +Depending on the package installation method, the package must be added to the +appropriate list. #### Different lists, and when to use them The following is a list of the different lists that are used, and the order they are run. -- system: pkg_sys - - Only for packages installed from the system package manager - - If a package adds a repository to handle the system installation, it should be - done in the package configuration itself. For example, installing `ghostty` via - the system package manager requires adding a copr repo on fedora. This should be - done in a section named 'Adding copr repository scottames/ghostty' +##### System packages +pkg_sys: List of system package manager packages to install + +- Installed using `ansible.builtin.package` +- Installs the entire gathered list of packages at once, instead of looping over single items. +- The package list is made unique by applying the `unique` filter to the list + +##### Archive packages + +Archive packages are binaries installed by extracting an archive and linking the files +in place (usually in `/bin`). + +- Archives are kept in a cache after download, unless `clean_cache` is `true` +- Extracted archives are placed in `/archive/` +- Archive files are linked to the appropriate place under `install_prefix`, as dictated by + the `pkg.links` list, where `pkg` is the top level dict object of the archive + +2. pkg_archive: List of packages installed via archive, like `go` + - Loops over list of archives and downloads, extracts and links them before moving + on to the next. +3. Linux only packages. Flatpaks, appimages, and snapcraft packages. + - Flatpaks: use the lists `flatpak_remotes` and `pkg_flatpak` + - `flatpak_remotes` is a list of dicts containing the flatpak remote configurations + - Managed using `community.general.flatpak_remote` ansible module. + - Format is: + ```yaml + remote: + name: + url: + method: 0 - loop: pkg.bins + - pkg.links is defined + - pkg.links | length > 0 + loop: "{{ pkg.links }}" loop_control: loop_var: lnk ansible.builtin.file: diff --git a/tasks/helpers/flatpak.yml b/tasks/helpers/flatpak.yml index fa9fd27..82dfcb4 100644 --- a/tasks/helpers/flatpak.yml +++ b/tasks/helpers/flatpak.yml @@ -1,9 +1,10 @@ # vim: set filetype=yaml.ansible : --- - name: Install flatpak - become: "{{ ext_become }}" + become: "{{ install_become }}" + become_user: "{{ install_become_user }}" community.general.flatpak: - method: "{{ pkg_method }}" - remote: "{{ pkg_remote }}" - name: "{{ pkg_name }}" - state: present + method: "{{ flatpak.method | default('system') }}" + remote: "{{ flatpak.remote }}" + name: "{{ flatpak.name }}" + state: "{{ flatpak.state | default('present') }}" diff --git a/tasks/helpers/flatpak_remote.yml b/tasks/helpers/flatpak_remote.yml index 98e1855..a266dda 100644 --- a/tasks/helpers/flatpak_remote.yml +++ b/tasks/helpers/flatpak_remote.yml @@ -1,10 +1,11 @@ # vim: set filetype=yaml.ansible : --- - name: Add flatpak remote - become: "{{ ext_become }}" + become: "{{ install_become }}" + become_user: "{{ install_become_user }}" community.general.flatpak_remote: - enabled: "{{ remote_enabled }}" - flatpakrepo_url: "{{ remote_url }}" - method: "{{ remote_method }}" - name: "{{ remote_name }}" - state: "{{ remote_state }}" + enabled: "{{ remote.enabled | default(true) }}" + flatpakrepo_url: "{{ remote.url }}" + method: "{{ remote.method | default('system') }}" + name: "{{ remote.name }}" + state: "{{ remote.state | default('present') }}" diff --git a/tasks/linux.yml b/tasks/linux.yml index bd0a73c..3e9556c 100644 --- a/tasks/linux.yml +++ b/tasks/linux.yml @@ -7,15 +7,9 @@ - name: Add flatpak remotes when: - flatpak_remote|length > 0 - loop: "{{ flatpak_remote | unique }}" + loop: "{{ flatpak_remotes }}" loop_control: loop_var: remote - vars: - remote_enabled: true - remote_url: "{{ remote.url }}" - remote_method: "{{ remote.method | default(default_flatpak_method) }}" - remote_name: "{{ remote.name }}" - remote_state: "{{ remote.state | default('present') }}" ansible.builtin.include_tasks: file: helpers/flatpak_remote.yml diff --git a/tasks/main.yml b/tasks/main.yml index ad07731..3467d51 100644 --- a/tasks/main.yml +++ b/tasks/main.yml @@ -1,5 +1,9 @@ # vim: set filetype=yaml.ansible : --- +- name: Show indev warning + ansible.builtin.debug: + msg: "This software is in development. Use at your own risk" + - name: Set installation facts ansible.builtin.include_tasks: file: facts.yml @@ -85,63 +89,73 @@ ansible.builtin.include_tasks: file: pkgs/pipx.yml - - name: Ensure pipx path exists - when: pkg_pipx|length > 0 - become: "{{ ext_become }}" - ansible.builtin.file: - state: directory - mode: '0755' - path: "{{ path.pipx }}" +- name: Ensure pipx path exists + when: pkg_pipx|length > 0 + become: "{{ ext_become }}" + ansible.builtin.file: + state: directory + mode: '0755' + path: "{{ path.pipx }}" - - name: Ensure nodejs and npm are installed - when: pkg_npm|length > 0 - vars: - pkg: nodejs - ansible.builtin.include_tasks: - file: addpkg.yml +- name: Ensure nodejs and npm are installed + when: pkg_npm|length > 0 + vars: + pkg: nodejs + ansible.builtin.include_tasks: + file: addpkg.yml - - name: Ensure flatpak is installed - when: - - pkg_flatpak is defined - - pkg_flatpak|length > 0 - vars: - pkg: flatpak - ansible.builtin.include_tasks: - file: addpkg.yml +- name: Ensure flatpak is installed + when: + - pkg_flatpak is defined + - pkg_flatpak|length > 0 + vars: + pkg: flatpak + ansible.builtin.include_tasks: + file: addpkg.yml - - name: Ensure appimage path exists - when: - - pkg_appimage is defined - - pkg_appimage|length > 0 - become: "{{ ext_become }}" - ansible.builtin.file: - state: directory - mode: '0755' - path: "{{ path.appimage }}" +- name: Ensure appimage path exists + when: + - pkg_appimage is defined + - pkg_appimage|length > 0 + become: "{{ ext_become }}" + ansible.builtin.file: + state: directory + mode: '0755' + path: "{{ path.appimage }}" - - name: Ensure archive path exists - when: - - pkg_archive|length > 0 - become: "{{ install_become }}" - become_user: "{{ install_become_user }}" - ansible.builtin.file: - state: directory - mode: '0755' - path: "{{ path_archive }}" +- name: Ensure archive path exists + when: + - pkg_archive|length > 0 + become: "{{ install_become }}" + become_user: "{{ install_become_user }}" + ansible.builtin.file: + state: directory + mode: '0755' + path: "{{ path_archive }}" - - name: Depend zig - when: pkg_zig|length > 0 - vars: - pkg: zig - ansible.builtin.include_tasks: - file: addpkg.yml +- name: Depend zig + when: pkg_zig|length > 0 + vars: + pkg: zig + ansible.builtin.include_tasks: + file: addpkg.yml - name: Install sys_pkgs list using system package manager - become: "{{ sys_pkg_become }}" + become: "{{ install_become }}" + become_user: "{{ install_become_user }}" ansible.builtin.package: name: "{{ pkg_sys | unique }}" state: present +- name: Install pkg_archive + when: + - pkg_archive|length > 0 + loop: "{{ pkg_archive }}" + loop_control: + loop_var: pkg + ansible.builtin.include_tasks: + file: helpers/archive.yml + - name: Linux specific tasks when: - ansible_system == 'Linux' @@ -154,15 +168,6 @@ ansible.builtin.include_tasks: file: macos.yml -- name: Install pkg_archive - when: - - pkg_archive|length > 0 - loop: "{{ pkg_archive }}" - loop_control: - loop_var: pkg - ansible.builtin.include_tasks: - file: "helpers/archive.yml" - - name: Install cargo packages when: - pkg_cargo|length > 0 @@ -238,11 +243,3 @@ loop_var: pkg ansible.builtin.include_tasks: file: "src/{{ pkg }}.yml" - -- name: Cleanup {{ d_tempdir.path }} - become: true - when: - - not debug - ansible.builtin.file: - state: absent - path: "{{ d_tempdir.path }}" diff --git a/tasks/pkgs/ansible.yml b/tasks/pkgs/ansible.yml index d348b64..fa56b80 100644 --- a/tasks/pkgs/ansible.yml +++ b/tasks/pkgs/ansible.yml @@ -8,7 +8,7 @@ - name: Set ansible install method when: - ansible_install_method is undefined - ansible.bulitin.set_fact: + ansible.builtin.set_fact: ansible_install_method: "{% if install_method in ansible_install_methods %}{{ install_method }}{% else %}{{ ansible_install_methods[0] }}{% endif %}" ansible_pkgname: RedHat: ansible diff --git a/tasks/pkgs/go.yml b/tasks/pkgs/go.yml index 6cc754e..b24e092 100644 --- a/tasks/pkgs/go.yml +++ b/tasks/pkgs/go.yml @@ -2,7 +2,7 @@ --- - name: Configure go for install when: - - __go_configured is undefined + - "'go' not in __configured" block: - name: Configure go install method when: @@ -14,23 +14,15 @@ when: - go_install_method == 'system' block: - - name: Set go pkgname for linux - when: - - ansible_system == 'Linux' + - name: Set go pkgname ansible.builtin.set_fact: go_pkgname: "{{ go_pkgname[ansible_os_family] }}" - name: Set go pkgname for FreeBSD when: - ansible_os_family == 'FreeBSD' - ansible.bulitin.set_fact: - go_pkgname: "{{ go_pkgname[ansible_os_family][go_bsd_version] | default(go_pkgname[ansible_os_family]['default']) }}" - - - name: Set go pkgname for Darwin/MacOS - when: - - ansible_os_family == 'Darwin' ansible.builtin.set_fact: - go_pkgname: "{{ go_pkgname[ansible_os_family] }}" + go_pkgname: "{{ go_pkgname[go_bsd_version] | default(go_pkgname['default']) }}" - name: Configure go archive installation when: @@ -39,10 +31,7 @@ - name: Configure go ansible.builtin.set_fact: go_system: "{{ ansible_system | lower }}" - - - name: Set go architecture - ansible.builtin.set_fact: - go_arch: "{{ go_archmap[ansible_architecture] }}" + go_arch: "{{ go_archive_archmap[ansible_architecture] }}" - name: Set archive name ansible.builtin.set_fact: @@ -50,7 +39,7 @@ - name: Set go archive url and path ansible.builtin.set_fact: - go_archive_url: "https://go.dev/dl/{{ go_archive_file }}" + go_archive_url: "{{ go_archive_url_base }}/{{ go_archive_file }}" go_extract_path: "{{ path_archive }}/go{{ go_archive_version }}" - name: Finalize go archive install @@ -58,15 +47,14 @@ go_archive_install: extract_to: "{{ go_extract_path }}" url: "{{ go_archive_url }}" - name: "{{ go_archive }}" + name: "{{ go_archive_file }}" checksum: "{{ go_archive_sums[go_archive_version][ansible_system][go_arch] }}" - bins: - - from: "{{ go_archive_path }}/go" + links: + - from: "{{ go_extract_path }}/go" to: "{{ path_go }}" force: true - - from: "{{ path_go }}/bin/go" - to: "{{ path_bin }}/go" - force: true + __add_to_path: "{{ __add_to_path + [path_go ~ '/bin'] }}" + __var_to_env: "{{ __var_to_env | combine( { 'GOROOT': path_go } ) }}" - name: Queue go install block: @@ -84,13 +72,6 @@ ansible.builtin.set_fact: pkg_archive: "{{ pkg_archive + [go_archive_install] }}" - - name: Set symbolic link to archive path - ansible.bulitin.file: - state: link - force: true - path: "{{ path_go }}" - src: "{{ go_extract_path }}/go" - - name: Complete go archive install configuration ansible.builtin.set_fact: - __go_configured: true + __configured: "{{ __configured | combine( { 'go': true } ) }}" diff --git a/tasks/pkgs/hyprland.yml b/tasks/pkgs/hyprland.yml index c4e4db3..0abb1ee 100644 --- a/tasks/pkgs/hyprland.yml +++ b/tasks/pkgs/hyprland.yml @@ -7,13 +7,13 @@ - name: Set Hyprland install method when: - hyprland_install_method is undefined - ansible.bulitin.set_fact: + ansible.builtin.set_fact: hyprland_install_method: "{% if install_method in hyprland_install_methods %}{{ install_method }}{% else %}{{ hyprland_install_methods[0] }}{% endif %}" - name: Set Hyprland source install configuration when: - hyprland_install_method == 'source' - ansible.bulitin.set_fact: + ansible.builtin.set_fact: hyprland_version: "{{ hyprland_version | default('v0.53.3') }}" hyprland_git_repo: "{{ hyprland_git_repo | default('https://github.com/hyprwm/Hyprland') }}" hyprland_build_deps: diff --git a/vars/main.yml b/vars/main.yml index 81183b9..335a8b4 100644 --- a/vars/main.yml +++ b/vars/main.yml @@ -51,16 +51,18 @@ pkg_src: [] # packages built from source pkg_sys: [] # system package manager packages pkg_sys_pip: [] # system pip packages pkg_zig: [] # zig packages -__configured: [] # list of configured packages +__configured: {} # dict of configured packages +__add_to_path: [] # list of paths that should be in PATH +__var_to_env: {} # dict of variables to add to your env # Per package variables ## {{{ air air_version: latest +air_build_files: + - bin/air air_install_url: github.com/air-verse/air air_pkg_deps: - pkgs/go.yml -air_build_files: - - bin/air # }}} ## {{{ alacritty alacritty_version: v0.16.1 @@ -133,6 +135,7 @@ go_archive_archmap: arm64: arm64 aarch64: arm64 x86_64: amd64 +go_archive_url_base: https://go.dev/dl go_archive_sums: 1.25.6: Darwin: diff --git a/vars/maintainers.yml b/vars/maintainers.yml deleted file mode 100644 index c457dbb..0000000 --- a/vars/maintainers.yml +++ /dev/null @@ -1,6 +0,0 @@ -# vim: set filetype=yaml.ansible : ---- -maintainers: - - name: Matthew Stobbs - packages: - - all