# Travis CI

Load KeyEnv secrets in Travis CI builds.

Source: https://keyenv.dev/docs/guides/travis-ci/

Load KeyEnv secrets in your Travis CI builds.

## Prerequisites

- Travis CI account connected to your repository
- KeyEnv service token with read access

## Setup

### 1. Add Your Token

1. Go to your repository settings in Travis CI
2. Navigate to **Environment Variables**
3. Add `KEYENV_TOKEN` with your service token
4. Ensure **Display value in build log** is OFF

### 2. Configure .travis.yml

```yaml
language: node_js
node_js:
  - "20"

before_install:
  - curl -fsSL https://keyenv.dev/install.sh | bash
  - export PATH="$HOME/.keyenv/bin:$PATH"

script:
  - keyenv run -p YOUR_PROJECT_ID -e $TRAVIS_BRANCH -- npm ci
  - keyenv run -p YOUR_PROJECT_ID -e $TRAVIS_BRANCH -- npm test

deploy:
  provider: script
  script: keyenv run -p YOUR_PROJECT_ID -e production -- npm run deploy
  on:
    branch: main
```

## Environment Mapping

Map Travis CI branches to KeyEnv environments:

```yaml
env:
  global:
    - KEYENV_PROJECT=your-project-id

before_script:
  - |
    case "$TRAVIS_BRANCH" in
      main)
        export KEYENV_ENV=production
        ;;
      staging)
        export KEYENV_ENV=staging
        ;;
      *)
        export KEYENV_ENV=development
        ;;
    esac

script:
  - keyenv run -p $KEYENV_PROJECT -e $KEYENV_ENV -- npm test
```

## Build Stages

```yaml
stages:
  - test
  - name: deploy
    if: branch = main

jobs:
  include:
    - stage: test
      script:
        - keyenv run -p YOUR_PROJECT_ID -e development -- npm test

    - stage: deploy
      script:
        - keyenv run -p YOUR_PROJECT_ID -e production -- npm run deploy
```

## Pull Secrets to .env File

```yaml
before_script:
  - keyenv pull -p YOUR_PROJECT_ID -e $KEYENV_ENV -o .env

script:
  - source .env
  - npm test
```

## Matrix Builds

Test across multiple environments:

```yaml
jobs:
  include:
    - name: "Test Development"
      env: KEYENV_ENV=development
    - name: "Test Staging"
      env: KEYENV_ENV=staging

script:
  - keyenv run -p YOUR_PROJECT_ID -e $KEYENV_ENV -- npm test
```

## Docker Builds

```yaml
services:
  - docker

script:
  - |
    eval $(keyenv export -p YOUR_PROJECT_ID -e production --format shell)
    docker build \
      --build-arg DATABASE_URL=$DATABASE_URL \
      --build-arg API_KEY=$API_KEY \
      -t myapp:$TRAVIS_COMMIT .
```

## Caching CLI Installation

Speed up builds by caching the CLI:

```yaml
cache:
  directories:
    - $HOME/.keyenv

before_install:
  - |
    if [ ! -f "$HOME/.keyenv/bin/keyenv" ]; then
      curl -fsSL https://keyenv.dev/install.sh | bash
    fi
  - export PATH="$HOME/.keyenv/bin:$PATH"
```

## Pull Requests

For PR builds, use a development environment:

```yaml
script:
  - |
    if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
      KEYENV_ENV=development
    else
      KEYENV_ENV=$TRAVIS_BRANCH
    fi
    keyenv run -p YOUR_PROJECT_ID -e $KEYENV_ENV -- npm test
```

## Encrypted Environment Variables

If you prefer to encrypt your token in `.travis.yml`:

```bash
# Install Travis CLI
gem install travis

# Encrypt your token
travis encrypt KEYENV_TOKEN=your-token --add
```

This adds to your `.travis.yml`:

```yaml
env:
  global:
    secure: "encrypted-string..."
```

## Full Example

```yaml
language: node_js
node_js:
  - "20"

cache:
  directories:
    - node_modules
    - $HOME/.keyenv

env:
  global:
    - KEYENV_PROJECT=your-project-id

before_install:
  - |
    if [ ! -f "$HOME/.keyenv/bin/keyenv" ]; then
      curl -fsSL https://keyenv.dev/install.sh | bash
    fi
  - export PATH="$HOME/.keyenv/bin:$PATH"

before_script:
  - |
    case "$TRAVIS_BRANCH" in
      main) KEYENV_ENV=production ;;
      staging) KEYENV_ENV=staging ;;
      *) KEYENV_ENV=development ;;
    esac
    echo "Using KeyEnv environment: $KEYENV_ENV"

script:
  - keyenv run -p $KEYENV_PROJECT -e $KEYENV_ENV -- npm ci
  - keyenv run -p $KEYENV_PROJECT -e $KEYENV_ENV -- npm test
  - keyenv run -p $KEYENV_PROJECT -e $KEYENV_ENV -- npm run build

deploy:
  provider: script
  script: keyenv run -p $KEYENV_PROJECT -e production -- npm run deploy
  on:
    branch: main
  skip_cleanup: true
```

## Troubleshooting

### Token Not Found

Ensure the variable is set in Travis CI settings and is accessible:

```yaml
script:
  - echo "Token set: $([ -n "$KEYENV_TOKEN" ] && echo 'yes' || echo 'no')"
```

### CLI Installation Fails

Try an alternative installation method:

```yaml
before_install:
  - npm install -g @keyenv/cli
```

### Secrets Not Loading

Verify the project and environment exist:

```yaml
script:
  - keyenv whoami
  - keyenv projects list
```
