Skip to main content
FOSSA Logo

TravisCI Setup and Usage Guide

Learn how to configure, run, and deploy using TravisCI with support for multiple languages and environments.

Contents

About

Travis CI is a cloud-based continuous integration and deployment (CI/CD) platform that automatically builds and tests code changes after every push to a repository. It supports a wide range of programming languages and project types out-of-the-box via a simple YAML configuration file committed in your repository (named .travis.yml). This config-as-code approach is similar to other CI systems like GitHub Actions, and contrasts with Jenkins which uses a Groovy-based Jenkinsfile for pipeline definitions. In Travis CI, each code push triggers a clean virtual environment, installs dependencies, runs your build/test scripts, and can optionally deploy the application if tests pass. This automated pipeline improves software quality and streamlines deployments in a DevOps workflow.

flowchart TD
    Developer -->|push code| Build_Start[Travis CI Trigger];
    Build_Start --> InstallDeps[Install Dependencies];
    InstallDeps --> RunTests[Run Tests];
    RunTests -->|Tests Passed| Deploy[Deploy to Target];
    RunTests -->|Tests Failed| FailNotify[Report Failure];
    Deploy --> Target[Production or Hosting]

Figure: Typical TravisCI pipeline – code commits trigger automated build/test, followed by deployment on success (or failure notification on test errors).

TravisCI integrates with popular version control platforms (like GitHub, GitLab, Bitbucket) to listen for new commits and pull requests. It provides a web UI to view build logs, job status, and artifacts for each pipeline run. Key features include build matrices (to test multiple versions or environments in parallel), secret environment variables for credentials, and built-in support for deploying to cloud services. The sections below guide you through setting up Travis CI from scratch, using it for continuous integration across different languages, deploying to various targets (AWS, Docker, Heroku, GitHub Pages), and enhancing your pipeline with FOSSA for license compliance.

You can learn more about the different configuration options in the Travis CI Build Config Reference.

Setup Guide

Setting up Travis CI for a new project involves connecting the repository, adding a Travis config file, and running your first build and deployment. Below is the complete flow from initial setup to the first successful deployment:

  1. Sign up and connect your repository: Sign in to Travis CI with your Git hosting account (GitHub, GitLab, etc.) and authorize access to your repositories. In the Travis CI dashboard, enable the repository you want to integrate. (On Travis-ci.com, go to your profile settings and flip the switch for the repo.) This will install a webhook so TravisCI gets notified on each commit.

  2. Add a .travis.yml configuration: In the root of your project, create a file named .travis.yml that specifies how to build and test your application. At minimum, you should declare the programming language and any required build script. For example:

    language: node_js    # or python, java, go, ruby, etc.
    node_js: 16          # specify runtime version (for Node.js)
    script: npm test     # command to run tests (could also be omitted if using defaults)

    This YAML file instructs Travis CI which environment to use and what commands to run. TravisCI provides smart defaults for many languages – if not overridden, it will run standard build and test commands:

    • Node.js: Installs dependencies with npm install (or npm ci if a lockfile is present) and runs tests with npm test by default.
    • Python: Installs with pip install -r requirements.txt (if such file exists) by default. No default test command is provided, so include a script: entry (e.g. pytest or nosetests) to run your test suite.
    • Java: Detects Maven or Gradle builds. For example, if a pom.xml is present, Travis will run mvn install (to install deps) and mvn test automatically. You can specify JDK versions with the jdk: key if needed.
    • Go: Automatically uses the Go toolchain. By default it will fetch dependencies (go get -t -v ./...) and then run your tests (go test -v ./...). You can set the Go version via the go: key (e.g., go: 1.20).
    • Ruby: Installs gems with Bundler (bundle install) and runs rake for tests by default. You can specify Ruby versions or implementations using rvm: (e.g., MRI 3.0, JRuby).

    Include any additional setup steps your project needs (database services, environment vars, etc.).

  3. Push code to trigger a build: Commit and push the .travis.yml to your repository. Travis CI will detect the new config and start a build for the latest commit. (Travis only runs builds on commits pushed after a .travis.yml file is added.) You can follow the progress on the Travis CI dashboard: each job goes through phases (install, script, etc.) according to the Travis build lifecycle. If the build fails (non-zero exit in any step), Travis will mark it as failed and log the error; if it succeeds, you'll see a green "build passed" status.

  4. Configure deployment (optional at first): Once your tests are passing, you can configure Travis to automatically deploy the application. Deployment settings are added to .travis.yml under a deploy section. Travis CI supports many deployment targets (see next section), for example:

    • Heroku: add a deploy provider with your Heroku API key (usually encrypted or stored as a secure env variable). For example, to deploy on every push to the main branch:
      deploy:
        provider: heroku
        api_key: $HEROKU_API_KEY   # API key set in Travis settings or encrypted in yml
        app: your-app-name
        on:
          branch: main
      Travis can then automatically push the built application to Heroku after a successful build. (You can generate a Heroku API key and use the travis CLI to encrypt it into your config, or add it in the Travis UI as an environment variable.)
    • AWS S3: use the S3 deploy provider to upload artifacts (e.g. static site or build outputs) to an S3 bucket. For instance:
      deploy:
        provider: s3
        access_key_id: $AWS_ACCESS_KEY_ID
        secret_access_key: $AWS_SECRET_ACCESS_KEY
        bucket: my-bucket
        region: us-east-1
        on:
          branch: release
      This will upload files to S3 when you push to the release branch. (Ensure your AWS keys are stored securely as env vars in Travis.)
    • Docker: you can deploy Docker images by logging in to a container registry and pushing the image from Travis. For example, use the script provider to call a deploy script that runs docker build and docker push on the master branch. (See Using TravisCI with Docker below for details.)

    You can initially skip deployment until you validate the CI build, but it's often easiest to set it up early. Travis allows conditional deployments (e.g., only on certain branches or tags) using the on: settings.

The Travis CI Onboarding guide provides more details on getting started with Travis CI.

After completing these steps, you should have Travis CI running your tests on each push, and automatically deploying the application when all checks pass. The next sections provide more usage tips and specific scenarios for ongoing CI/CD workflows.

Ongoing Usage

Once Travis CI is set up, it becomes a core part of your development workflow. Here are common patterns and best practices for using Travis CI day-to-day:

  • Build Matrix for Multiple Versions: You can test your project against multiple language versions or environments in parallel. For example, to test a Python library on Python 3.7, 3.8, and 3.9, or a Node app on Node 14 and 18, list multiple versions under the python: or node_js: key in your .travis.yml. Travis will spawn a job for each version. You can also matrix on env variables to test different configurations.

  • Caching Dependencies: Leverage Travis CI caching to speed up build times by reusing downloaded dependencies between runs. For example, cache your node_modules or Python virtualenv by adding:

    cache:
      directories:
        - node_modules

    This significantly cuts down install time on subsequent builds. Travis caches can also store Maven local repos, Go module caches, etc., to avoid re-fetching on every job. Refer to Travis docs on caching for language-specific advice.

  • Environment Variables and Secrets: Define sensitive credentials (API keys, tokens) as encrypted environment variables instead of hard-coding them in the config. You can add these in the repository Settings on Travis CI or encrypt them via the Travis CLI. For example, store a HEROKU_API_KEY or DOCKER_PASSWORD as hidden env vars. Travis makes these available to your build but secures them (they won't be shown in logs by default). Use these variables in your config (e.g., $HEROKU_API_KEY) to authenticate deployment scripts.

  • Notifications: Travis CI can send build notifications to email, Slack, etc. Configure the notifications: section in .travis.yml to integrate with your team's communication channels (for instance, Slack webhooks). This helps the team stay informed when a build breaks or a deployment succeeds.

  • Manual Triggers and Cron Jobs: While Travis automatically builds on pushes and pull requests, you can also trigger builds via the API or on a schedule. Travis supports cron jobs to run builds periodically (e.g., nightly) on a branch – useful for scheduled tasks like dependency updates or security scans. Configure this in the Travis UI under your repository's settings (Cron Jobs section).

Below are some specific scenarios and integrations that demonstrate Travis CI's flexibility with various platforms and tools:

Deploying to AWS with TravisCI

Travis CI supports deploying to Amazon Web Services in multiple ways:

  • AWS S3 Deployment: As shown earlier, you can configure the S3 provider to upload files to an S3 bucket after a successful build. This is great for static websites or artifact storage. Simply provide your AWS keys and bucket name in the .travis.yml. You might include skip_cleanup: true to prevent Travis from resetting the working directory before deployment (which ensures your built files aren't deleted).
  • AWS CodeDeploy / Elastic Beanstalk: Travis can also trigger AWS CodeDeploy to push the new build to EC2 instances or deploy to Elastic Beanstalk environments. For CodeDeploy, you'd specify provider: codedeploy along with your AWS credentials, the application name, deployment group, etc. For Elastic Beanstalk, use provider: elasticbeanstalk with the app name and environment. These providers integrate directly so that a passing build invokes the AWS deployment service.
  • AWS Lambda (Serverless): Although TravisCI doesn't have a native Lambda provider, you can deploy serverless functions by running AWS CLI commands or using frameworks like Serverless in the Travis script. For example, after tests, run a deploy script that uses aws lambda update-function-code with the artifact, or use serverless deploy. Use Travis encrypted env vars for AWS credentials, and call the CLI in an after_success step.

For all AWS deployments, ensure the AWS IAM user or role has appropriate permissions. Travis logs will show the output of AWS commands or provider actions, which helps in debugging any permission or configuration issues.

The Travis CI AWS CodeDeploy documentation provides details on deploying to AWS services.

Using TravisCI with Docker

Travis CI can build and push Docker images as part of your pipeline, which is useful for containerized applications. The Travis Linux environment comes with Docker support. To enable Docker in your CI job:

  • Add the Docker service in your config:
    services:
      - docker
    This allows Docker commands to run (Linux builds only).
  • Build and Test with Docker: You can use docker build to build your image inside Travis, then optionally run containers for testing. (For example, build an image for a Go service and run docker run to execute its test suite in a container.)
  • Push to Docker Registry: To deploy a Docker image, log in to your registry and push. It's common to do this only on certain branches (e.g., push images when code is merged to main). Store your Docker registry credentials (e.g., Docker Hub username/password or token) as Travis env variables. In the build, authenticate and push:
    before_install:
      - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
    script:
      - docker build -t myapp:$TRAVIS_COMMIT .
      - docker push myapp:$TRAVIS_COMMIT
    You can also use Travis's deploy script provider to conditionally run a deploy script that handles Docker pushes. The snippet above uses $TRAVIS_COMMIT (a provided env var) to tag the image with the commit hash. You might also tag as "latest" or with the build number for convenience.
  • Docker Compose: Travis CI images have Docker Compose installed. If your app consists of multiple services, you can run docker-compose up -d in your test phase to spin up the stack, then run tests against it. Ensure to tear down the services after tests to free resources.

Using Docker in Travis gives you parity with production container environments and ensures your container builds are tested continuously.

For more information on using Docker with Travis CI, see the Docker in Builds documentation.

Continuous Deployment to Heroku via TravisCI

Heroku is a popular platform-as-a-service, and Travis CI has out-of-the-box support for deploying to Heroku:

  • Provider Setup: In your .travis.yml, use provider: heroku under deploy and supply the Heroku API key (as shown in the Setup Guide). It's recommended to keep the API key secure – either encrypt it in the config or reference an environment variable. You can generate a token with heroku auth:token and use the travis encrypt CLI command to add it to your config.
  • Default Deploy Behavior: By default, Travis will deploy to a Heroku app with the same name as your repository if no app name is specified. You can set the Heroku app name explicitly using the app: key in the config to avoid any ambiguity (especially if your repo name doesn't match an existing Heroku app).
  • Deployment Trigger: Typically, you only want to deploy from one branch (for example, deploy the main or master branch to production). Use the on: clause to restrict this. For example:
    deploy:
      provider: heroku
      app: my-app-prod
      on:
        branch: main
    You could add a second deploy entry for a staging branch to deploy to a staging Heroku app, etc. TravisCI supports multiple deploy providers in one config (they will run sequentially).
  • Verification: After Travis completes the deploy, you can check your Heroku app to ensure the new version is live. Travis logs will show the output of the deployment (e.g., "Launching... done" messages from Heroku). If there's an error (invalid API key, etc.), the Travis job will mark the deploy step as failed (but the test/build step success is unaffected unless you use after_success to conditionally deploy).

Continuous deployment with Travis and Heroku means any code merged to your main branch, after passing tests, goes live automatically – providing true CI/CD for your app.

Learn more about Heroku deployments in the Travis CI Heroku Deployment documentation.

Publishing to GitHub Pages with TravisCI

For static websites or documentation, Travis CI can publish content to GitHub Pages automatically:

  • Personal Access Token: First generate a GitHub personal access token (with public_repo scope for public repos). Add this as a secure environment variable in Travis (e.g., GITHUB_TOKEN). This token will be used instead of your password for pushing to GitHub Pages.
  • .travis.yml Configuration: Use the pages deploy provider in your config. A minimal example for deploying the main branch's build output to the gh-pages branch:
    deploy:
      provider: pages
      github_token: $GITHUB_TOKEN   # GitHub token from env vars
      keep_history: true           # keep commit history on gh-pages
      on:
        branch: main
    Include skip_cleanup: true if you generate files during the build (to prevent Travis from wiping them before deploy). By default, Travis will force-push to the target branch (overwriting its history), so using a separate branch like gh-pages is important. The keep_history: true option will preserve the commit history of the pages branch instead of force pushing.
  • Usage: You might use this for project documentation or any static site generator output. For instance, if your build produces a _site directory (Jekyll) or build directory (React, Vue, etc.), you can specify that as the directory to push by adding:
    local_dir: build  # directory containing the files to deploy
    under the deploy config. After a successful build, Travis will commit those files to the gh-pages branch using your token. You can then visit your project's GitHub Pages URL to see the updated content. This approach ensures your documentation or site updates go live as part of your CI pipeline.

Check the GitHub Pages Deployment documentation for more details on publishing to GitHub Pages with Travis CI.

With these deployment targets configured, Travis CI handles the heavy lifting of delivering your software to the desired platforms whenever you make changes, ensuring a robust CI/CD process.

Using with FOSSA

FOSSA is a tool that automates open source license compliance and dependency analysis for your projects. Integrating FOSSA with TravisCI adds an important layer to your CI/CD workflow: every build can now also verify that your project's dependencies are license-compliant and track any new open source components. In other words, FOSSA gives you visibility into licenses and alerts you of any license issues directly within your CI pipeline.

How FOSSA enhances TravisCI: While TravisCI ensures your tests pass, FOSSA scans the dependency tree for licensing conflicts or policy violations. This is crucial for teams that need to comply with open-source licenses continuously. By running FOSSA on each build, any problematic dependency (for example, a GPL-licensed library in a permissively licensed project) can be caught early. FOSSA's reports also provide insight into all third-party packages in your project (fulfilling the "dependency visibility" requirement as part of your CI checks).

To use FOSSA in TravisCI, follow these steps:

  • Obtain a FOSSA API Key: Log in to your FOSSA account and generate an API token (under account settings). This API key allows the FOSSA CLI to upload scan results to your FOSSA dashboard. For open-source projects, you might use a "push-only" token with limited scope.

  • Add the API key to Travis securely: Configure the FOSSA API key as an environment variable in your Travis CI project settings (e.g., name it FOSSA_API_KEY). Make sure to mark it as "private" or not visible in build log.

  • Install FOSSA CLI during the build: FOSSA provides a CLI client (fossa-cli) for scanning. You can install it in the Travis job before analysis. For example, in .travis.yml:

    before_install:
      - curl -H 'Cache-Control: no-cache' https://raw.githubusercontent.com/fossas/fossa-cli/master/install-latest.sh | sudo bash

    This command downloads and installs the latest FOSSA CLI into the build environment. You can also cache this installation or pin a specific version as needed.

  • Run FOSSA analysis as part of the build: After your build steps (and ideally after your project is compiled/built), invoke FOSSA to analyze the project's dependencies. Typically, you add this to the script section after your tests/build steps:

    script:
      - <your build/test commands>
      - fossa analyze

For more information on integrating FOSSA with Travis CI, check out the FOSSA Travis CI documentation.

Summary: TravisCI handles your builds, tests, and deployments across multiple languages and environments, and with FOSSA integrated, it also continuously checks license compliance and dependency risk. By following this guide, you set up a robust CI/CD pipeline: from the first commit all the way to deployment, with confidence in both software quality and open-source license health.