From 49529630781ce561185bd8c4bf4f17f6a870dbac Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Tue, 23 Apr 2024 14:37:21 -0400 Subject: [PATCH 01/32] Rework README.md to rename project to `operations/platform`. --- README.md | 69 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index ec32b86..ffb18be 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ -# AshOps +# Operations Platform +## Self-hosted web app automation. -Install stuff for creating an automation platform for websites using the Ash Cli and GitOps tools like GitHub Workflows and BitBucket Pipelines. +Installation scripts for creating an automation platform for websites using GitOps tools like GitHub Workflows and BitBucket Pipelines. [![License](https://img.shields.io/badge/license-MIT-408677.svg)](LICENSE) @@ -13,48 +14,49 @@ There are two choices for LICENSE badges: [![License](https://poser.pugx.org/jonpugh/ash-ops/license)](https://github.com/jonpugh/ash-ops//master/LICENSE) --> -More coming soon. - ## Documentation -### Architecture Plan +This is a very young project still in the proof of concept phase. More information will be added when possible. -I am about to build this: +### Architecture -1. Ash Ops Repo. (This repository) - - Installed to `/usr/share/ash`, owned by `control`. +1. **Operations Platform** (This repository) + - An Ansible Collection. Set of roles and configuration for bootstrapping a server to run sites. + - Installed to `/usr/share/operations`. - Ansible Playbook: - `geerlingguy.security` - `geerlingguy.github-users` - `geerlingguy.composer` - `geerlingguy.docker` - - Composer Dependencies like `jonpugh/ash` - - Installs Users, PHP, Composer, Docker, GitHub Runner, and Ash Cli. - - Can be replaced with a custom version to allow control over server config. - - Control User GitHub runner updates this repo and kicks off playbook when new commits are pushed. -2. Task Runners - - App repo runners run as a service under `platform` user. - - Responsible for responding to git pushes, cloning code into environments, and starting services. + - Installs system users, Docker, Composer, GitHub Runner, & DDEV. (More engines TBD) + - @TODO: Self-updating: Control User GitHub runner updates this repo and kicks off playbook when new commits are pushed for changing server config. + - **Users:** + - Special users are created to manage the server. + - Control user (`control`) is for server updates. It has `sudo NOPASSWD` permissions to allow self-configuration. If using multiple servers, this user will have SSH access to those servers in order to configure them remotely. + - Platform user (`platform`) is used for all app code. All apps are cloned into the home directory, `/var/platform`. The `platform` user has SSH access to clone repositories and access remote servers. The `platform` user runs the commands needed to launch sites, such as `ddev`. + - System Administrators can be set by adding their GitHub username to the ansible variable `operations_admin_users`. Each user will be granted server access via the SSH keys uploaded to GitHub.com, and `sudo NOPASSWD` permissions to allow manual maintenance of the server. + - **Service Engines** + - Operations platform relies on other tools for launching sites. + - "Service Engines" will make it simple to plug in any desired tooling to start, stop, destroy, and restore/sync sites by simply wrapping the tool's commands. + - DDEV is used as the first service engine as a proof of concept. + - More will be added whenever time allows. + +2. **Git Runners** + - This role installs and configures private Git Runners. + - All needed operations are run through the Git host's "Workflows" or "Pipelines" system, including deployments, cron jobs, backups, etc. + - Runners listen for events like git pushes or issue creation and then take the actions defined by the git-ops configuration files, without webhooks. This allows privately hosted servers to run sites without forcing users to grant access to the internet. + - All tasks are logged in the web interfaces of the git hosts. No other task runner (such as jenkins) is needed. - Runner Documentation - [GitHub](https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners) - [BitBucket](https://support.atlassian.com/bitbucket-cloud/docs/runners/) @TODO - [GitLab](https://docs.gitlab.com/runner/) @TODO -5. Users - - Control user (`control`) has `sudo NOPASSWD` permissions to allow automation. - - Platform user (`platform`) has `docker` permissions only, plus SSH access to clone repositories and access remote servers. - - Admin users will all ssh in with their own usernames, and `sudo su` to `platform` or `control` as needed. -2. Ash CLI - - Available at `/usr/share/ash/bin/ash` - - Runs under `platform` user. - - Site inventory. -3. App repo. - - Website code. - - Runner config. -4. Service CLI - - The thing that launches services for a site. - - Right now, it's DDEV. - - Runners clone the code, then run the service CLI commands as defined in runner config files. - +3. **Git Runner config** + - Each project must contain workflow/pipeline configuration files specifically for that git host that works with the private runners. + - Example config files are located in the (Templates)[./templates] folder (Coming soon). +4. **Operations Dashboard / Site Manager** + - With this system, the git host is the only interface that is needed. + - The [Site Manager module](https://www.drupal.org/project/site_manager) can be used to create an "Operations Dashboard" for keeping track of all the created sites in a CMS-like experience. + - [Site.module](https://www.drupal.org/project/site) can be deployed to hosted sites and configured to post updates back to the Operations Dashboard. ### Links @@ -77,11 +79,11 @@ Once the repo is cloned, ansible will set up the rest. ### Installing -0. Install Ansible. +0. Install Ansible & git. 1. Clone. - git clone git@github.com:jonpugh/ash-ops.git /usr/share/ash + git clone git@github.com:operations-platform/platform.git /usr/share/operations 2. Get a GitHub Runner token. @@ -110,6 +112,7 @@ List significant dependencies that developers of this project will interact with * [Composer](https://getcomposer.org/) - Dependency Management * [Robo](https://robo.li/) - PHP Task Runner * [Symfony](https://symfony.com/) - PHP Framework +* [Ansible](https://ansible.com) - System Configuration Platform ## Contributing From 37a457855f3993ce989f58b9bfcfa06f8cc4e2c9 Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Tue, 23 Apr 2024 14:39:08 -0400 Subject: [PATCH 02/32] Rework README.md to rename project to `operations/platform`. --- CONTRIBUTING.md | 4 ++-- README.md | 2 +- docker-compose.yml | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index bf03c53..273afd3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ -# Contributing to AshOps +# Contributing to Operations Platform -Thank you for your interest in contributing to AshOps! Here are some of the guidelines you should follow to make the most of your efforts: +Thank you for your interest in contributing to Operations Platform! Here are some of the guidelines you should follow to make the most of your efforts: ## Code Style Guidelines diff --git a/README.md b/README.md index ffb18be..7a3b5f7 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ There are two choices for LICENSE badges: 1. License using shields.io (above): Can contain any text you want, and has no prerequisites, but must be manually updated if you change the license. 2. License using poser.pugx.org (below): shows the license that Packagist.org read from your composer.json file. Must register with Packagist to use Poser. -[![License](https://poser.pugx.org/jonpugh/ash-ops/license)](https://github.com/jonpugh/ash-ops//master/LICENSE) +[![License](https://poser.pugx.org/operations-platform/platform)](https://github.com/operations-platform/platform//main/LICENSE) --> ## Documentation diff --git a/docker-compose.yml b/docker-compose.yml index 03f74d1..1383f8d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,16 +2,16 @@ --- services: - ash: + operations: image: geerlingguy/docker-${MOLECULE_DISTRO:-rockylinux8}-ansible:latest - hostname: ${DOCKER_HOSTNAME:-ash.local.computer} + hostname: ${DOCKER_HOSTNAME:-operations.local.computer} cgroup: host cgroup_parent: docker.slice privileged: true volumes: - - ./:/usr/share/ash + - ./:/usr/share/operations - /sys/fs/cgroup:/sys/fs/cgroup:rw - ./ansible:/etc/ansible environment: - - ASH_OPS=yes + - OPERATIONS_PLATFORM=yes build: ./ From 3cc16f1dbcaaa9a1672966d7b39137121cccb4a8 Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Tue, 23 Apr 2024 14:41:52 -0400 Subject: [PATCH 03/32] Rework README.md to rename project to `operations/platform`. --- ...t.example.yml => operations.host.example.yml} | 10 +++++----- composer.json | 10 +++++----- playbook.vars.yml | 16 ++++++++-------- playbook.yml | 16 ++++++++-------- 4 files changed, 26 insertions(+), 26 deletions(-) rename ansible/host_vars/{ash.host.example.yml => operations.host.example.yml} (73%) diff --git a/ansible/host_vars/ash.host.example.yml b/ansible/host_vars/operations.host.example.yml similarity index 73% rename from ansible/host_vars/ash.host.example.yml rename to ansible/host_vars/operations.host.example.yml index 83f47e3..a6de980 100644 --- a/ansible/host_vars/ash.host.example.yml +++ b/ansible/host_vars/operations.host.example.yml @@ -2,20 +2,20 @@ # Use a host_vars file to save server-specific variables. # Copy this file to one named after the server FQDN. -# Add users. For each 'ash_admin_users': +# Add users. For each 'operations_admin_users': # - Create a system user with sudo privileges. # - Add all of the users's Github SSH keys to authorized_keys. # # WARNING: Change this, unless you want to give me access to your server. # -ash_admin_users: +operations_admin_users: - jonpugh # # Replace with your repo information. Get the runner token under Settings > Actions > Runners > New Runner -ash_github_runners: - - repo_url: https://github.com/jonpugh/ash-ops +operations_github_runners: + - repo_url: https://github.com/jonpugh/operations-ops runner_token: CopyFromAddRunnerPage runner_name: "{{ inventory_hostname }}" - runner_labels: local,ash + runner_labels: local,operations user: platform diff --git a/composer.json b/composer.json index 3bd50a2..2dd7d1a 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { - "name": "jonpugh/ash-ops", - "description": "Automated Ash", + "name": "operations/platform", + "description": "Open source private automated hosting platform.", "license": "MIT", "authors": [ { @@ -19,13 +19,13 @@ }, "scripts": { "dev:build": [ - "docker-compose exec ash ansible-playbook /usr/share/ash/playbook.yml" + "docker-compose exec operations ansible-playbook /usr/share/ash/playbook.yml" ], "dev:shell": [ - "docker-compose exec ash bash" + "docker-compose exec operations bash" ], "dev:start": [ - "docker-compose up -d --build && docker-compose exec ash ansible-playbook /usr/share/ash/playbook.yml" + "docker-compose up -d --build && docker-compose exec operations ansible-playbook /usr/share/ash/playbook.yml" ], "dev:destroy": [ "docker-compose kill && docker-compose rm -fv" diff --git a/playbook.vars.yml b/playbook.vars.yml index c6f93fb..5541641 100644 --- a/playbook.vars.yml +++ b/playbook.vars.yml @@ -1,12 +1,12 @@ -ash_admin_users: [] +operations_admin_users: [] -ash_control_user: control -ash_control_home: /var/control +operations_control_user: control +operations_control_home: /var/control -ash_platform_user: platform -ash_platform_home: /var/platform +operations_platform_user: platform +operations_platform_home: /var/platform # Pass the list of users to geerlingguy.security and geerlingguy.github. -security_ssh_allowed_users: "{{ ash_admin_users }}" -github_users: "{{ ash_admin_users }}" -security_sudoers_passwordless: "{{ ash_admin_users }}" +security_ssh_allowed_users: "{{ operations_admin_users }}" +github_users: "{{ operations_admin_users }}" +security_sudoers_passwordless: "{{ operations_admin_users }}" diff --git a/playbook.yml b/playbook.yml index 070ab08..9374dcb 100644 --- a/playbook.yml +++ b/playbook.yml @@ -8,12 +8,12 @@ - role: geerlingguy.security tags: system vars: - security_sudoers_passwordless: "{{ ['control'] + ash_admin_users }}" + security_sudoers_passwordless: "{{ ['control'] + operations_admin_users }}" - role: geerlingguy.github-users tags: system -- hosts: ash_host +- hosts: operations_host vars_files: playbook.vars.yml roles: @@ -29,13 +29,13 @@ - role: geerlingguy.docker tags: system - - role: ash.users - tags: ash + - role: operations.users + tags: operations - - role: ash.ddev - tags: ash, ddev + - role: operations.ddev + tags: operations, ddev - - role: ash.runner + - role: operations.runner tags: - - ash + - operations - runner From 07a145ffb05efedb917fa99ca7d276c52f0b1c31 Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Tue, 23 Apr 2024 15:39:23 -0400 Subject: [PATCH 04/32] Rework README.md to rename project to `operations/platform`. --- .github/workflows/ci.yml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b6d2f93..16fa74f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -39,30 +39,30 @@ jobs: - name: Set runner name if: github.event_name != 'pull_request' run: | - echo "ASH_NAME=${{ github.ref_name }}" >> "$GITHUB_ENV" - echo "ASH_ENVIRONMENT_NAME=ash.${{ github.ref_name }}.local.computer" >> "$GITHUB_ENV" + echo "OPERATIONS_NAME=${{ github.ref_name }}" >> "$GITHUB_ENV" + echo "OPERATIONS_ENVIRONMENT_NAME=ash.${{ github.ref_name }}.local.computer" >> "$GITHUB_ENV" - name: Set runner name if: github.event_name == 'pull_request' run: | - echo "ASH_NAME=pr${{ github.event.number }}" >> "$GITHUB_ENV" - echo "ASH_ENVIRONMENT_NAME=ash.pr${{ github.event.number }}.local.computer" >> "$GITHUB_ENV" + echo "OPERATIONS_NAME=pr${{ github.event.number }}" >> "$GITHUB_ENV" + echo "OPERATIONS_ENVIRONMENT_NAME=ash.pr${{ github.event.number }}.local.computer" >> "$GITHUB_ENV" - name: Set variables run: | - echo -e '[ash_host]\n${{ env.ASH_ENVIRONMENT_NAME }} ansible_connection=local' > ./ansible/hosts - echo "DOCKER_HOSTNAME=${{ env.ASH_ENVIRONMENT_NAME }}" > .env + echo -e '[operations_host]\n${{ env.OPERATIONS_ENVIRONMENT_NAME }} ansible_connection=local' > ./ansible/hosts + echo "DOCKER_HOSTNAME=${{ env.OPERATIONS_ENVIRONMENT_NAME }}" > .env echo "# CI variables set! - ash_admin_users: + operations_admin_users: - jonpugh - ash_github_runners: + operations_github_runners: - repo_url: ${{ github.server_url }}/${{ github.repository }} runner_token: ${{ secrets.RUNNER_TOKEN }} - runner_name: ${{ env.ASH_ENVIRONMENT_NAME }} + runner_name: ${{ env.OPERATIONS_ENVIRONMENT_NAME }} runner_labels: ci user: platform - " > ./ansible/host_vars/${{ env.ASH_ENVIRONMENT_NAME }}.yml - cat ./ansible/host_vars/${{ env.ASH_ENVIRONMENT_NAME }}.yml + " > ./ansible/host_vars/${{ env.OPERATIONS_ENVIRONMENT_NAME }}.yml + cat ./ansible/host_vars/${{ env.OPERATIONS_ENVIRONMENT_NAME }}.yml - name: Build Platform run: composer dev:start From ce2ce5235ac980ca72015bf136d51ddebbc33c89 Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Tue, 23 Apr 2024 15:42:37 -0400 Subject: [PATCH 05/32] Renaming all roles. --- README.md | 2 +- roles/ash.ddev/tasks/main.yml | 18 ------- roles/ash.runner/defaults/main.yml | 1 - roles/ash.runner/tasks/github.yml | 30 ------------ roles/ash.users/tasks/main.yml | 49 ------------------- roles/operations.ddev/tasks/main.yml | 18 +++++++ roles/operations.runner/defaults/main.yml | 1 + roles/operations.runner/tasks/github.yml | 30 ++++++++++++ .../tasks/main.yml | 0 roles/operations.users/tasks/main.yml | 49 +++++++++++++++++++ 10 files changed, 99 insertions(+), 99 deletions(-) delete mode 100644 roles/ash.ddev/tasks/main.yml delete mode 100644 roles/ash.runner/defaults/main.yml delete mode 100644 roles/ash.runner/tasks/github.yml delete mode 100644 roles/ash.users/tasks/main.yml create mode 100644 roles/operations.ddev/tasks/main.yml create mode 100644 roles/operations.runner/defaults/main.yml create mode 100644 roles/operations.runner/tasks/github.yml rename roles/{ash.runner => operations.runner}/tasks/main.yml (100%) create mode 100644 roles/operations.users/tasks/main.yml diff --git a/README.md b/README.md index 7a3b5f7..5f0779e 100644 --- a/README.md +++ b/README.md @@ -99,7 +99,7 @@ Once the repo is cloned, ansible will set up the rest. In `/etc/ansible/hosts`, put your server's hostname. - In `/etc/ansible/group_vars/ash_host.yml`, add the github users you wish to grant access, and set repo_url and the token. + In `/etc/ansible/group_vars/operations_host.yml`, add the github users you wish to grant access, and set repo_url and the token. 4. Install. diff --git a/roles/ash.ddev/tasks/main.yml b/roles/ash.ddev/tasks/main.yml deleted file mode 100644 index d965d5a..0000000 --- a/roles/ash.ddev/tasks/main.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- -- name: Install ddev - shell: "curl -fsSL https://ddev.com/install.sh | bash" - become: true - become_user: "{{ ash_control_user }}" - -- command: pwd - args: - chdir: "{{ ash_platform_home }}" - become: true - become_user: "{{ ash_platform_user }}" - -- name: Confirm ddev install - command: /usr/local/bin/ddev version - args: - chdir: "{{ ash_platform_home }}" - become: true - become_user: "{{ ash_platform_user }}" diff --git a/roles/ash.runner/defaults/main.yml b/roles/ash.runner/defaults/main.yml deleted file mode 100644 index ae55efc..0000000 --- a/roles/ash.runner/defaults/main.yml +++ /dev/null @@ -1 +0,0 @@ -ash_github_runner_path: /usr/share/github-runner diff --git a/roles/ash.runner/tasks/github.yml b/roles/ash.runner/tasks/github.yml deleted file mode 100644 index c84f0a5..0000000 --- a/roles/ash.runner/tasks/github.yml +++ /dev/null @@ -1,30 +0,0 @@ ---- - -# See Your repo > Settings > Actions > Runner > New Runner -- name: Install GitHub Runner - shell: - cmd: "{{ item }}" - with_items: - - mkdir {{ ash_github_runner_path }} -p - - curl -o {{ ash_github_runner_path }}/actions-runner-linux-x64-2.314.1.tar.gz -L https://github.com/actions/runner/releases/download/v2.314.1/actions-runner-linux-x64-2.314.1.tar.gz - - cd {{ ash_github_runner_path }} && tar xzf {{ ash_github_runner_path }}/actions-runner-linux-x64-2.314.1.tar.gz - - cd {{ ash_github_runner_path }} && ./bin/installdependencies.sh - - chown {{ ash_platform_user }}:{{ ash_platform_user }} {{ ash_github_runner_path }} -R - - cd {{ ash_github_runner_path }} && ./bin/installdependencies.sh - - ls -la {{ ash_github_runner_path }} - -- name: Configure GitHub Runner - shell: - cmd: "cd {{ ash_github_runner_path }} && ./config.sh remove --token {{ item.runner_token }} && ./config.sh --replace --unattended --url {{ item.repo_url }} --token {{ item.runner_token }} --name {{ item.runner_name }} --labels {{ item.runner_labels }}" - chdir: "{{ ash_github_runner_path }}" - become: true - become_user: "{{ item.user }}" - with_items: "{{ ash_github_runners }}" - -#- name: Add GitHub Runner Service -# shell: -# cmd: "cd {{ ash_github_runner_path }} && ./config.sh remove --token {{ item.runner_token }} && ./config.sh --unattended --url {{ item.repo_url }} --token {{ item.runner_token }} --name {{ item.runner_name }} --labels {{ item.runner_labels }}" -# chdir: "{{ ash_github_runner_path }}" -# become: true -# become_user: "{{ item.user }}" -# with_items: "{{ ash_github_runners }}" diff --git a/roles/ash.users/tasks/main.yml b/roles/ash.users/tasks/main.yml deleted file mode 100644 index d2cfc34..0000000 --- a/roles/ash.users/tasks/main.yml +++ /dev/null @@ -1,49 +0,0 @@ ---- - -- name: Create Platform group - group: - name: "{{ ash_platform_user }}" - state: present - gid: "{{ ash_platform_user_gid | default(omit) }}" - -- name: Create Platform user - user: - name: "{{ ash_platform_user }}" - group: "{{ ash_platform_user }}" - home: "{{ ash_platform_home }}" - uid: "{{ ash_platform_user_uid | default(omit) }}" - shell: /bin/bash - system: true - generate_ssh_key: true - groups: docker - -- name: Create Platform home directory - file: - state: directory - path: "{{ ash_platform_home }}" - group: "{{ ash_platform_user }}" - owner: "{{ ash_platform_user }}" - -- name: Create Control group - group: - name: "{{ ash_control_user }}" - state: present - gid: "{{ ash_control_user_gid | default(omit) }}" - -- name: Create Control user - user: - name: "{{ ash_control_user }}" - group: "{{ ash_control_user }}" - groups: docker - home: "{{ ash_control_home }}" - uid: "{{ ash_control_user_uid | default(omit) }}" - shell: /bin/bash - system: true - generate_ssh_key: true - -- name: Create Control home directory - file: - state: directory - path: "{{ ash_control_home }}" - group: "{{ ash_control_user }}" - owner: "{{ ash_control_user }}" diff --git a/roles/operations.ddev/tasks/main.yml b/roles/operations.ddev/tasks/main.yml new file mode 100644 index 0000000..357af32 --- /dev/null +++ b/roles/operations.ddev/tasks/main.yml @@ -0,0 +1,18 @@ +--- +- name: Install ddev + shell: "curl -fsSL https://ddev.com/install.sh | bash" + become: true + become_user: "{{ operations_control_user }}" + +- command: pwd + args: + chdir: "{{ operations_platform_home }}" + become: true + become_user: "{{ operations_platform_user }}" + +- name: Confirm ddev install + command: /usr/local/bin/ddev version + args: + chdir: "{{ operations_platform_home }}" + become: true + become_user: "{{ operations_platform_user }}" diff --git a/roles/operations.runner/defaults/main.yml b/roles/operations.runner/defaults/main.yml new file mode 100644 index 0000000..c96949a --- /dev/null +++ b/roles/operations.runner/defaults/main.yml @@ -0,0 +1 @@ +operations_github_runner_path: /usr/share/github-runner diff --git a/roles/operations.runner/tasks/github.yml b/roles/operations.runner/tasks/github.yml new file mode 100644 index 0000000..3d8f885 --- /dev/null +++ b/roles/operations.runner/tasks/github.yml @@ -0,0 +1,30 @@ +--- + +# See Your repo > Settings > Actions > Runner > New Runner +- name: Install GitHub Runner + shell: + cmd: "{{ item }}" + with_items: + - mkdir {{ operations_github_runner_path }} -p + - curl -o {{ operations_github_runner_path }}/actions-runner-linux-x64-2.314.1.tar.gz -L https://github.com/actions/runner/releases/download/v2.314.1/actions-runner-linux-x64-2.314.1.tar.gz + - cd {{ operations_github_runner_path }} && tar xzf {{ operations_github_runner_path }}/actions-runner-linux-x64-2.314.1.tar.gz + - cd {{ operations_github_runner_path }} && ./bin/installdependencies.sh + - chown {{ operations_platform_user }}:{{ operations_platform_user }} {{ operations_github_runner_path }} -R + - cd {{ operations_github_runner_path }} && ./bin/installdependencies.sh + - ls -la {{ operations_github_runner_path }} + +- name: Configure GitHub Runner + shell: + cmd: "cd {{ operations_github_runner_path }} && ./config.sh remove --token {{ item.runner_token }} && ./config.sh --replace --unattended --url {{ item.repo_url }} --token {{ item.runner_token }} --name {{ item.runner_name }} --labels {{ item.runner_labels }}" + chdir: "{{ operations_github_runner_path }}" + become: true + become_user: "{{ item.user }}" + with_items: "{{ operations_github_runners }}" + +#- name: Add GitHub Runner Service +# shell: +# cmd: "cd {{ operations_github_runner_path }} && ./config.sh remove --token {{ item.runner_token }} && ./config.sh --unattended --url {{ item.repo_url }} --token {{ item.runner_token }} --name {{ item.runner_name }} --labels {{ item.runner_labels }}" +# chdir: "{{ operations_github_runner_path }}" +# become: true +# become_user: "{{ item.user }}" +# with_items: "{{ operations_github_runners }}" diff --git a/roles/ash.runner/tasks/main.yml b/roles/operations.runner/tasks/main.yml similarity index 100% rename from roles/ash.runner/tasks/main.yml rename to roles/operations.runner/tasks/main.yml diff --git a/roles/operations.users/tasks/main.yml b/roles/operations.users/tasks/main.yml new file mode 100644 index 0000000..5ed9518 --- /dev/null +++ b/roles/operations.users/tasks/main.yml @@ -0,0 +1,49 @@ +--- + +- name: Create Platform group + group: + name: "{{ operations_platform_user }}" + state: present + gid: "{{ operations_platform_user_gid | default(omit) }}" + +- name: Create Platform user + user: + name: "{{ operations_platform_user }}" + group: "{{ operations_platform_user }}" + home: "{{ operations_platform_home }}" + uid: "{{ operations_platform_user_uid | default(omit) }}" + shell: /bin/bash + system: true + generate_ssh_key: true + groups: docker + +- name: Create Platform home directory + file: + state: directory + path: "{{ operations_platform_home }}" + group: "{{ operations_platform_user }}" + owner: "{{ operations_platform_user }}" + +- name: Create Control group + group: + name: "{{ operations_control_user }}" + state: present + gid: "{{ operations_control_user_gid | default(omit) }}" + +- name: Create Control user + user: + name: "{{ operations_control_user }}" + group: "{{ operations_control_user }}" + groups: docker + home: "{{ operations_control_home }}" + uid: "{{ operations_control_user_uid | default(omit) }}" + shell: /bin/bash + system: true + generate_ssh_key: true + +- name: Create Control home directory + file: + state: directory + path: "{{ operations_control_home }}" + group: "{{ operations_control_user }}" + owner: "{{ operations_control_user }}" From ae22f3eebfb592e7e37e8ab048046449019210cc Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Tue, 23 Apr 2024 15:46:37 -0400 Subject: [PATCH 06/32] Renaming things. --- .github/workflows/ci.yml | 10 +++++----- README.md | 10 +++++----- composer.json | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 16fa74f..914a2c9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -40,13 +40,13 @@ jobs: if: github.event_name != 'pull_request' run: | echo "OPERATIONS_NAME=${{ github.ref_name }}" >> "$GITHUB_ENV" - echo "OPERATIONS_ENVIRONMENT_NAME=ash.${{ github.ref_name }}.local.computer" >> "$GITHUB_ENV" + echo "OPERATIONS_ENVIRONMENT_NAME=operations.${{ github.ref_name }}.local.computer" >> "$GITHUB_ENV" - name: Set runner name if: github.event_name == 'pull_request' run: | echo "OPERATIONS_NAME=pr${{ github.event.number }}" >> "$GITHUB_ENV" - echo "OPERATIONS_ENVIRONMENT_NAME=ash.pr${{ github.event.number }}.local.computer" >> "$GITHUB_ENV" + echo "OPERATIONS_ENVIRONMENT_NAME=operations.pr${{ github.event.number }}.local.computer" >> "$GITHUB_ENV" - name: Set variables run: | @@ -69,6 +69,6 @@ jobs: - name: Test Platform run: | - docker-compose exec -u platform ash whoami - docker-compose exec -u platform ash hostname - docker-compose exec -u platform ash ddev + docker-compose exec -u platform operations whoami + docker-compose exec -u platform operations hostname + docker-compose exec -u platform operations ddev diff --git a/README.md b/README.md index 5f0779e..8065100 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ This is a very young project still in the proof of concept phase. More informati ### Links -- [GitHub issue templates](https://github.com/jonpugh/ash-ops/issues/templates/edit) +- [GitHub issue templates](https://github.com/operations-platform/platform/issues/templates/edit) - [GitHub pull request template](/.github/pull_request_template.md) - [Contributing guide](/CONTRIBUTING) (Decide about your code of conduct) @@ -94,7 +94,7 @@ Once the repo is cloned, ansible will set up the rest. Copy ansible inventory files in `./ansible` to `/etc/ansible`, then update the values. - cd /usr/share/ash + cd /usr/share/operations cp -rf ansible/* /etc/ansible In `/etc/ansible/hosts`, put your server's hostname. @@ -103,7 +103,7 @@ Once the repo is cloned, ansible will set up the rest. 4. Install. - ansible-playbook /usr/share/ash/playbook.install.yml + ansible-playbook /usr/share/operations/playbook.yml ## Built With @@ -120,13 +120,13 @@ Please read [CONTRIBUTING.md](CONTRIBUTING.md) for details on the process for su ## Versioning -We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [releases](https://github.com/jonpugh/ash-ops/releases) page. +We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [releases](https://github.com/operations-platform/platform/releases) page. ## Authors * **Jon Pugh** - created project from template. -See also the list of [contributors](https://github.com/jonpugh/ash-ops/contributors) who participated in this project. +See also the list of [contributors](https://github.com/operations-platform/platform/contributors) who participated in this project. ## License diff --git a/composer.json b/composer.json index 2dd7d1a..9a78b26 100644 --- a/composer.json +++ b/composer.json @@ -19,13 +19,13 @@ }, "scripts": { "dev:build": [ - "docker-compose exec operations ansible-playbook /usr/share/ash/playbook.yml" + "docker-compose exec operations ansible-playbook /usr/share/operations/playbook.yml" ], "dev:shell": [ "docker-compose exec operations bash" ], "dev:start": [ - "docker-compose up -d --build && docker-compose exec operations ansible-playbook /usr/share/ash/playbook.yml" + "docker-compose up -d --build && docker-compose exec operations ansible-playbook /usr/share/operations/playbook.yml" ], "dev:destroy": [ "docker-compose kill && docker-compose rm -fv" From 0f7b79469647515e40a87faf031fa504ece1b8dc Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Tue, 23 Apr 2024 15:55:33 -0400 Subject: [PATCH 07/32] Add to defaults.yml. --- roles/operations.runner/defaults/main.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/roles/operations.runner/defaults/main.yml b/roles/operations.runner/defaults/main.yml index c96949a..dd2fc77 100644 --- a/roles/operations.runner/defaults/main.yml +++ b/roles/operations.runner/defaults/main.yml @@ -1 +1,9 @@ operations_github_runner_path: /usr/share/github-runner + +# Replace with your repo information. Get the runner token under Settings > Actions > Runners > New Runner +operations_github_runners: + - repo_url: https://github.com/jonpugh/operations-ops + runner_token: CopyFromAddRunnerPage + runner_name: "{{ inventory_hostname }}" + runner_labels: local,operations + user: platform From 48ebabaa74f0191f7d19244141431b8782e424de Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Tue, 23 Apr 2024 15:59:17 -0400 Subject: [PATCH 08/32] Add operations_host_ddev ansible group to inventory for applying the DDEV installation. --- ansible/hosts | 4 +++- playbook.yml | 6 ++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/ansible/hosts b/ansible/hosts index 96a45bd..9408c4a 100644 --- a/ansible/hosts +++ b/ansible/hosts @@ -4,5 +4,7 @@ # replace "localhost" with the FQDN of this server. # (optional. This just puts it in the ansible output, which is nice.) # - +# Install the desired hosting engine by adding it to the right group, as defined in "hosts" in playbook.yml "Configure Hosting: DDEV". +# +[operations_host_ddev] localhost ansible_connection=local diff --git a/playbook.yml b/playbook.yml index 9374dcb..5ac187e 100644 --- a/playbook.yml +++ b/playbook.yml @@ -1,6 +1,7 @@ --- -- hosts: all +- name: Configure Server + hosts: all vars_files: playbook.vars.yml become: true @@ -13,7 +14,8 @@ - role: geerlingguy.github-users tags: system -- hosts: operations_host +- name: "Configure Hosting: DDEV" + hosts: operations_host_ddev vars_files: playbook.vars.yml roles: From ce22f7f98ef203f7b42d5e26508b79365c7c7c46 Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Tue, 23 Apr 2024 16:03:22 -0400 Subject: [PATCH 09/32] Remove writing ansible/hosts. It's already there. --- .github/workflows/ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 914a2c9..d8ec488 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -50,7 +50,6 @@ jobs: - name: Set variables run: | - echo -e '[operations_host]\n${{ env.OPERATIONS_ENVIRONMENT_NAME }} ansible_connection=local' > ./ansible/hosts echo "DOCKER_HOSTNAME=${{ env.OPERATIONS_ENVIRONMENT_NAME }}" > .env echo "# CI variables set! operations_admin_users: From 78346622ff2d6c72de953807ccc60fc45ce67e6d Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Wed, 24 Apr 2024 10:16:36 -0400 Subject: [PATCH 10/32] Request a new runner token so we always get a new one to create new runners. --- ansible/host_vars/operations.host.example.yml | 9 +++--- roles/operations.runner/defaults/main.yml | 11 ++++--- roles/operations.runner/tasks/github.yml | 31 ++++++++++--------- roles/operations.runner/tasks/main.yml | 18 ++++++++++- 4 files changed, 44 insertions(+), 25 deletions(-) diff --git a/ansible/host_vars/operations.host.example.yml b/ansible/host_vars/operations.host.example.yml index a6de980..f66d5a9 100644 --- a/ansible/host_vars/operations.host.example.yml +++ b/ansible/host_vars/operations.host.example.yml @@ -11,11 +11,12 @@ operations_admin_users: - jonpugh -# -# Replace with your repo information. Get the runner token under Settings > Actions > Runners > New Runner +operations_github_api_token: DefaultApiToken operations_github_runners: - - repo_url: https://github.com/jonpugh/operations-ops - runner_token: CopyFromAddRunnerPage + - repo_name: jonpugh/operations + repo_host: https://github.com runner_name: "{{ inventory_hostname }}" + # Set a runner-specific api_token, if desired. + api_token: "{{ operations_github_api_token }}" runner_labels: local,operations user: platform diff --git a/roles/operations.runner/defaults/main.yml b/roles/operations.runner/defaults/main.yml index dd2fc77..4eaba3e 100644 --- a/roles/operations.runner/defaults/main.yml +++ b/roles/operations.runner/defaults/main.yml @@ -1,9 +1,10 @@ operations_github_runner_path: /usr/share/github-runner - -# Replace with your repo information. Get the runner token under Settings > Actions > Runners > New Runner +operations_github_api_token: DefaultApiToken operations_github_runners: - - repo_url: https://github.com/jonpugh/operations-ops - runner_token: CopyFromAddRunnerPage + - repo_name: jonpugh/operations + repo_host: https://github.com runner_name: "{{ inventory_hostname }}" - runner_labels: local,operations + # Set a runner-specific api_token, if desired. + # api_token: "{{ operations_github_api_token }}" + runner_labels: example,local,operations user: platform diff --git a/roles/operations.runner/tasks/github.yml b/roles/operations.runner/tasks/github.yml index 3d8f885..4a277a6 100644 --- a/roles/operations.runner/tasks/github.yml +++ b/roles/operations.runner/tasks/github.yml @@ -1,25 +1,26 @@ --- -# See Your repo > Settings > Actions > Runner > New Runner -- name: Install GitHub Runner - shell: - cmd: "{{ item }}" - with_items: - - mkdir {{ operations_github_runner_path }} -p - - curl -o {{ operations_github_runner_path }}/actions-runner-linux-x64-2.314.1.tar.gz -L https://github.com/actions/runner/releases/download/v2.314.1/actions-runner-linux-x64-2.314.1.tar.gz - - cd {{ operations_github_runner_path }} && tar xzf {{ operations_github_runner_path }}/actions-runner-linux-x64-2.314.1.tar.gz - - cd {{ operations_github_runner_path }} && ./bin/installdependencies.sh - - chown {{ operations_platform_user }}:{{ operations_platform_user }} {{ operations_github_runner_path }} -R - - cd {{ operations_github_runner_path }} && ./bin/installdependencies.sh - - ls -la {{ operations_github_runner_path }} +# See https://docs.github.com/en/rest/actions/self-hosted-runners?apiVersion=2022-11-28#create-configuration-for-a-just-in-time-runner-for-an-organization--fine-grained-access-tokens +- name: "{{ item.repo_name }} | Get GitHub Runner Token" + shell: | + curl -L \ + -X POST \ + -H "Accept: application/vnd.github+json" \ + -H "Authorization: Bearer {{ item.api_token | default(operations_github_api_token) }}" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + https://api.github.com/repos/{{item.repo_name}}/actions/runners/registration-token + register: result + failed_when: + - "'token' not in result.stdout" +- set_fact: + github_runner_registration_token: "{{ result.stdout | from_json }}" -- name: Configure GitHub Runner +- name: "{{ item.repo_name }} | Setup GitHub Runner" shell: - cmd: "cd {{ operations_github_runner_path }} && ./config.sh remove --token {{ item.runner_token }} && ./config.sh --replace --unattended --url {{ item.repo_url }} --token {{ item.runner_token }} --name {{ item.runner_name }} --labels {{ item.runner_labels }}" + cmd: "cd {{ operations_github_runner_path }} && ./config.sh remove --token {{ github_runner_registration_token.token }} && ./config.sh --replace --unattended --url {{ item.repo_host }}/{{ item.repo_name }} --token {{ github_runner_registration_token.token }} --name {{ item.runner_name }} --labels {{ item.runner_labels }}" chdir: "{{ operations_github_runner_path }}" become: true become_user: "{{ item.user }}" - with_items: "{{ operations_github_runners }}" #- name: Add GitHub Runner Service # shell: diff --git a/roles/operations.runner/tasks/main.yml b/roles/operations.runner/tasks/main.yml index 8ffa12e..1f93006 100644 --- a/roles/operations.runner/tasks/main.yml +++ b/roles/operations.runner/tasks/main.yml @@ -1,2 +1,18 @@ --- -- include_tasks: github.yml + +# See Your repo > Settings > Actions > Runner > New Runner +- name: Install GitHub Runner Software + shell: + cmd: | + mkdir {{ operations_github_runner_path }} -p + curl -o {{ operations_github_runner_path }}/actions-runner-linux-x64-2.314.1.tar.gz -L https://github.com/actions/runner/releases/download/v2.314.1/actions-runner-linux-x64-2.314.1.tar.gz + cd {{ operations_github_runner_path }} && tar xzf {{ operations_github_runner_path }}/actions-runner-linux-x64-2.314.1.tar.gz + cd {{ operations_github_runner_path }} && ./bin/installdependencies.sh + chown {{ operations_platform_user }}:{{ operations_platform_user }} {{ operations_github_runner_path }} -R + cd {{ operations_github_runner_path }} && ./bin/installdependencies.sh + ls -la {{ operations_github_runner_path }} + creates: "{{ operations_github_runner_path }}" + +- name: Configure GitHub Runners + include_tasks: github.yml + with_items: "{{ operations_github_runners }}" From 884ff1870f7180c8b9cb3ba027657cb316485e39 Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Wed, 24 Apr 2024 10:30:28 -0400 Subject: [PATCH 11/32] Default to https://github.com for repo_host --- roles/operations.runner/defaults/main.yml | 3 ++- roles/operations.runner/tasks/github.yml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/roles/operations.runner/defaults/main.yml b/roles/operations.runner/defaults/main.yml index 4eaba3e..31b421e 100644 --- a/roles/operations.runner/defaults/main.yml +++ b/roles/operations.runner/defaults/main.yml @@ -2,7 +2,8 @@ operations_github_runner_path: /usr/share/github-runner operations_github_api_token: DefaultApiToken operations_github_runners: - repo_name: jonpugh/operations - repo_host: https://github.com + # Set repo_host if using enterprise github. + # repo_host: https://github.com runner_name: "{{ inventory_hostname }}" # Set a runner-specific api_token, if desired. # api_token: "{{ operations_github_api_token }}" diff --git a/roles/operations.runner/tasks/github.yml b/roles/operations.runner/tasks/github.yml index 4a277a6..7d5625d 100644 --- a/roles/operations.runner/tasks/github.yml +++ b/roles/operations.runner/tasks/github.yml @@ -17,7 +17,7 @@ - name: "{{ item.repo_name }} | Setup GitHub Runner" shell: - cmd: "cd {{ operations_github_runner_path }} && ./config.sh remove --token {{ github_runner_registration_token.token }} && ./config.sh --replace --unattended --url {{ item.repo_host }}/{{ item.repo_name }} --token {{ github_runner_registration_token.token }} --name {{ item.runner_name }} --labels {{ item.runner_labels }}" + cmd: "cd {{ operations_github_runner_path }} && ./config.sh remove --token {{ github_runner_registration_token.token }} && ./config.sh --replace --unattended --url {{ item.repo_host | default() }}/{{ item.repo_name }} --token {{ github_runner_registration_token.token }} --name {{ item.runner_name }} --labels {{ item.runner_labels }}" chdir: "{{ operations_github_runner_path }}" become: true become_user: "{{ item.user }}" From f8f9fe265afaced0f424e3ee42f9e874c14ab0e8 Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Wed, 24 Apr 2024 10:33:34 -0400 Subject: [PATCH 12/32] Use secret API token in CI. --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d8ec488..5dfeec1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -52,11 +52,11 @@ jobs: run: | echo "DOCKER_HOSTNAME=${{ env.OPERATIONS_ENVIRONMENT_NAME }}" > .env echo "# CI variables set! + operations_github_api_token: ${{ secrets.GITHUB_ADMIN_API_TOKEN }} operations_admin_users: - jonpugh operations_github_runners: - - repo_url: ${{ github.server_url }}/${{ github.repository }} - runner_token: ${{ secrets.RUNNER_TOKEN }} + - repo_name: ${{ github.repository }} runner_name: ${{ env.OPERATIONS_ENVIRONMENT_NAME }} runner_labels: ci user: platform From 06583ffd2e418414c92b05707666827a434dbc02 Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Wed, 24 Apr 2024 10:35:51 -0400 Subject: [PATCH 13/32] Use proper secret variable name. --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5dfeec1..b30cde5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -52,7 +52,7 @@ jobs: run: | echo "DOCKER_HOSTNAME=${{ env.OPERATIONS_ENVIRONMENT_NAME }}" > .env echo "# CI variables set! - operations_github_api_token: ${{ secrets.GITHUB_ADMIN_API_TOKEN }} + operations_github_api_token: ${{ secrets.OPERATIONS_GITHUB_API_TOKEN }} operations_admin_users: - jonpugh operations_github_runners: From 86e5a352e4fb2111bc192121c16671629248c1a3 Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Wed, 24 Apr 2024 10:41:46 -0400 Subject: [PATCH 14/32] Set ansible inventory hostname. --- .github/workflows/ci.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b30cde5..cb004f4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -48,6 +48,11 @@ jobs: echo "OPERATIONS_NAME=pr${{ github.event.number }}" >> "$GITHUB_ENV" echo "OPERATIONS_ENVIRONMENT_NAME=operations.pr${{ github.event.number }}.local.computer" >> "$GITHUB_ENV" + - name: Set ansible inventory hostname + run: | + echo "[operations_host_ddev] + ${{ env.OPERATIONS_ENVIRONMENT_NAME }} ansible_connection=local" > ./ansible/hosts + - name: Set variables run: | echo "DOCKER_HOSTNAME=${{ env.OPERATIONS_ENVIRONMENT_NAME }}" > .env From 91d87dbc01af1c4bc6273d9a4f901f719b7e82d0 Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Wed, 24 Apr 2024 10:43:48 -0400 Subject: [PATCH 15/32] Force color. --- ansible/ansible.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ansible/ansible.cfg b/ansible/ansible.cfg index 4db4160..dfb6e0e 100644 --- a/ansible/ansible.cfg +++ b/ansible/ansible.cfg @@ -1,6 +1,6 @@ [defaults] stdout_callback = yaml -;force_color = True +force_color = True ;interpreter_python = auto roles_path = ./roles From 888a08e7dca25eb52a18b12db806af56649edfb5 Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Wed, 24 Apr 2024 10:46:40 -0400 Subject: [PATCH 16/32] Forgot default url. --- roles/operations.runner/tasks/github.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/roles/operations.runner/tasks/github.yml b/roles/operations.runner/tasks/github.yml index 7d5625d..eb4e022 100644 --- a/roles/operations.runner/tasks/github.yml +++ b/roles/operations.runner/tasks/github.yml @@ -17,7 +17,7 @@ - name: "{{ item.repo_name }} | Setup GitHub Runner" shell: - cmd: "cd {{ operations_github_runner_path }} && ./config.sh remove --token {{ github_runner_registration_token.token }} && ./config.sh --replace --unattended --url {{ item.repo_host | default() }}/{{ item.repo_name }} --token {{ github_runner_registration_token.token }} --name {{ item.runner_name }} --labels {{ item.runner_labels }}" + cmd: "cd {{ operations_github_runner_path }} && ./config.sh remove --token {{ github_runner_registration_token.token }} && ./config.sh --replace --unattended --url {{ item.repo_host | default('https://github.com') }}/{{ item.repo_name }} --token {{ github_runner_registration_token.token }} --name {{ item.runner_name }} --labels {{ item.runner_labels }}" chdir: "{{ operations_github_runner_path }}" become: true become_user: "{{ item.user }}" From dd9725beb718b28d90c232b221b8587f723e428a Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Wed, 24 Apr 2024 11:39:05 -0400 Subject: [PATCH 17/32] Make a better readme. --- README.md | 50 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8065100..13a3ed6 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ -# Operations Platform -## Self-hosted web app automation. +# Operations Hosting Platform +## Simple self-hosted web app automation. -Installation scripts for creating an automation platform for websites using GitOps tools like GitHub Workflows and BitBucket Pipelines. [![License](https://img.shields.io/badge/license-MIT-408677.svg)](LICENSE) @@ -14,6 +13,51 @@ There are two choices for LICENSE badges: [![License](https://poser.pugx.org/operations-platform/platform)](https://github.com/operations-platform/platform//main/LICENSE) --> +This code sets up a server for launching websites using GitOps tools like GitHub Actions and hosting tools like DDEV. + +The goal is to quickly launch running environments on any server for automated and manual testing. + +It uses GitHub Actions and Workflows with self-hosted runners, providing persistent, accessible environments that can be automatically and manually tested. + +### What this does + +This Ansible playbook prepares a bare linux server for running websites: + +1. Creates users for administrators and grants SSH access using GitHub user SSH keys. +2. Installs Docker, Composer, & DDEV. +3. Creates a `platform` user for storing site code and running tasks. +4. Installs GitHub Self-hosted Runner as a service, running as `platform` user. +5. Listens for new jobs remotely. No need to grant GitHub access to post webhooks. +6. Runs the GitHub Actions as defined in the project's `.github/workflows` config. + +Then, the project's codebase takes over using GitHub Actions config. + +### GitHub Actions + +With a self-hosted runner, all activity on the servers is run with GitHub's Actions system. + +Through the GitHub interface you can track every deployment, test run, and cron job for pull request and live environments. + +#### Deployment Logic + +For now, all deployment logic is stored in the GitHub workflow config: + +- Where to clone code. +- Command to launch sites. +- Command to run updates. +- Command to sync data. + +See examples folder for working config. + +With the right GitHub Actions config, the server will: + +1. Clone code to `/var/platform/example.com/pr#`. +2. Write special DDEV config to set unique URLs for each DDEV site. +3. Launch the site. (`ddev start`) +4. If a test site, sync data and run tests. + +For now, you must copy these templates into your workflows. As the project progresses, we will release shared tooling. + ## Documentation This is a very young project still in the proof of concept phase. More information will be added when possible. From 664e9532d7f5f43470e219c173f7076ecb91d2bf Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Wed, 24 Apr 2024 11:45:33 -0400 Subject: [PATCH 18/32] More README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 13a3ed6..cfc083a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# Operations Hosting Platform -## Simple self-hosted web app automation. +# Operations Platform Host +## Simple self-hosted web app automation. [![License](https://img.shields.io/badge/license-MIT-408677.svg)](LICENSE) @@ -15,9 +15,9 @@ There are two choices for LICENSE badges: This code sets up a server for launching websites using GitOps tools like GitHub Actions and hosting tools like DDEV. -The goal is to quickly launch running environments on any server for automated and manual testing. +The goal is to quickly launch running environments on any server for automated and manual testing, integrated directly with GitOps APIs. -It uses GitHub Actions and Workflows with self-hosted runners, providing persistent, accessible environments that can be automatically and manually tested. +It uses GitHub Actions and Workflows with self-hosted runners, providing persistent, accessible environments and logs, fully integrated with GitHub Deployments & Checks APIs for optimal developer experience. ### What this does From b2d100d355872487a8dfd91973858d030bb3cc94 Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Wed, 24 Apr 2024 11:47:05 -0400 Subject: [PATCH 19/32] Change name to "Operations Platform Git Runners". --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index cfc083a..a80e602 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# Operations Platform Host +# Operations Platform Git Runners -## Simple self-hosted web app automation. +## Simple self-hosted git-powered web app automation. [![License](https://img.shields.io/badge/license-MIT-408677.svg)](LICENSE) @@ -10,7 +10,7 @@ There are two choices for LICENSE badges: 1. License using shields.io (above): Can contain any text you want, and has no prerequisites, but must be manually updated if you change the license. 2. License using poser.pugx.org (below): shows the license that Packagist.org read from your composer.json file. Must register with Packagist to use Poser. -[![License](https://poser.pugx.org/operations-platform/platform)](https://github.com/operations-platform/platform//main/LICENSE) +[![License](https://poser.pugx.org/operations-platform/git-runners)](https://github.com/operations-platform/git-runners//main/LICENSE) --> This code sets up a server for launching websites using GitOps tools like GitHub Actions and hosting tools like DDEV. @@ -104,7 +104,7 @@ This is a very young project still in the proof of concept phase. More informati ### Links -- [GitHub issue templates](https://github.com/operations-platform/platform/issues/templates/edit) +- [GitHub issue templates](https://github.com/operations-platform/git-runners/issues/templates/edit) - [GitHub pull request template](/.github/pull_request_template.md) - [Contributing guide](/CONTRIBUTING) (Decide about your code of conduct) @@ -127,7 +127,7 @@ Once the repo is cloned, ansible will set up the rest. 1. Clone. - git clone git@github.com:operations-platform/platform.git /usr/share/operations + git clone git@github.com:operations-platform/git-runners.git /usr/share/operations 2. Get a GitHub Runner token. @@ -164,13 +164,13 @@ Please read [CONTRIBUTING.md](CONTRIBUTING.md) for details on the process for su ## Versioning -We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [releases](https://github.com/operations-platform/platform/releases) page. +We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [releases](https://github.com/operations-platform/git-runners/releases) page. ## Authors * **Jon Pugh** - created project from template. -See also the list of [contributors](https://github.com/operations-platform/platform/contributors) who participated in this project. +See also the list of [contributors](https://github.com/operations-platform/git-runners/contributors) who participated in this project. ## License From a4e34c3d7cd51b2496cc9efdd45a03b00330152d Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Wed, 24 Apr 2024 11:48:19 -0400 Subject: [PATCH 20/32] Change name to "Operations Platform Git Runners". --- roles/operations.runner/defaults/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/roles/operations.runner/defaults/main.yml b/roles/operations.runner/defaults/main.yml index 31b421e..a3ae4a5 100644 --- a/roles/operations.runner/defaults/main.yml +++ b/roles/operations.runner/defaults/main.yml @@ -1,7 +1,7 @@ operations_github_runner_path: /usr/share/github-runner operations_github_api_token: DefaultApiToken operations_github_runners: - - repo_name: jonpugh/operations + - repo_name: operations-platform/git-runners # Set repo_host if using enterprise github. # repo_host: https://github.com runner_name: "{{ inventory_hostname }}" From c5686dc2c189a4405dabc904a9438c4eb14526b2 Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Wed, 24 Apr 2024 11:50:40 -0400 Subject: [PATCH 21/32] and testing. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a80e602..7202c71 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Operations Platform Git Runners +# Operations Platform Site Server ## Simple self-hosted git-powered web app automation. @@ -13,7 +13,7 @@ There are two choices for LICENSE badges: [![License](https://poser.pugx.org/operations-platform/git-runners)](https://github.com/operations-platform/git-runners//main/LICENSE) --> -This code sets up a server for launching websites using GitOps tools like GitHub Actions and hosting tools like DDEV. +This code sets up a server for launching and testing websites using GitOps tools like GitHub Actions and hosting tools like DDEV. The goal is to quickly launch running environments on any server for automated and manual testing, integrated directly with GitOps APIs. From ac3b00d6368fe08601a3d02f6cb730fab9111224 Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Wed, 24 Apr 2024 11:51:13 -0400 Subject: [PATCH 22/32] Not related --- README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README.md b/README.md index 7202c71..59f218a 100644 --- a/README.md +++ b/README.md @@ -97,10 +97,7 @@ This is a very young project still in the proof of concept phase. More informati 3. **Git Runner config** - Each project must contain workflow/pipeline configuration files specifically for that git host that works with the private runners. - Example config files are located in the (Templates)[./templates] folder (Coming soon). -4. **Operations Dashboard / Site Manager** - - With this system, the git host is the only interface that is needed. - - The [Site Manager module](https://www.drupal.org/project/site_manager) can be used to create an "Operations Dashboard" for keeping track of all the created sites in a CMS-like experience. - - [Site.module](https://www.drupal.org/project/site) can be deployed to hosted sites and configured to post updates back to the Operations Dashboard. + ### Links From bf8dcfd3dd2a75f7c61b69788ef06c83d6655c44 Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Wed, 24 Apr 2024 11:54:27 -0400 Subject: [PATCH 23/32] Rename to operations-platform/site-server. --- README.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 59f218a..7982b2e 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ There are two choices for LICENSE badges: 1. License using shields.io (above): Can contain any text you want, and has no prerequisites, but must be manually updated if you change the license. 2. License using poser.pugx.org (below): shows the license that Packagist.org read from your composer.json file. Must register with Packagist to use Poser. -[![License](https://poser.pugx.org/operations-platform/git-runners)](https://github.com/operations-platform/git-runners//main/LICENSE) +[![License](https://poser.pugx.org/operations-platform/site-server)](https://github.com/operations-platform/site-server//main/LICENSE) --> This code sets up a server for launching and testing websites using GitOps tools like GitHub Actions and hosting tools like DDEV. @@ -101,7 +101,7 @@ This is a very young project still in the proof of concept phase. More informati ### Links -- [GitHub issue templates](https://github.com/operations-platform/git-runners/issues/templates/edit) +- [GitHub issue templates](https://github.com/operations-platform/site-server/issues/templates/edit) - [GitHub pull request template](/.github/pull_request_template.md) - [Contributing guide](/CONTRIBUTING) (Decide about your code of conduct) @@ -124,7 +124,7 @@ Once the repo is cloned, ansible will set up the rest. 1. Clone. - git clone git@github.com:operations-platform/git-runners.git /usr/share/operations + git clone git@github.com:operations-platform/site-server.git /usr/share/operations 2. Get a GitHub Runner token. @@ -137,10 +137,11 @@ Once the repo is cloned, ansible will set up the rest. cd /usr/share/operations cp -rf ansible/* /etc/ansible + cp /etc/ansible/host_vars/operations.host.example.yml /etc/ansible/host_vars/$SERVER_HOSTNAME.yml - In `/etc/ansible/hosts`, put your server's hostname. + Edit `/etc/ansible/hosts`, replace `localhost` with your `$SERVER_HOSTNAME`. - In `/etc/ansible/group_vars/operations_host.yml`, add the github users you wish to grant access, and set repo_url and the token. + Edit `/etc/ansible/host_vars/$SERVER_HOSTNAME.yml` to your own project settings. 4. Install. @@ -161,13 +162,13 @@ Please read [CONTRIBUTING.md](CONTRIBUTING.md) for details on the process for su ## Versioning -We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [releases](https://github.com/operations-platform/git-runners/releases) page. +We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [releases](https://github.com/operations-platform/site-server/releases) page. ## Authors * **Jon Pugh** - created project from template. -See also the list of [contributors](https://github.com/operations-platform/git-runners/contributors) who participated in this project. +See also the list of [contributors](https://github.com/operations-platform/site-server/contributors) who participated in this project. ## License From f89b0a9dd32561edaff4abd95b12bd48ed80d10e Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Wed, 24 Apr 2024 11:55:51 -0400 Subject: [PATCH 24/32] Rename to operations-platform/site-server. --- roles/operations.runner/defaults/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/roles/operations.runner/defaults/main.yml b/roles/operations.runner/defaults/main.yml index a3ae4a5..5ee2e3c 100644 --- a/roles/operations.runner/defaults/main.yml +++ b/roles/operations.runner/defaults/main.yml @@ -1,7 +1,7 @@ operations_github_runner_path: /usr/share/github-runner operations_github_api_token: DefaultApiToken operations_github_runners: - - repo_name: operations-platform/git-runners + - repo_name: operations-platform/site-server # Set repo_host if using enterprise github. # repo_host: https://github.com runner_name: "{{ inventory_hostname }}" From 5f9935894b078d53966a2c2834d46d9b50d93168 Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Wed, 24 Apr 2024 12:03:46 -0400 Subject: [PATCH 25/32] Rename for consistency. --- README.md | 1 + .../host_vars/{operations.host.example.yml => host.example.yml} | 0 ansible/{hosts => hosts.example} | 0 3 files changed, 1 insertion(+) rename ansible/host_vars/{operations.host.example.yml => host.example.yml} (100%) rename ansible/{hosts => hosts.example} (100%) diff --git a/README.md b/README.md index 7982b2e..eb3725e 100644 --- a/README.md +++ b/README.md @@ -137,6 +137,7 @@ Once the repo is cloned, ansible will set up the rest. cd /usr/share/operations cp -rf ansible/* /etc/ansible + cp /etc/ansible/hosts.default /etc/ansible/host_vars/$SERVER_HOSTNAME.yml cp /etc/ansible/host_vars/operations.host.example.yml /etc/ansible/host_vars/$SERVER_HOSTNAME.yml Edit `/etc/ansible/hosts`, replace `localhost` with your `$SERVER_HOSTNAME`. diff --git a/ansible/host_vars/operations.host.example.yml b/ansible/host_vars/host.example.yml similarity index 100% rename from ansible/host_vars/operations.host.example.yml rename to ansible/host_vars/host.example.yml diff --git a/ansible/hosts b/ansible/hosts.example similarity index 100% rename from ansible/hosts rename to ansible/hosts.example From b1e812c9a5ca6aa4b21ca652597f3226eb2a760d Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Wed, 24 Apr 2024 12:14:30 -0400 Subject: [PATCH 26/32] Better install instructions. --- README.md | 18 +++++++++++------- ansible/hosts.example | 7 ++----- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index eb3725e..81aa045 100644 --- a/README.md +++ b/README.md @@ -126,23 +126,27 @@ Once the repo is cloned, ansible will set up the rest. git clone git@github.com:operations-platform/site-server.git /usr/share/operations -2. Get a GitHub Runner token. +2. Get a GitHub API token. - 1. Go to your repo, "Settings" > "Actions" > "Runners" > "New Runner". - 2. Copy the token for use later. + - Go to https://github.com/settings/personal-access-tokens/new + - Ensure `administrator:write` permission is set. + - Ensure the repository you want to deploy is added. 3. Configure. Copy ansible inventory files in `./ansible` to `/etc/ansible`, then update the values. cd /usr/share/operations + + # Copy default ansible files. cp -rf ansible/* /etc/ansible - cp /etc/ansible/hosts.default /etc/ansible/host_vars/$SERVER_HOSTNAME.yml - cp /etc/ansible/host_vars/operations.host.example.yml /etc/ansible/host_vars/$SERVER_HOSTNAME.yml - Edit `/etc/ansible/hosts`, replace `localhost` with your `$SERVER_HOSTNAME`. + # Set your hostname in /etc/ansible/hosts and set variables in host_vars. + cd /etc/ansible + sed 's/localhost/{$SERVER_HOSTNAME}/g' hosts.example > hosts + cp host_vars/host.example.yml host_vars/{$SERVER_HOSTNAME}.yml - Edit `/etc/ansible/host_vars/$SERVER_HOSTNAME.yml` to your own project settings. + Edit `host_vars/{$SERVER_HOSTNAME}.yml` to match your github repo's information. Insert the API key there. 4. Install. diff --git a/ansible/hosts.example b/ansible/hosts.example index 9408c4a..8cf08d7 100644 --- a/ansible/hosts.example +++ b/ansible/hosts.example @@ -1,10 +1,7 @@ -# # Place in /etc/ansible/hosts # This defines your local system. -# replace "localhost" with the FQDN of this server. -# (optional. This just puts it in the ansible output, which is nice.) -# +# Replace "localhost" with the FQDN of this server. # Install the desired hosting engine by adding it to the right group, as defined in "hosts" in playbook.yml "Configure Hosting: DDEV". -# + [operations_host_ddev] localhost ansible_connection=local From 978bc93a76b43d8c52c3889ad384ae9ffc491a37 Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Wed, 24 Apr 2024 12:26:44 -0400 Subject: [PATCH 27/32] Add to CHANGELOG. --- CHANGELOG.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a0d5ed..fb357af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,13 @@ ### Unreleased -* TBD +* Renamed to `operations-platform/site-server`. +* Added server roles for security, users, docker, ddev. +* Added role to install GitHub Actions Runner. + +@TODO: + +* Install as a service. ### 0.1.0 - 2024/Mar/21 From 0d2c391a7709f0a90463fc21d6cf1c03862df368 Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Wed, 24 Apr 2024 12:26:50 -0400 Subject: [PATCH 28/32] Remove PHP stuff. --- box.json.dist | 5 - composer.json | 52 - composer.lock | 3490 ------------------------------------------------- 3 files changed, 3547 deletions(-) delete mode 100644 box.json.dist delete mode 100644 composer.json delete mode 100644 composer.lock diff --git a/box.json.dist b/box.json.dist deleted file mode 100644 index cc0ef33..0000000 --- a/box.json.dist +++ /dev/null @@ -1,5 +0,0 @@ -{ - "main": "example", - "output": "example.phar", - "files": ["example", "VERSION"] -} diff --git a/composer.json b/composer.json deleted file mode 100644 index 9a78b26..0000000 --- a/composer.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "operations/platform", - "description": "Open source private automated hosting platform.", - "license": "MIT", - "authors": [ - { - "name": "Jon Pugh", - "email": "jon@thinkdrop.net" - } - ], - "require": { - "php": ">=8" - }, - "require-dev": { - "consolidation/robo": "^4", - "knplabs/github-api": "^3.8", - "guzzlehttp/guzzle": "^7.0.1", - "http-interop/http-factory-guzzle": "^1.0" - }, - "scripts": { - "dev:build": [ - "docker-compose exec operations ansible-playbook /usr/share/operations/playbook.yml" - ], - "dev:shell": [ - "docker-compose exec operations bash" - ], - "dev:start": [ - "docker-compose up -d --build && docker-compose exec operations ansible-playbook /usr/share/operations/playbook.yml" - ], - "dev:destroy": [ - "docker-compose kill && docker-compose rm -fv" - ], - "dev:ansible:install": [ - "ansible-galaxy install -r roles.yml -p roles --force" - ] - }, - "config": { - "optimize-autoloader": true, - "sort-packages": true, - "platform": { - "php": "8.0.24" - }, - "allow-plugins": { - "php-http/discovery": true - } - }, - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - } -} diff --git a/composer.lock b/composer.lock deleted file mode 100644 index 8587ad5..0000000 --- a/composer.lock +++ /dev/null @@ -1,3490 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "4709d70d4d22079d1c999562471b91c6", - "packages": [], - "packages-dev": [ - { - "name": "clue/stream-filter", - "version": "v1.7.0", - "source": { - "type": "git", - "url": "https://github.com/clue/stream-filter.git", - "reference": "049509fef80032cb3f051595029ab75b49a3c2f7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/clue/stream-filter/zipball/049509fef80032cb3f051595029ab75b49a3c2f7", - "reference": "049509fef80032cb3f051595029ab75b49a3c2f7", - "shasum": "" - }, - "require": { - "php": ">=5.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "Clue\\StreamFilter\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@clue.engineering" - } - ], - "description": "A simple and modern approach to stream filtering in PHP", - "homepage": "https://github.com/clue/stream-filter", - "keywords": [ - "bucket brigade", - "callback", - "filter", - "php_user_filter", - "stream", - "stream_filter_append", - "stream_filter_register" - ], - "support": { - "issues": "https://github.com/clue/stream-filter/issues", - "source": "https://github.com/clue/stream-filter/tree/v1.7.0" - }, - "funding": [ - { - "url": "https://clue.engineering/support", - "type": "custom" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2023-12-20T15:40:13+00:00" - }, - { - "name": "composer/semver", - "version": "3.4.0", - "source": { - "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", - "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.4", - "symfony/phpunit-bridge": "^4.2 || ^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "semantic", - "semver", - "validation", - "versioning" - ], - "support": { - "irc": "ircs://irc.libera.chat:6697/composer", - "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.0" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2023-08-31T09:50:34+00:00" - }, - { - "name": "consolidation/annotated-command", - "version": "4.9.2", - "source": { - "type": "git", - "url": "https://github.com/consolidation/annotated-command.git", - "reference": "b5255dcbee1de95036185062a103dabc622224de" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/consolidation/annotated-command/zipball/b5255dcbee1de95036185062a103dabc622224de", - "reference": "b5255dcbee1de95036185062a103dabc622224de", - "shasum": "" - }, - "require": { - "consolidation/output-formatters": "^4.3.1", - "php": ">=7.1.3", - "psr/log": "^1 || ^2 || ^3", - "symfony/console": "^4.4.8 || ^5 || ^6", - "symfony/event-dispatcher": "^4.4.8 || ^5 || ^6", - "symfony/finder": "^4.4.8 || ^5 || ^6" - }, - "require-dev": { - "composer-runtime-api": "^2.0", - "phpunit/phpunit": "^7.5.20 || ^8 || ^9", - "squizlabs/php_codesniffer": "^3", - "yoast/phpunit-polyfills": "^0.2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.x-dev" - } - }, - "autoload": { - "psr-4": { - "Consolidation\\AnnotatedCommand\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Greg Anderson", - "email": "greg.1.anderson@greenknowe.org" - } - ], - "description": "Initialize Symfony Console commands from annotated command class methods.", - "support": { - "issues": "https://github.com/consolidation/annotated-command/issues", - "source": "https://github.com/consolidation/annotated-command/tree/4.9.2" - }, - "time": "2023-12-26T14:30:50+00:00" - }, - { - "name": "consolidation/config", - "version": "2.1.2", - "source": { - "type": "git", - "url": "https://github.com/consolidation/config.git", - "reference": "597f8d7fbeef801736250ec10c3e190569b1b0ae" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/consolidation/config/zipball/597f8d7fbeef801736250ec10c3e190569b1b0ae", - "reference": "597f8d7fbeef801736250ec10c3e190569b1b0ae", - "shasum": "" - }, - "require": { - "dflydev/dot-access-data": "^1.1.0 || ^2 || ^3", - "grasmash/expander": "^2.0.1 || ^3", - "php": ">=7.1.3", - "symfony/event-dispatcher": "^4 || ^5 || ^6" - }, - "require-dev": { - "ext-json": "*", - "phpunit/phpunit": ">=7.5.20", - "squizlabs/php_codesniffer": "^3", - "symfony/console": "^4 || ^5 || ^6", - "symfony/yaml": "^4 || ^5 || ^6", - "yoast/phpunit-polyfills": "^1" - }, - "suggest": { - "symfony/event-dispatcher": "Required to inject configuration into Command options", - "symfony/yaml": "Required to use Consolidation\\Config\\Loader\\YamlConfigLoader" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Consolidation\\Config\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Greg Anderson", - "email": "greg.1.anderson@greenknowe.org" - } - ], - "description": "Provide configuration services for a commandline tool.", - "support": { - "issues": "https://github.com/consolidation/config/issues", - "source": "https://github.com/consolidation/config/tree/2.1.2" - }, - "time": "2022-10-06T17:48:03+00:00" - }, - { - "name": "consolidation/log", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/consolidation/log.git", - "reference": "caaad9d70dae54eb49002666f000e3c607066878" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/consolidation/log/zipball/caaad9d70dae54eb49002666f000e3c607066878", - "reference": "caaad9d70dae54eb49002666f000e3c607066878", - "shasum": "" - }, - "require": { - "php": ">=8.0.0", - "psr/log": "^3", - "symfony/console": "^5 || ^6" - }, - "require-dev": { - "phpunit/phpunit": ">=7.5.20", - "squizlabs/php_codesniffer": "^3", - "yoast/phpunit-polyfills": "^0.2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Consolidation\\Log\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Greg Anderson", - "email": "greg.1.anderson@greenknowe.org" - } - ], - "description": "Improved Psr-3 / Psr\\Log logger based on Symfony Console components.", - "support": { - "issues": "https://github.com/consolidation/log/issues", - "source": "https://github.com/consolidation/log/tree/3.0.0" - }, - "time": "2022-04-05T16:53:32+00:00" - }, - { - "name": "consolidation/output-formatters", - "version": "4.3.2", - "source": { - "type": "git", - "url": "https://github.com/consolidation/output-formatters.git", - "reference": "06711568b4cd169700ff7e8075db0a9a341ceb58" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/consolidation/output-formatters/zipball/06711568b4cd169700ff7e8075db0a9a341ceb58", - "reference": "06711568b4cd169700ff7e8075db0a9a341ceb58", - "shasum": "" - }, - "require": { - "dflydev/dot-access-data": "^1.1.0 || ^2 || ^3", - "php": ">=7.1.3", - "symfony/console": "^4 || ^5 || ^6", - "symfony/finder": "^4 || ^5 || ^6" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.4.2", - "phpunit/phpunit": "^7 || ^8 || ^9", - "squizlabs/php_codesniffer": "^3", - "symfony/var-dumper": "^4 || ^5 || ^6", - "symfony/yaml": "^4 || ^5 || ^6", - "yoast/phpunit-polyfills": "^1" - }, - "suggest": { - "symfony/var-dumper": "For using the var_dump formatter" - }, - "type": "library", - "autoload": { - "psr-4": { - "Consolidation\\OutputFormatters\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Greg Anderson", - "email": "greg.1.anderson@greenknowe.org" - } - ], - "description": "Format text by applying transformations provided by plug-in formatters.", - "support": { - "issues": "https://github.com/consolidation/output-formatters/issues", - "source": "https://github.com/consolidation/output-formatters/tree/4.3.2" - }, - "time": "2023-07-06T04:45:41+00:00" - }, - { - "name": "consolidation/robo", - "version": "4.0.6", - "source": { - "type": "git", - "url": "https://github.com/consolidation/robo.git", - "reference": "55a272370940607649e5c46eb173c5c54f7c166d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/consolidation/robo/zipball/55a272370940607649e5c46eb173c5c54f7c166d", - "reference": "55a272370940607649e5c46eb173c5c54f7c166d", - "shasum": "" - }, - "require": { - "consolidation/annotated-command": "^4.8.1", - "consolidation/config": "^2.0.1", - "consolidation/log": "^2.0.2 || ^3", - "consolidation/output-formatters": "^4.1.2", - "consolidation/self-update": "^2.0", - "league/container": "^3.3.1 || ^4.0", - "php": ">=8.0", - "phpowermove/docblock": "^4.0", - "symfony/console": "^6", - "symfony/event-dispatcher": "^6", - "symfony/filesystem": "^6", - "symfony/finder": "^6", - "symfony/process": "^6", - "symfony/yaml": "^6" - }, - "conflict": { - "codegyre/robo": "*" - }, - "require-dev": { - "natxet/cssmin": "3.0.4", - "patchwork/jsqueeze": "^2", - "pear/archive_tar": "^1.4.4", - "phpunit/phpunit": "^7.5.20 || ^8", - "squizlabs/php_codesniffer": "^3.6", - "yoast/phpunit-polyfills": "^0.2.0" - }, - "suggest": { - "natxet/cssmin": "For minifying CSS files in taskMinify", - "patchwork/jsqueeze": "For minifying JS files in taskMinify", - "pear/archive_tar": "Allows tar archives to be created and extracted in taskPack and taskExtract, respectively.", - "totten/lurkerlite": "For monitoring filesystem changes in taskWatch" - }, - "bin": [ - "robo" - ], - "type": "library", - "autoload": { - "psr-4": { - "Robo\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Davert", - "email": "davert.php@resend.cc" - } - ], - "description": "Modern task runner", - "support": { - "issues": "https://github.com/consolidation/robo/issues", - "source": "https://github.com/consolidation/robo/tree/4.0.6" - }, - "time": "2023-04-30T21:49:04+00:00" - }, - { - "name": "consolidation/self-update", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/consolidation/self-update.git", - "reference": "972a1016761c9b63314e040836a12795dff6953a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/consolidation/self-update/zipball/972a1016761c9b63314e040836a12795dff6953a", - "reference": "972a1016761c9b63314e040836a12795dff6953a", - "shasum": "" - }, - "require": { - "composer/semver": "^3.2", - "php": ">=5.5.0", - "symfony/console": "^2.8 || ^3 || ^4 || ^5 || ^6", - "symfony/filesystem": "^2.5 || ^3 || ^4 || ^5 || ^6" - }, - "bin": [ - "scripts/release" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "SelfUpdate\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Alexander Menk", - "email": "menk@mestrona.net" - }, - { - "name": "Greg Anderson", - "email": "greg.1.anderson@greenknowe.org" - } - ], - "description": "Provides a self:update command for Symfony Console applications.", - "support": { - "issues": "https://github.com/consolidation/self-update/issues", - "source": "https://github.com/consolidation/self-update/tree/2.2.0" - }, - "time": "2023-03-18T01:37:41+00:00" - }, - { - "name": "dflydev/dot-access-data", - "version": "v3.0.2", - "source": { - "type": "git", - "url": "https://github.com/dflydev/dflydev-dot-access-data.git", - "reference": "f41715465d65213d644d3141a6a93081be5d3549" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/f41715465d65213d644d3141a6a93081be5d3549", - "reference": "f41715465d65213d644d3141a6a93081be5d3549", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.42", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", - "scrutinizer/ocular": "1.6.0", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^4.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Dflydev\\DotAccessData\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Dragonfly Development Inc.", - "email": "info@dflydev.com", - "homepage": "http://dflydev.com" - }, - { - "name": "Beau Simensen", - "email": "beau@dflydev.com", - "homepage": "http://beausimensen.com" - }, - { - "name": "Carlos Frutos", - "email": "carlos@kiwing.it", - "homepage": "https://github.com/cfrutos" - }, - { - "name": "Colin O'Dell", - "email": "colinodell@gmail.com", - "homepage": "https://www.colinodell.com" - } - ], - "description": "Given a deep data structure, access data by dot notation.", - "homepage": "https://github.com/dflydev/dflydev-dot-access-data", - "keywords": [ - "access", - "data", - "dot", - "notation" - ], - "support": { - "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", - "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.2" - }, - "time": "2022-10-27T11:44:00+00:00" - }, - { - "name": "grasmash/expander", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/grasmash/expander.git", - "reference": "bb1c1a2430957945cf08c5a62f5d72a6aa6a2c82" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/grasmash/expander/zipball/bb1c1a2430957945cf08c5a62f5d72a6aa6a2c82", - "reference": "bb1c1a2430957945cf08c5a62f5d72a6aa6a2c82", - "shasum": "" - }, - "require": { - "dflydev/dot-access-data": "^3.0.0", - "php": ">=8.0", - "psr/log": "^2 | ^3" - }, - "require-dev": { - "greg-1-anderson/composer-test-scenarios": "^1", - "php-coveralls/php-coveralls": "^2.5", - "phpunit/phpunit": "^9", - "squizlabs/php_codesniffer": "^3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Grasmash\\Expander\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Matthew Grasmick" - } - ], - "description": "Expands internal property references in PHP arrays file.", - "support": { - "issues": "https://github.com/grasmash/expander/issues", - "source": "https://github.com/grasmash/expander/tree/3.0.0" - }, - "time": "2022-05-10T13:14:49+00:00" - }, - { - "name": "guzzlehttp/guzzle", - "version": "7.8.1", - "source": { - "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "41042bc7ab002487b876a0683fc8dce04ddce104" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", - "reference": "41042bc7ab002487b876a0683fc8dce04ddce104", - "shasum": "" - }, - "require": { - "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0.1", - "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", - "php": "^7.2.5 || ^8.0", - "psr/http-client": "^1.0", - "symfony/deprecation-contracts": "^2.2 || ^3.0" - }, - "provide": { - "psr/http-client-implementation": "1.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "ext-curl": "*", - "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", - "php-http/message-factory": "^1.1", - "phpunit/phpunit": "^8.5.36 || ^9.6.15", - "psr/log": "^1.1 || ^2.0 || ^3.0" - }, - "suggest": { - "ext-curl": "Required for CURL handler support", - "ext-intl": "Required for Internationalized Domain Name (IDN) support", - "psr/log": "Required for using the Log middleware" - }, - "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - } - }, - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "GuzzleHttp\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Jeremy Lindblom", - "email": "jeremeamia@gmail.com", - "homepage": "https://github.com/jeremeamia" - }, - { - "name": "George Mponos", - "email": "gmponos@gmail.com", - "homepage": "https://github.com/gmponos" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://github.com/sagikazarmark" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - } - ], - "description": "Guzzle is a PHP HTTP client library", - "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "psr-18", - "psr-7", - "rest", - "web service" - ], - "support": { - "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.8.1" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", - "type": "tidelift" - } - ], - "time": "2023-12-03T20:35:24+00:00" - }, - { - "name": "guzzlehttp/promises", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", - "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", - "shasum": "" - }, - "require": { - "php": "^7.2.5 || ^8.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.36 || ^9.6.15" - }, - "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Promise\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - } - ], - "description": "Guzzle promises library", - "keywords": [ - "promise" - ], - "support": { - "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.2" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", - "type": "tidelift" - } - ], - "time": "2023-12-03T20:19:20+00:00" - }, - { - "name": "guzzlehttp/psr7", - "version": "2.6.2", - "source": { - "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", - "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", - "shasum": "" - }, - "require": { - "php": "^7.2.5 || ^8.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.1 || ^2.0", - "ralouphie/getallheaders": "^3.0" - }, - "provide": { - "psr/http-factory-implementation": "1.0", - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.36 || ^9.6.15" - }, - "suggest": { - "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" - }, - "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "George Mponos", - "email": "gmponos@gmail.com", - "homepage": "https://github.com/gmponos" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://github.com/sagikazarmark" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://sagikazarmark.hu" - } - ], - "description": "PSR-7 message implementation that also provides common utility methods", - "keywords": [ - "http", - "message", - "psr-7", - "request", - "response", - "stream", - "uri", - "url" - ], - "support": { - "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.6.2" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", - "type": "tidelift" - } - ], - "time": "2023-12-03T20:05:35+00:00" - }, - { - "name": "http-interop/http-factory-guzzle", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/http-interop/http-factory-guzzle.git", - "reference": "8f06e92b95405216b237521cc64c804dd44c4a81" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/http-interop/http-factory-guzzle/zipball/8f06e92b95405216b237521cc64c804dd44c4a81", - "reference": "8f06e92b95405216b237521cc64c804dd44c4a81", - "shasum": "" - }, - "require": { - "guzzlehttp/psr7": "^1.7||^2.0", - "php": ">=7.3", - "psr/http-factory": "^1.0" - }, - "provide": { - "psr/http-factory-implementation": "^1.0" - }, - "require-dev": { - "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^9.5" - }, - "suggest": { - "guzzlehttp/psr7": "Includes an HTTP factory starting in version 2.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Http\\Factory\\Guzzle\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "An HTTP Factory using Guzzle PSR7", - "keywords": [ - "factory", - "http", - "psr-17", - "psr-7" - ], - "support": { - "issues": "https://github.com/http-interop/http-factory-guzzle/issues", - "source": "https://github.com/http-interop/http-factory-guzzle/tree/1.2.0" - }, - "time": "2021-07-21T13:50:14+00:00" - }, - { - "name": "knplabs/github-api", - "version": "v3.14.0", - "source": { - "type": "git", - "url": "https://github.com/KnpLabs/php-github-api.git", - "reference": "16235d0eaffe5100492e6c788c58346100b2d734" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/KnpLabs/php-github-api/zipball/16235d0eaffe5100492e6c788c58346100b2d734", - "reference": "16235d0eaffe5100492e6c788c58346100b2d734", - "shasum": "" - }, - "require": { - "ext-json": "*", - "php": "^7.2.5 || ^8.0", - "php-http/cache-plugin": "^1.7.1|^2.0", - "php-http/client-common": "^2.3", - "php-http/discovery": "^1.12", - "php-http/httplug": "^2.2", - "php-http/multipart-stream-builder": "^1.1.2", - "psr/cache": "^1.0|^2.0|^3.0", - "psr/http-client-implementation": "^1.0", - "psr/http-factory-implementation": "^1.0", - "psr/http-message": "^1.0|^2.0", - "symfony/deprecation-contracts": "^2.2|^3.0", - "symfony/polyfill-php80": "^1.17" - }, - "require-dev": { - "guzzlehttp/guzzle": "^7.2", - "guzzlehttp/psr7": "^1.7", - "http-interop/http-factory-guzzle": "^1.0", - "php-http/mock-client": "^1.4.1", - "phpstan/extension-installer": "^1.0.5", - "phpstan/phpstan": "^0.12.57", - "phpstan/phpstan-deprecation-rules": "^0.12.5", - "phpunit/phpunit": "^8.5 || ^9.4", - "symfony/cache": "^5.1.8", - "symfony/phpunit-bridge": "^5.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.20.x-dev", - "dev-master": "3.13-dev" - } - }, - "autoload": { - "psr-4": { - "Github\\": "lib/Github/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "KnpLabs Team", - "homepage": "http://knplabs.com" - }, - { - "name": "Thibault Duplessis", - "email": "thibault.duplessis@gmail.com", - "homepage": "http://ornicar.github.com" - } - ], - "description": "GitHub API v3 client", - "homepage": "https://github.com/KnpLabs/php-github-api", - "keywords": [ - "api", - "gh", - "gist", - "github" - ], - "support": { - "issues": "https://github.com/KnpLabs/php-github-api/issues", - "source": "https://github.com/KnpLabs/php-github-api/tree/v3.14.0" - }, - "funding": [ - { - "url": "https://github.com/acrobat", - "type": "github" - } - ], - "time": "2024-03-19T14:52:45+00:00" - }, - { - "name": "league/container", - "version": "4.2.2", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/container.git", - "reference": "ff346319ca1ff0e78277dc2311a42107cc1aab88" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/container/zipball/ff346319ca1ff0e78277dc2311a42107cc1aab88", - "reference": "ff346319ca1ff0e78277dc2311a42107cc1aab88", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "psr/container": "^1.1 || ^2.0" - }, - "provide": { - "psr/container-implementation": "^1.0" - }, - "replace": { - "orno/di": "~2.0" - }, - "require-dev": { - "nette/php-generator": "^3.4", - "nikic/php-parser": "^4.10", - "phpstan/phpstan": "^0.12.47", - "phpunit/phpunit": "^8.5.17", - "roave/security-advisories": "dev-latest", - "scrutinizer/ocular": "^1.8", - "squizlabs/php_codesniffer": "^3.6" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.x-dev", - "dev-4.x": "4.x-dev", - "dev-3.x": "3.x-dev", - "dev-2.x": "2.x-dev", - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "League\\Container\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Phil Bennett", - "email": "mail@philbennett.co.uk", - "role": "Developer" - } - ], - "description": "A fast and intuitive dependency injection container.", - "homepage": "https://github.com/thephpleague/container", - "keywords": [ - "container", - "dependency", - "di", - "injection", - "league", - "provider", - "service" - ], - "support": { - "issues": "https://github.com/thephpleague/container/issues", - "source": "https://github.com/thephpleague/container/tree/4.2.2" - }, - "funding": [ - { - "url": "https://github.com/philipobenito", - "type": "github" - } - ], - "time": "2024-03-13T13:12:53+00:00" - }, - { - "name": "phootwork/collection", - "version": "v3.2.2", - "source": { - "type": "git", - "url": "https://github.com/phootwork/collection.git", - "reference": "46dde20420fba17766c89200bc3ff91d3e58eafa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phootwork/collection/zipball/46dde20420fba17766c89200bc3ff91d3e58eafa", - "reference": "46dde20420fba17766c89200bc3ff91d3e58eafa", - "shasum": "" - }, - "require": { - "phootwork/lang": "^3.0", - "php": ">=8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "phootwork\\collection\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Thomas Gossmann", - "homepage": "http://gos.si" - } - ], - "description": "The phootwork library fills gaps in the php language and provides better solutions than the existing ones php offers.", - "homepage": "https://phootwork.github.io/collection/", - "keywords": [ - "Array object", - "Text object", - "collection", - "collections", - "json", - "list", - "map", - "queue", - "set", - "stack", - "xml" - ], - "support": { - "issues": "https://github.com/phootwork/phootwork/issues", - "source": "https://github.com/phootwork/collection/tree/v3.2.2" - }, - "time": "2022-08-27T12:51:24+00:00" - }, - { - "name": "phootwork/lang", - "version": "v3.2.2", - "source": { - "type": "git", - "url": "https://github.com/phootwork/lang.git", - "reference": "baaf154ae7d521ebeee5e89105f5b12b0f234597" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phootwork/lang/zipball/baaf154ae7d521ebeee5e89105f5b12b0f234597", - "reference": "baaf154ae7d521ebeee5e89105f5b12b0f234597", - "shasum": "" - }, - "require": { - "php": ">=8.0", - "symfony/polyfill-mbstring": "^1.12", - "symfony/polyfill-php81": "^1.22" - }, - "type": "library", - "autoload": { - "psr-4": { - "phootwork\\lang\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Thomas Gossmann", - "homepage": "http://gos.si" - } - ], - "description": "Missing PHP language constructs", - "homepage": "https://phootwork.github.io/lang/", - "keywords": [ - "array", - "comparator", - "comparison", - "string" - ], - "support": { - "issues": "https://github.com/phootwork/phootwork/issues", - "source": "https://github.com/phootwork/lang/tree/v3.2.2" - }, - "time": "2023-05-26T05:37:59+00:00" - }, - { - "name": "php-http/cache-plugin", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-http/cache-plugin.git", - "reference": "539b2d1ea0dc1c2f141c8155f888197d4ac5635b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/cache-plugin/zipball/539b2d1ea0dc1c2f141c8155f888197d4ac5635b", - "reference": "539b2d1ea0dc1c2f141c8155f888197d4ac5635b", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0", - "php-http/client-common": "^1.9 || ^2.0", - "psr/cache": "^1.0 || ^2.0 || ^3.0", - "psr/http-factory-implementation": "^1.0", - "symfony/options-resolver": "^2.6 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0" - }, - "require-dev": { - "nyholm/psr7": "^1.6.1", - "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Http\\Client\\Common\\Plugin\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" - } - ], - "description": "PSR-6 Cache plugin for HTTPlug", - "homepage": "http://httplug.io", - "keywords": [ - "cache", - "http", - "httplug", - "plugin" - ], - "support": { - "issues": "https://github.com/php-http/cache-plugin/issues", - "source": "https://github.com/php-http/cache-plugin/tree/2.0.0" - }, - "time": "2024-02-19T17:02:14+00:00" - }, - { - "name": "php-http/client-common", - "version": "2.7.1", - "source": { - "type": "git", - "url": "https://github.com/php-http/client-common.git", - "reference": "1e19c059b0e4d5f717bf5d524d616165aeab0612" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/client-common/zipball/1e19c059b0e4d5f717bf5d524d616165aeab0612", - "reference": "1e19c059b0e4d5f717bf5d524d616165aeab0612", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0", - "php-http/httplug": "^2.0", - "php-http/message": "^1.6", - "psr/http-client": "^1.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.0 || ^2.0", - "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0 || ^7.0", - "symfony/polyfill-php80": "^1.17" - }, - "require-dev": { - "doctrine/instantiator": "^1.1", - "guzzlehttp/psr7": "^1.4", - "nyholm/psr7": "^1.2", - "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", - "phpspec/prophecy": "^1.10.2", - "phpunit/phpunit": "^7.5.20 || ^8.5.33 || ^9.6.7" - }, - "suggest": { - "ext-json": "To detect JSON responses with the ContentTypePlugin", - "ext-libxml": "To detect XML responses with the ContentTypePlugin", - "php-http/cache-plugin": "PSR-6 Cache plugin", - "php-http/logger-plugin": "PSR-3 Logger plugin", - "php-http/stopwatch-plugin": "Symfony Stopwatch plugin" - }, - "type": "library", - "autoload": { - "psr-4": { - "Http\\Client\\Common\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" - } - ], - "description": "Common HTTP Client implementations and tools for HTTPlug", - "homepage": "http://httplug.io", - "keywords": [ - "client", - "common", - "http", - "httplug" - ], - "support": { - "issues": "https://github.com/php-http/client-common/issues", - "source": "https://github.com/php-http/client-common/tree/2.7.1" - }, - "time": "2023-11-30T10:31:25+00:00" - }, - { - "name": "php-http/discovery", - "version": "1.19.2", - "source": { - "type": "git", - "url": "https://github.com/php-http/discovery.git", - "reference": "61e1a1eb69c92741f5896d9e05fb8e9d7e8bb0cb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/discovery/zipball/61e1a1eb69c92741f5896d9e05fb8e9d7e8bb0cb", - "reference": "61e1a1eb69c92741f5896d9e05fb8e9d7e8bb0cb", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0|^2.0", - "php": "^7.1 || ^8.0" - }, - "conflict": { - "nyholm/psr7": "<1.0", - "zendframework/zend-diactoros": "*" - }, - "provide": { - "php-http/async-client-implementation": "*", - "php-http/client-implementation": "*", - "psr/http-client-implementation": "*", - "psr/http-factory-implementation": "*", - "psr/http-message-implementation": "*" - }, - "require-dev": { - "composer/composer": "^1.0.2|^2.0", - "graham-campbell/phpspec-skip-example-extension": "^5.0", - "php-http/httplug": "^1.0 || ^2.0", - "php-http/message-factory": "^1.0", - "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", - "symfony/phpunit-bridge": "^6.2" - }, - "type": "composer-plugin", - "extra": { - "class": "Http\\Discovery\\Composer\\Plugin", - "plugin-optional": true - }, - "autoload": { - "psr-4": { - "Http\\Discovery\\": "src/" - }, - "exclude-from-classmap": [ - "src/Composer/Plugin.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" - } - ], - "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", - "homepage": "http://php-http.org", - "keywords": [ - "adapter", - "client", - "discovery", - "factory", - "http", - "message", - "psr17", - "psr7" - ], - "support": { - "issues": "https://github.com/php-http/discovery/issues", - "source": "https://github.com/php-http/discovery/tree/1.19.2" - }, - "time": "2023-11-30T16:49:05+00:00" - }, - { - "name": "php-http/httplug", - "version": "2.4.0", - "source": { - "type": "git", - "url": "https://github.com/php-http/httplug.git", - "reference": "625ad742c360c8ac580fcc647a1541d29e257f67" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/httplug/zipball/625ad742c360c8ac580fcc647a1541d29e257f67", - "reference": "625ad742c360c8ac580fcc647a1541d29e257f67", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0", - "php-http/promise": "^1.1", - "psr/http-client": "^1.0", - "psr/http-message": "^1.0 || ^2.0" - }, - "require-dev": { - "friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0", - "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Http\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eric GELOEN", - "email": "geloen.eric@gmail.com" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://sagikazarmark.hu" - } - ], - "description": "HTTPlug, the HTTP client abstraction for PHP", - "homepage": "http://httplug.io", - "keywords": [ - "client", - "http" - ], - "support": { - "issues": "https://github.com/php-http/httplug/issues", - "source": "https://github.com/php-http/httplug/tree/2.4.0" - }, - "time": "2023-04-14T15:10:03+00:00" - }, - { - "name": "php-http/message", - "version": "1.16.1", - "source": { - "type": "git", - "url": "https://github.com/php-http/message.git", - "reference": "5997f3289332c699fa2545c427826272498a2088" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/message/zipball/5997f3289332c699fa2545c427826272498a2088", - "reference": "5997f3289332c699fa2545c427826272498a2088", - "shasum": "" - }, - "require": { - "clue/stream-filter": "^1.5", - "php": "^7.2 || ^8.0", - "psr/http-message": "^1.1 || ^2.0" - }, - "provide": { - "php-http/message-factory-implementation": "1.0" - }, - "require-dev": { - "ergebnis/composer-normalize": "^2.6", - "ext-zlib": "*", - "guzzlehttp/psr7": "^1.0 || ^2.0", - "laminas/laminas-diactoros": "^2.0 || ^3.0", - "php-http/message-factory": "^1.0.2", - "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", - "slim/slim": "^3.0" - }, - "suggest": { - "ext-zlib": "Used with compressor/decompressor streams", - "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", - "laminas/laminas-diactoros": "Used with Diactoros Factories", - "slim/slim": "Used with Slim Framework PSR-7 implementation" - }, - "type": "library", - "autoload": { - "files": [ - "src/filters.php" - ], - "psr-4": { - "Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" - } - ], - "description": "HTTP Message related tools", - "homepage": "http://php-http.org", - "keywords": [ - "http", - "message", - "psr-7" - ], - "support": { - "issues": "https://github.com/php-http/message/issues", - "source": "https://github.com/php-http/message/tree/1.16.1" - }, - "time": "2024-03-07T13:22:09+00:00" - }, - { - "name": "php-http/multipart-stream-builder", - "version": "1.3.0", - "source": { - "type": "git", - "url": "https://github.com/php-http/multipart-stream-builder.git", - "reference": "f5938fd135d9fa442cc297dc98481805acfe2b6a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/multipart-stream-builder/zipball/f5938fd135d9fa442cc297dc98481805acfe2b6a", - "reference": "f5938fd135d9fa442cc297dc98481805acfe2b6a", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0", - "php-http/discovery": "^1.15", - "psr/http-factory-implementation": "^1.0" - }, - "require-dev": { - "nyholm/psr7": "^1.0", - "php-http/message": "^1.5", - "php-http/message-factory": "^1.0.2", - "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Http\\Message\\MultipartStream\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com" - } - ], - "description": "A builder class that help you create a multipart stream", - "homepage": "http://php-http.org", - "keywords": [ - "factory", - "http", - "message", - "multipart stream", - "stream" - ], - "support": { - "issues": "https://github.com/php-http/multipart-stream-builder/issues", - "source": "https://github.com/php-http/multipart-stream-builder/tree/1.3.0" - }, - "time": "2023-04-28T14:10:22+00:00" - }, - { - "name": "php-http/promise", - "version": "1.3.1", - "source": { - "type": "git", - "url": "https://github.com/php-http/promise.git", - "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/promise/zipball/fc85b1fba37c169a69a07ef0d5a8075770cc1f83", - "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "friends-of-phpspec/phpspec-code-coverage": "^4.3.2 || ^6.3", - "phpspec/phpspec": "^5.1.2 || ^6.2 || ^7.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Http\\Promise\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Joel Wurtz", - "email": "joel.wurtz@gmail.com" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" - } - ], - "description": "Promise used for asynchronous HTTP requests", - "homepage": "http://httplug.io", - "keywords": [ - "promise" - ], - "support": { - "issues": "https://github.com/php-http/promise/issues", - "source": "https://github.com/php-http/promise/tree/1.3.1" - }, - "time": "2024-03-15T13:55:21+00:00" - }, - { - "name": "phpowermove/docblock", - "version": "v4.0", - "source": { - "type": "git", - "url": "https://github.com/phpowermove/docblock.git", - "reference": "a73f6e17b7d4e1b92ca5378c248c952c9fae7826" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpowermove/docblock/zipball/a73f6e17b7d4e1b92ca5378c248c952c9fae7826", - "reference": "a73f6e17b7d4e1b92ca5378c248c952c9fae7826", - "shasum": "" - }, - "require": { - "phootwork/collection": "^3.0", - "phootwork/lang": "^3.0", - "php": ">=8.0" - }, - "require-dev": { - "phootwork/php-cs-fixer-config": "^0.4", - "phpunit/phpunit": "^9.0", - "psalm/phar": "^4.3" - }, - "type": "library", - "autoload": { - "psr-4": { - "phpowermove\\docblock\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Thomas Gossmann", - "homepage": "http://gos.si" - } - ], - "description": "PHP Docblock parser and generator. An API to read and write Docblocks.", - "keywords": [ - "docblock", - "generator", - "parser" - ], - "support": { - "issues": "https://github.com/phpowermove/docblock/issues", - "source": "https://github.com/phpowermove/docblock/tree/v4.0" - }, - "time": "2021-09-22T16:57:06+00:00" - }, - { - "name": "psr/cache", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" - ], - "support": { - "source": "https://github.com/php-fig/cache/tree/3.0.0" - }, - "time": "2021-02-03T23:26:27+00:00" - }, - { - "name": "psr/container", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", - "shasum": "" - }, - "require": { - "php": ">=7.4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/2.0.2" - }, - "time": "2021-11-05T16:47:00+00:00" - }, - { - "name": "psr/event-dispatcher", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\EventDispatcher\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Standard interfaces for event handling.", - "keywords": [ - "events", - "psr", - "psr-14" - ], - "support": { - "issues": "https://github.com/php-fig/event-dispatcher/issues", - "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" - }, - "time": "2019-01-08T18:20:26+00:00" - }, - { - "name": "psr/http-client", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-client.git", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP clients", - "homepage": "https://github.com/php-fig/http-client", - "keywords": [ - "http", - "http-client", - "psr", - "psr-18" - ], - "support": { - "source": "https://github.com/php-fig/http-client" - }, - "time": "2023-09-23T14:17:50+00:00" - }, - { - "name": "psr/http-factory", - "version": "1.0.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-factory.git", - "reference": "e616d01114759c4c489f93b099585439f795fe35" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", - "reference": "e616d01114759c4c489f93b099585439f795fe35", - "shasum": "" - }, - "require": { - "php": ">=7.0.0", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interfaces for PSR-7 HTTP message factories", - "keywords": [ - "factory", - "http", - "message", - "psr", - "psr-17", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-factory/tree/1.0.2" - }, - "time": "2023-04-10T20:10:41+00:00" - }, - { - "name": "psr/http-message", - "version": "2.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-message/tree/2.0" - }, - "time": "2023-04-04T09:54:51+00:00" - }, - { - "name": "psr/log", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/3.0.0" - }, - "time": "2021-07-14T16:46:02+00:00" - }, - { - "name": "ralouphie/getallheaders", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "120b605dfeb996808c31b6477290a714d356e822" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", - "reference": "120b605dfeb996808c31b6477290a714d356e822", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^5 || ^6.5" - }, - "type": "library", - "autoload": { - "files": [ - "src/getallheaders.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ralph Khattar", - "email": "ralph.khattar@gmail.com" - } - ], - "description": "A polyfill for getallheaders.", - "support": { - "issues": "https://github.com/ralouphie/getallheaders/issues", - "source": "https://github.com/ralouphie/getallheaders/tree/develop" - }, - "time": "2019-03-08T08:55:37+00:00" - }, - { - "name": "symfony/console", - "version": "v6.0.19", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "c3ebc83d031b71c39da318ca8b7a07ecc67507ed" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/c3ebc83d031b71c39da318ca8b7a07ecc67507ed", - "reference": "c3ebc83d031b71c39da318ca8b7a07ecc67507ed", - "shasum": "" - }, - "require": { - "php": ">=8.0.2", - "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/string": "^5.4|^6.0" - }, - "conflict": { - "symfony/dependency-injection": "<5.4", - "symfony/dotenv": "<5.4", - "symfony/event-dispatcher": "<5.4", - "symfony/lock": "<5.4", - "symfony/process": "<5.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0|3.0" - }, - "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/lock": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0", - "symfony/var-dumper": "^5.4|^6.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", - "keywords": [ - "cli", - "command line", - "console", - "terminal" - ], - "support": { - "source": "https://github.com/symfony/console/tree/v6.0.19" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-01-01T08:36:10+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v3.0.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/26954b3d62a6c5fd0ea8a2a00c0353a14978d05c", - "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c", - "shasum": "" - }, - "require": { - "php": ">=8.0.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.0.2" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-01-02T09:55:41+00:00" - }, - { - "name": "symfony/event-dispatcher", - "version": "v6.0.19", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "2eaf8e63bc5b8cefabd4a800157f0d0c094f677a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/2eaf8e63bc5b8cefabd4a800157f0d0c094f677a", - "reference": "2eaf8e63bc5b8cefabd4a800157f0d0c094f677a", - "shasum": "" - }, - "require": { - "php": ">=8.0.2", - "symfony/event-dispatcher-contracts": "^2|^3" - }, - "conflict": { - "symfony/dependency-injection": "<5.4" - }, - "provide": { - "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0|3.0" - }, - "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/error-handler": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/stopwatch": "^5.4|^6.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.0.19" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-01-01T08:36:10+00:00" - }, - { - "name": "symfony/event-dispatcher-contracts", - "version": "v3.0.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "7bc61cc2db649b4637d331240c5346dcc7708051" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7bc61cc2db649b4637d331240c5346dcc7708051", - "reference": "7bc61cc2db649b4637d331240c5346dcc7708051", - "shasum": "" - }, - "require": { - "php": ">=8.0.2", - "psr/event-dispatcher": "^1" - }, - "suggest": { - "symfony/event-dispatcher-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\EventDispatcher\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to dispatching event", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.0.2" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-01-02T09:55:41+00:00" - }, - { - "name": "symfony/filesystem", - "version": "v6.0.19", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "3d49eec03fda1f0fc19b7349fbbe55ebc1004214" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/3d49eec03fda1f0fc19b7349fbbe55ebc1004214", - "reference": "3d49eec03fda1f0fc19b7349fbbe55ebc1004214", - "shasum": "" - }, - "require": { - "php": ">=8.0.2", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides basic utilities for the filesystem", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.0.19" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-01-20T17:44:14+00:00" - }, - { - "name": "symfony/finder", - "version": "v6.0.19", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "5cc9cac6586fc0c28cd173780ca696e419fefa11" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/5cc9cac6586fc0c28cd173780ca696e419fefa11", - "reference": "5cc9cac6586fc0c28cd173780ca696e419fefa11", - "shasum": "" - }, - "require": { - "php": ">=8.0.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Finds files and directories via an intuitive fluent interface", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/finder/tree/v6.0.19" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-01-20T17:44:14+00:00" - }, - { - "name": "symfony/options-resolver", - "version": "v6.0.19", - "source": { - "type": "git", - "url": "https://github.com/symfony/options-resolver.git", - "reference": "6a180d1c45e0d9797470ca9eb46215692de00fa3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/6a180d1c45e0d9797470ca9eb46215692de00fa3", - "reference": "6a180d1c45e0d9797470ca9eb46215692de00fa3", - "shasum": "" - }, - "require": { - "php": ">=8.0.2", - "symfony/deprecation-contracts": "^2.1|^3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\OptionsResolver\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an improved replacement for the array_replace PHP function", - "homepage": "https://symfony.com", - "keywords": [ - "config", - "configuration", - "options" - ], - "support": { - "source": "https://github.com/symfony/options-resolver/tree/v6.0.19" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-01-01T08:36:10+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.29.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", - "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "provide": { - "ext-ctype": "*" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-29T20:11:03+00:00" - }, - { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.29.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's grapheme_* functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-29T20:11:03+00:00" - }, - { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.29.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-29T20:11:03+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.29.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "provide": { - "ext-mbstring": "*" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-29T20:11:03+00:00" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.29.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", - "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-29T20:11:03+00:00" - }, - { - "name": "symfony/polyfill-php81", - "version": "v1.29.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/c565ad1e63f30e7477fc40738343c62b40bc672d", - "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.29.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-29T20:11:03+00:00" - }, - { - "name": "symfony/process", - "version": "v6.0.19", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "2114fd60f26a296cc403a7939ab91478475a33d4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/2114fd60f26a296cc403a7939ab91478475a33d4", - "reference": "2114fd60f26a296cc403a7939ab91478475a33d4", - "shasum": "" - }, - "require": { - "php": ">=8.0.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Executes commands in sub-processes", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/process/tree/v6.0.19" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-01-01T08:36:10+00:00" - }, - { - "name": "symfony/service-contracts", - "version": "v3.0.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d78d39c1599bd1188b8e26bb341da52c3c6d8a66", - "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66", - "shasum": "" - }, - "require": { - "php": ">=8.0.2", - "psr/container": "^2.0" - }, - "conflict": { - "ext-psr": "<1.1|>=2" - }, - "suggest": { - "symfony/service-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.0.2" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-05-30T19:17:58+00:00" - }, - { - "name": "symfony/string", - "version": "v6.0.19", - "source": { - "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "d9e72497367c23e08bf94176d2be45b00a9d232a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/d9e72497367c23e08bf94176d2be45b00a9d232a", - "reference": "d9e72497367c23e08bf94176d2be45b00a9d232a", - "shasum": "" - }, - "require": { - "php": ">=8.0.2", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/translation-contracts": "<2.0" - }, - "require-dev": { - "symfony/error-handler": "^5.4|^6.0", - "symfony/http-client": "^5.4|^6.0", - "symfony/translation-contracts": "^2.0|^3.0", - "symfony/var-exporter": "^5.4|^6.0" - }, - "type": "library", - "autoload": { - "files": [ - "Resources/functions.php" - ], - "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", - "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], - "support": { - "source": "https://github.com/symfony/string/tree/v6.0.19" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-01-01T08:36:10+00:00" - }, - { - "name": "symfony/yaml", - "version": "v6.0.19", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "deec3a812a0305a50db8ae689b183f43d915c884" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/deec3a812a0305a50db8ae689b183f43d915c884", - "reference": "deec3a812a0305a50db8ae689b183f43d915c884", - "shasum": "" - }, - "require": { - "php": ">=8.0.2", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "symfony/console": "<5.4" - }, - "require-dev": { - "symfony/console": "^5.4|^6.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" - }, - "bin": [ - "Resources/bin/yaml-lint" - ], - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Loads and dumps YAML files", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/yaml/tree/v6.0.19" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-01-11T11:50:03+00:00" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": ">=8" - }, - "platform-dev": [], - "platform-overrides": { - "php": "8.0.24" - }, - "plugin-api-version": "2.3.0" -} From d22d40111348a5fd7d42177b58900e0c44d8f68a Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Wed, 24 Apr 2024 12:29:12 -0400 Subject: [PATCH 29/32] Add to CHANGELOG.md. --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb357af..2639a12 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,8 +3,11 @@ ### Unreleased * Renamed to `operations-platform/site-server`. +* Improved ansible inventory setup. * Added server roles for security, users, docker, ddev. * Added role to install GitHub Actions Runner. +* Much improved README.md. +* Finalized passing tests. @TODO: From c8ea4bb3dfe98c637a50189e77a2d275a8fe09b8 Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Wed, 24 Apr 2024 12:42:30 -0400 Subject: [PATCH 30/32] Add Taskfile.yml for tooling instead of composer. --- .github/workflows/ci.yml | 11 ++++------- Taskfile.yml | 25 +++++++++++++++++++++++++ scripts/install-task.sh | 5 +++++ 3 files changed, 34 insertions(+), 7 deletions(-) create mode 100644 Taskfile.yml create mode 100755 scripts/install-task.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cb004f4..deda492 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,17 +14,11 @@ jobs: runs-on: ubuntu-latest - env: - - PHP_EXTENSIONS: dom, json, libxml, mbstring, pdo_sqlite, soap, xml, xmlwriter - steps: - uses: actions/checkout@v3 with: show-progress: false - - uses: php-actions/composer@v6 - - name: Install docker-compose uses: KengoTODA/actions-setup-docker-compose@v1 with: @@ -68,8 +62,11 @@ jobs: " > ./ansible/host_vars/${{ env.OPERATIONS_ENVIRONMENT_NAME }}.yml cat ./ansible/host_vars/${{ env.OPERATIONS_ENVIRONMENT_NAME }}.yml + - name: Install task CLI + run: ./scripts/install-task.sh + - name: Build Platform - run: composer dev:start + run: bin/task start - name: Test Platform run: | diff --git a/Taskfile.yml b/Taskfile.yml new file mode 100644 index 0000000..5aa301f --- /dev/null +++ b/Taskfile.yml @@ -0,0 +1,25 @@ +# +# See https://taskfile.dev/installation/ +# +# To install to ./bin/task: +# sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d +# +version: '3' + +tasks: + start: + cmds: + - docker-compose up -d --build + - task: install + + install: + cmds: + - docker-compose exec operations ansible-playbook /usr/share/operations/playbook.yml + + destroy: + cmds: + - docker-compose kill && docker-compose rm -fv + + shell: + cmds: + - docker-compose exec operations bash diff --git a/scripts/install-task.sh b/scripts/install-task.sh new file mode 100755 index 0000000..3aa34f1 --- /dev/null +++ b/scripts/install-task.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +set -e +echo "Running https://taskfile.dev/install.sh ..." +sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d From 78b50f3fb3aa51d3ce203edb2daaf6d6c4636e5f Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Wed, 24 Apr 2024 12:43:46 -0400 Subject: [PATCH 31/32] fix set instructions. --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 81aa045..2e94b1b 100644 --- a/README.md +++ b/README.md @@ -141,10 +141,10 @@ Once the repo is cloned, ansible will set up the rest. # Copy default ansible files. cp -rf ansible/* /etc/ansible - # Set your hostname in /etc/ansible/hosts and set variables in host_vars. + # Set your hostname to in /etc/ansible/hosts and set variables in host_vars. cd /etc/ansible - sed 's/localhost/{$SERVER_HOSTNAME}/g' hosts.example > hosts - cp host_vars/host.example.yml host_vars/{$SERVER_HOSTNAME}.yml + sed 's/localhost/$SERVER_HOSTNAME/g' hosts.example > hosts + cp host_vars/host.example.yml host_vars/$SERVER_HOSTNAME.yml Edit `host_vars/{$SERVER_HOSTNAME}.yml` to match your github repo's information. Insert the API key there. From 3233af88605db7af94435698f7f5faee72527832 Mon Sep 17 00:00:00 2001 From: Jon Pugh Date: Wed, 24 Apr 2024 15:57:45 -0400 Subject: [PATCH 32/32] Add to changelog. --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2639a12..c9c198a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ * Added role to install GitHub Actions Runner. * Much improved README.md. * Finalized passing tests. +* Added `Taskfile.yml` for developer tooling. @TODO: