# Pack Installation from Git Repositories **Last Updated**: 2025-01-27 **Status**: Production Ready --- ## Overview Attune supports installing packs directly from git repositories, enabling teams to: - **Version Control**: Track pack versions using git tags, branches, and commits - **Collaboration**: Share packs across teams via git hosting services - **Automation**: Integrate pack deployment into CI/CD pipelines - **Development**: Test packs from feature branches before release --- ## Quick Start ### Web UI Installation 1. Navigate to **Packs** page 2. Click **Add Pack** dropdown → **Install from Remote** 3. Select **Git Repository** as source type 4. Enter repository URL (HTTPS or SSH) 5. Optionally specify a git reference (branch, tag, or commit) 6. Configure installation options 7. Click **Install Pack** ### CLI Installation ```bash # Install from default branch attune pack install https://github.com/example/pack-slack.git # Install from specific tag attune pack install https://github.com/example/pack-slack.git --ref v2.1.0 # Install from branch attune pack install https://github.com/example/pack-slack.git --ref main # Install from commit hash attune pack install https://github.com/example/pack-slack.git --ref a1b2c3d # SSH URL attune pack install git@github.com:example/pack-slack.git --ref v2.1.0 # Skip tests and dependency validation (use with caution) attune pack install https://github.com/example/pack-slack.git --skip-tests --skip-deps ``` ### API Installation ```bash curl -X POST http://localhost:8080/api/v1/packs/install \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{ "source": "https://github.com/example/pack-slack.git", "ref_spec": "v2.1.0", "force": false, "skip_tests": false, "skip_deps": false }' ``` --- ## Supported Git Sources ### HTTPS URLs **Public repositories:** ``` https://github.com/username/pack-name.git https://gitlab.com/username/pack-name.git https://bitbucket.org/username/pack-name.git ``` **Private repositories with credentials:** ``` https://username:token@github.com/username/pack-name.git ``` > **Security Note**: For private repositories, use SSH keys or configure git credential helpers instead of embedding credentials in URLs. ### SSH URLs **Standard format:** ``` git@github.com:username/pack-name.git git@gitlab.com:username/pack-name.git ``` **SCP-style:** ``` user@server:path/to/pack.git ``` **Requirements:** - SSH keys must be configured on the Attune server - User running Attune service must have access to private key - Host must be in `~/.ssh/known_hosts` --- ## Git References The `ref_spec` parameter accepts any valid git reference: ### Branches ```bash # Default branch (usually main or master) --ref main # Development branch --ref develop # Feature branch --ref feature/new-action ``` ### Tags ```bash # Semantic version tag --ref v1.2.3 # Release tag --ref release-2024-01-27 ``` ### Commit Hashes ```bash # Full commit hash --ref a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0 # Short commit hash (7+ characters) --ref a1b2c3d ``` ### Special References ```bash # HEAD of default branch --ref HEAD # No ref specified = default branch # (equivalent to --depth 1 clone) ``` --- ## Pack Structure Requirements The git repository must contain a valid pack structure: ### Option 1: Root-Level Pack ``` repository-root/ ├── pack.yaml # Required ├── actions/ # Optional ├── sensors/ # Optional ├── triggers/ # Optional ├── rules/ # Optional ├── workflows/ # Optional └── README.md # Recommended ``` ### Option 2: Pack Subdirectory ``` repository-root/ ├── pack/ │ ├── pack.yaml # Required │ ├── actions/ │ └── ... ├── docs/ └── README.md ``` > The installer will automatically detect and use the pack directory. --- ## Installation Process When you install a pack from git, Attune performs these steps: ### 1. Clone Repository ``` git clone [--depth 1] ``` If a `ref_spec` is provided: ``` git checkout ``` ### 2. Locate Pack Directory - Search for `pack.yaml` at repository root - If not found, search in `pack/` subdirectory - Fail if `pack.yaml` not found in either location ### 3. Validate Dependencies (unless skipped) - Extract runtime dependencies from `pack.yaml` - Extract pack dependencies - Verify all dependencies are satisfied - Fail if dependencies are missing (unless `force` enabled) ### 4. Register Pack - Parse `pack.yaml` metadata - Create database entry - Auto-sync workflows if present ### 5. Execute Tests (unless skipped) - Run pack test suite if configured - Fail if tests don't pass (unless `force` enabled) ### 6. Copy to Permanent Storage - Move pack files to `{packs_base_dir}/{pack_ref}/` - Calculate directory checksum - Store installation metadata ### 7. Record Installation - Store installation record in `pack_installation` table - Record source URL, git ref, timestamp, checksum - Link to installing user --- ## Installation Options ### Force Installation **Flag**: `--force` (CLI) or `force: true` (API) Enables: - Reinstall pack even if it already exists (replaces existing) - Proceed even if dependencies are missing - Proceed even if tests fail **Use Cases**: - Upgrading pack to new version - Recovering from failed installation - Development/testing workflows **Warning**: Force mode bypasses safety checks. Use cautiously in production. ### Skip Tests **Flag**: `--skip-tests` (CLI) or `skip_tests: true` (API) - Skip executing pack test suite - Faster installation - Useful when tests are slow or not available **Use Cases**: - Installing trusted packs - Tests not yet implemented - Development environments ### Skip Dependencies **Flag**: `--skip-deps` (CLI) or `skip_deps: true` (API) - Skip validation of runtime dependencies - Skip validation of pack dependencies - May result in runtime failures if dependencies truly missing **Use Cases**: - Dependencies will be installed separately - Custom runtime environment - Development/testing --- ## Example Workflows ### Development Workflow ```bash # 1. Install pack from feature branch for testing attune pack install https://github.com/myorg/pack-custom.git \ --ref feature/new-sensor \ --skip-tests \ --force # 2. Test the pack attune pack test custom # 3. When satisfied, install from main/release tag attune pack install https://github.com/myorg/pack-custom.git \ --ref v1.0.0 \ --force ``` ### Production Deployment ```bash # Install specific version with full validation attune pack install https://github.com/myorg/pack-slack.git \ --ref v2.1.0 # Verify installation attune pack list | grep slack attune pack test slack ``` ### CI/CD Pipeline ```yaml # GitHub Actions example - name: Install pack on staging run: | attune pack install https://github.com/${{ github.repository }}.git \ --ref ${{ github.sha }} \ --force env: ATTUNE_API_TOKEN: ${{ secrets.ATTUNE_TOKEN }} - name: Run tests run: attune pack test $(basename ${{ github.repository }}) ``` ### Private Repository with SSH ```bash # 1. Set up SSH key on Attune server ssh-keygen -t ed25519 -C "attune@example.com" cat ~/.ssh/id_ed25519.pub # Add to GitHub/GitLab # 2. Add host to known_hosts ssh-keyscan github.com >> ~/.ssh/known_hosts # 3. Install pack attune pack install git@github.com:myorg/private-pack.git --ref main ``` --- ## Troubleshooting ### Git Clone Fails **Error**: `Git clone failed: Permission denied` **Solutions**: - Verify SSH keys are configured correctly - Check repository access permissions - For HTTPS, verify credentials or token - Add host to `~/.ssh/known_hosts` ### Ref Not Found **Error**: `Git checkout failed: pathspec 'v1.0.0' did not match any file(s) known to git` **Solutions**: - Verify tag/branch exists in repository - Check spelling and case sensitivity - Ensure ref is pushed to remote - Try with full commit hash ### Pack.yaml Not Found **Error**: `pack.yaml not found in directory` **Solutions**: - Ensure `pack.yaml` exists at repository root or in `pack/` subdirectory - Check file name spelling (case-sensitive on Linux) - Verify correct branch/tag is checked out ### Dependency Validation Failed **Error**: `Pack dependency validation failed: pack 'core' version '^1.0.0' not found` **Solutions**: - Install missing dependencies first - Use `--skip-deps` to bypass validation (not recommended) - Use `--force` to install anyway ### Test Failures **Error**: `Pack registration failed: tests did not pass` **Solutions**: - Review test output for specific failures - Fix issues in pack code - Use `--skip-tests` to install without testing - Use `--force` to install despite test failures --- ## Security Considerations ### SSH Keys - Use dedicated SSH key for Attune service - Restrict key permissions (read-only access preferred) - Rotate keys periodically - Use SSH agent for key management ### HTTPS Authentication - Never embed credentials directly in URLs - Use git credential helpers - Consider personal access tokens with limited scope - Rotate tokens regularly ### Code Review - Review pack code before installation - Install from tagged releases, not branches - Verify pack author/source - Check for malicious code in actions/sensors ### Git References - **Production**: Use specific tags (e.g., `v1.2.3`) - **Staging**: Use release branches (e.g., `release-*`) - **Development**: Feature branches acceptable - **Avoid**: `main`/`master` in production (may change unexpectedly) --- ## Advanced Topics ### Submodules If pack repository uses git submodules: ```bash # Clone with submodules git clone --recurse-submodules ``` > **Note**: Current implementation does not automatically clone submodules. Manual configuration required. ### Large Repositories For large repositories, use shallow clones: ```bash # Default behavior when no ref_spec git clone --depth 1 ``` When specific ref is needed: ```bash git clone git checkout ``` ### Monorepos For repositories containing multiple packs: ``` monorepo/ ├── pack-a/ │ └── pack.yaml ├── pack-b/ │ └── pack.yaml └── pack-c/ └── pack.yaml ``` **Limitation**: Current implementation expects one pack per repository. For monorepos, use filesystem registration or create separate repositories. --- ## Database Schema Installation metadata is stored in the `pack_installation` table: ```sql CREATE TABLE pack_installation ( id BIGSERIAL PRIMARY KEY, pack_id BIGINT NOT NULL REFERENCES pack(id), source_type VARCHAR(50) NOT NULL, -- 'git' source_url TEXT, -- Git repository URL source_ref TEXT, -- Branch/tag/commit checksum TEXT, -- Directory checksum checksum_verified BOOLEAN DEFAULT FALSE, installed_by BIGINT REFERENCES identity(id), installation_method VARCHAR(50), -- 'api', 'cli', 'web' storage_path TEXT NOT NULL, -- File system path meta JSONB, -- Additional metadata created TIMESTAMP DEFAULT NOW(), updated TIMESTAMP DEFAULT NOW() ); ``` --- ## API Reference ### Install Pack Endpoint **POST** `/api/v1/packs/install` **Request Body**: ```json { "source": "https://github.com/example/pack-slack.git", "ref_spec": "v2.1.0", "force": false, "skip_tests": false, "skip_deps": false } ``` **Response** (201 Created): ```json { "data": { "pack": { "id": 42, "ref": "slack", "label": "Slack Pack", "version": "2.1.0", "description": "Slack integration pack", "is_standard": false, ... }, "test_result": { "status": "passed", "total_tests": 10, "passed": 10, "failed": 0, ... }, "tests_skipped": false } } ``` **Error Responses**: - `400`: Invalid request, dependency validation failed, or tests failed - `409`: Pack already exists (use `force: true` to override) - `500`: Internal error (git clone failed, filesystem error, etc.) --- ## Future Enhancements ### Planned Features - Git submodule support - Monorepo support (install specific subdirectory) - Pack version upgrade workflow - Automatic version detection from tags - Git LFS support - Signature verification for signed commits ### Registry Integration When pack registry system is implemented: - Registry can reference git repositories - Automatic version discovery from git tags - Centralized pack metadata - See `pack-registry-spec.md` for details --- ## Related Documentation - [Pack Structure](pack-structure.md) - Pack directory and file format - [Pack Registry Specification](pack-registry-spec.md) - Registry-based installation - [Pack Testing Framework](pack-testing-framework.md) - Testing packs - [Configuration](../configuration/configuration.md) - Server configuration - [Production Deployment](../deployment/production-deployment.md) - Deployment guide --- ## Examples Repository Example packs demonstrating git-based installation: ```bash # Simple action pack attune pack install https://github.com/attune-examples/pack-hello-world.git # Complex pack with dependencies attune pack install https://github.com/attune-examples/pack-kubernetes.git --ref v1.0.0 # Private repository (SSH) attune pack install git@github.com:mycompany/pack-internal.git --ref main ``` --- ## Support For issues or questions: - GitHub Issues: https://github.com/attune-io/attune/issues - Documentation: https://docs.attune.io/packs/installation - Community: https://community.attune.io