How do you set up a CI/CD pipeline using Travis CI for a Laravel project?

12 June 2024

In today's fast-paced development environment, continuous integration and continuous deployment (CI/CD) are crucial for maintaining high-quality code and seamless deployment processes. When you're working with a Laravel project, integrating a CI/CD pipeline can significantly streamline your workflow. Travis CI offers a robust solution for setting up a reliable CI/CD pipeline. This article will guide you through the detailed steps to set up a CI/CD pipeline using Travis CI for your Laravel project.

Setting up a CI/CD pipeline for a Laravel project using Travis CI involves several key steps, from configuring your Travis file to deploying your application. Whether you're new to Travis CI or looking to enhance your current setup, this guide aims to provide clear and comprehensive instructions. By the end of this article, you will have a functional CI/CD pipeline tailored for a Laravel application, leveraging Travis CI's capabilities.

Configuring Travis CI for Your Laravel Project

To start with, you need to integrate Travis CI with your Laravel repository on GitHub. Travis CI will automatically run your tests and deploy your code whenever you push changes to your repository.

Begin by signing up for Travis CI using your GitHub account. Once logged in, enable Travis CI for the specific repository you want to set up. This can be done from the Travis CI dashboard.

Next, create a .travis.yml file in the root directory of your Laravel project. This file is crucial as it contains the configurations Travis CI will use to build and test your project. Here’s a basic example of what your .travis.yml file might look like:

language: php
php:
  - '7.4'
  - '8.0'

services:
  - mysql
  - docker

before_install:
  - cp .env.example .env
  - composer self-update

install:
  - composer install
  - php artisan key:generate
  - php artisan migrate --seed

script:
  - vendor/bin/phpunit

deploy:
  provider: script
  script: bash deploy.sh
  on:
    branch: main

This file specifies the PHP versions to be used, the services to be started, and the commands to execute before and during the build process.

Integrating Docker for Environment Consistency

Incorporating Docker into your Travis CI pipeline ensures consistency across different environments. Docker containers allow you to define a reliable environment for your Laravel application, minimizing discrepancies between your development and production setups.

To use Docker, you must define a Dockerfile in your project that specifies the environment your application needs. Here’s an example of a basic Dockerfile for a Laravel application:

FROM php:7.4-fpm

RUN apt-get update && apt-get install -y 
    libpng-dev 
    libjpeg62-turbo-dev 
    libfreetype6-dev 
    && docker-php-ext-configure gd --with-freetype --with-jpeg 
    && docker-php-ext-install gd

WORKDIR /var/www

COPY . .

RUN composer install

CMD ["php-fpm"]

In your .travis.yml file, modify the before_install section to build and run your Docker container:

before_install:
  - docker build -t my-laravel-app .
  - docker run -d -p 80:80 my-laravel-app
  - cp .env.example .env
  - docker exec my-laravel-app composer self-update

These modifications ensure Travis CI builds and runs your application in a Docker container, providing a consistent environment for testing and deployment.

Running Tests with PHPUnit and Laravel Dusk

Testing is a cornerstone of any CI/CD pipeline. For a Laravel project, running tests with PHPUnit and Laravel Dusk ensures your application is robust and reliable.

In your .travis.yml file, the script section should include commands to run your tests. For PHPUnit, this typically involves executing the phpunit command:

script:
  - vendor/bin/phpunit

For end-to-end testing with Laravel Dusk, ensure you have the necessary dependencies installed and configured. Update your composer.json to include Dusk:

"require-dev": {
    "laravel/dusk": "^6.0"
}

Install Dusk and update your .travis.yml file to run Dusk tests:

before_script:
  - php artisan dusk:chrome-driver --detect
  - php artisan serve &

script:
  - vendor/bin/phpunit
  - php artisan dusk

Running both PHPUnit and Dusk tests in your CI/CD pipeline ensures comprehensive testing, covering both unit and user interface aspects of your application.

Secure Deployment with Travis CI

Deploying your application securely is the final step in setting up your CI/CD pipeline. Travis CI supports various deployment providers, including custom scripts for more specific needs.

In your .travis.yml file, the deploy section specifies how and when to deploy your application. Here’s an example of a deployment script setup:

deploy:
  provider: script
  script: bash deploy.sh
  on:
    branch: main

Create a deploy.sh script in your project’s root directory. This script will handle the deployment logic. For instance, deploying to a server via SSH might look like this:

#!/bin/bash

echo "Starting deployment"

# Stop the server if running
ssh user@yourserver 'sudo systemctl stop yourapp'

# Copy files to the server
rsync -avz --exclude '.env' ./ user@yourserver:/path/to/yourapp

# Install dependencies and migrate the database
ssh user@yourserver 'cd /path/to/yourapp && composer install && php artisan migrate --force'

# Restart the server
ssh user@yourserver 'sudo systemctl start yourapp'

echo "Deployment complete"

Ensure your deploy.sh script is executable and replace placeholders with your actual server details and paths. This setup ensures a smooth and secure deployment process, triggered automatically whenever changes are pushed to the main branch.

Setting up a CI/CD pipeline using Travis CI for a Laravel project involves integrating various tools and configuring several components. By following the steps outlined in this article, you can create a robust CI/CD pipeline that builds, tests, and deploys your application seamlessly.

From configuring your .travis.yml file to integrating Docker for consistent environments, running comprehensive tests with PHPUnit and Laravel Dusk, and deploying securely using custom scripts, each step is crucial for a smooth and efficient CI/CD process. Embracing these practices will not only improve your development workflow but also ensure high-quality code and reliable deployments.

With Travis CI, you can automate much of the repetitive and error-prone tasks involved in building, testing, and deploying your Laravel application. As a result, you'll be able to focus more on writing code and less on managing the deployment process, leading to faster development cycles and more robust applications.

Copyright 2024. All Rights Reserved