From 423a000d03b953cd55bc261406853a2b1c7945bf Mon Sep 17 00:00:00 2001 From: marito Date: Sun, 15 Jun 2025 08:36:54 +0800 Subject: [PATCH] composer added --- playbook.yml | 1 + roles/composer/tasks/main.yml | 25 ++++++++++++ .../composer/templates/composer-wrapper.sh.j2 | 38 +++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 roles/composer/tasks/main.yml create mode 100644 roles/composer/templates/composer-wrapper.sh.j2 diff --git a/playbook.yml b/playbook.yml index 9825647..bf33c9e 100644 --- a/playbook.yml +++ b/playbook.yml @@ -15,5 +15,6 @@ - role: common - role: database - role: php + - role: composer - role: nginx - role: projects \ No newline at end of file diff --git a/roles/composer/tasks/main.yml b/roles/composer/tasks/main.yml new file mode 100644 index 0000000..df223c2 --- /dev/null +++ b/roles/composer/tasks/main.yml @@ -0,0 +1,25 @@ +--- +- name: "Install yq (YAML processor) for the smart composer script" + ansible.builtin.get_url: + url: "https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64" + dest: /usr/local/bin/yq + mode: '0755' + +- name: "Download the Composer installer" + ansible.builtin.get_url: + url: https://getcomposer.org/installer + dest: /tmp/composer-installer.php + mode: '0755' + +- name: "Install Composer globally (as composer.phar)" + ansible.builtin.command: + cmd: php /tmp/composer-installer.php --install-dir=/usr/local/bin --filename=composer.phar + creates: /usr/local/bin/composer.phar + +- name: "Deploy the smart Composer wrapper script" + ansible.builtin.template: + src: composer-wrapper.sh.j2 + dest: /usr/local/bin/composer + owner: root + group: root + mode: '0755' \ No newline at end of file diff --git a/roles/composer/templates/composer-wrapper.sh.j2 b/roles/composer/templates/composer-wrapper.sh.j2 new file mode 100644 index 0000000..814e4bc --- /dev/null +++ b/roles/composer/templates/composer-wrapper.sh.j2 @@ -0,0 +1,38 @@ +#!/bin/bash +# +# Lenvi Smart Composer Wrapper +# +# This script automatically detects the required PHP version for a project +# by looking for a `Lenvi.yaml` file and uses the correct PHP binary. + +# The real composer binary +COMPOSER_PHAR="/usr/local/bin/composer.phar" +DEFAULT_PHP_BINARY="/usr/bin/php" +PHP_BINARY="" + +# Find the project root by looking for a Lenvi.yaml file in parent directories +SEARCH_DIR=$(pwd) +while [[ "$SEARCH_DIR" != "" && ! -f "$SEARCH_DIR/Lenvi.yaml" ]]; do + SEARCH_DIR=${SEARCH_DIR%/*} +done + +if [[ -f "$SEARCH_DIR/Lenvi.yaml" ]]; then + # We found a config file, let's find the PHP version for the current directory + CURRENT_PROJECT_ROOT=$(pwd) + PHP_VERSION=$(yq eval '.sites[] | select(.project_root == "'"$CURRENT_PROJECT_ROOT"'") | .php_version' "$SEARCH_DIR/Lenvi.yaml") + + if [[ -n "$PHP_VERSION" && -x "/usr/bin/php$PHP_VERSION" ]]; then + # Version found and the corresponding PHP binary exists + PHP_BINARY="/usr/bin/php$PHP_VERSION" + echo "Lenvi: Found project configuration. Using PHP $PHP_VERSION..." >&2 + fi +fi + +# If no specific PHP binary was found, use the system default +if [[ -z "$PHP_BINARY" ]]; then + echo "Lenvi: No project configuration found. Using default system PHP." >&2 + PHP_BINARY="$DEFAULT_PHP_BINARY" +fi + +# Execute the real Composer with the determined PHP version and pass all arguments +exec "$PHP_BINARY" "$COMPOSER_PHAR" "$@" \ No newline at end of file