> ## Documentation Index
> Fetch the complete documentation index at: https://docs.nrai.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Custom Addons CI/CD

You can use the CLI to sync custom addons. There is no need to rebuild the Docker image as they are loaded directly from npm.

### How It Works

Use the CLI to sync items from `packages/addons/custom/` to instances. In production, NRAI acts as an npm registry, storing all addon versions.

The CLI scans the directory for `package.json` files, checking the **name** and **version** of each addon. If a addon isn't uploaded, it packages and uploads it via the API.

### Usage

To use the CLI, follow these steps:

1. Generate an API Key from the Admin Interface. Go to Settings and generate the API Key.
2. Install the CLI by cloning the repository.
3. Run the following command, replacing `API_KEY` with your generated API Key and `INSTANCE_URL` with your instance URL:

```bash theme={null}
AP_API_KEY=your_api_key_here npm run sync-addons -- --apiUrl https://INSTANCE_URL/api
```

### Developer Workflow

1. Developers create and modify the addons offline.
2. Increment the addon version in their corresponding `package.json`. For more information, refer to the [addon versioning](../../developers/addon-reference/addon-versioning) documentation.
3. Open a pull request towards the main branch.
4. Once the pull request is merged to the main branch, manually run the CLI or use a GitHub/GitLab Action to trigger the synchronization process.

### GitHub Action

```yaml theme={null}
name: Sync Custom Addons

on:
  push:
    branches:
      - main
  workflow_dispatch:

jobs:
  sync-addons:
    runs-on: ubuntu-latest

    steps:
      # Step 1: Check out the repository code with full history
      - name: Check out repository code
        uses: actions/checkout@v3
        with:
          fetch-depth: 0

      # Step 2: Cache Node.js dependencies
      - name: Cache Node.js dependencies
        uses: actions/cache@v3
        with:
          path: ~/.npm
          key: npm-${{ hashFiles('package-lock.json') }}
          restore-keys: |
            npm-

      # Step 3: Set up Node.js
      - name: Set up Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '20' # Use Node.js version 20
          cache: 'npm'

      # Step 4: Install dependencies using npm ci
      - name: Install dependencies
        run: npm ci --ignore-scripts

      # Step 6: Sync Custom Addons
      - name: Sync Custom Addons
        env:
          AP_API_KEY: ${{ secrets.AP_API_KEY }}
        run: npm run sync-addons -- --apiUrl ${{ secrets.INSTANCE_URL }}/api

```
