DEV Community

Cover image for Setting Up CI/CD with GitHub Actions on Shared Hosting cPanel
Eddie Gulay
Eddie Gulay

Posted on

Setting Up CI/CD with GitHub Actions on Shared Hosting cPanel

A Comprehensive Guide

Deploying web applications on shared hosting platforms like cPanel can be challenging, especially when trying to automate the process with CI/CD (Continuous Integration and Continuous Deployment). In this guide, we'll walk you through setting up a CI/CD pipeline using GitHub Actions to deploy your web application to a shared hosting environment via FTP.

Table of Contents

  1. Introduction to CI/CD and GitHub Actions
  2. Preparing Your Environment
  3. Creating the Deployment Script
  4. Setting Up GitHub Actions Workflow
  5. Troubleshooting and Optimization
  6. Conclusion

1. Introduction to CI/CD and GitHub Actions

Continuous Integration (CI) is a development practice where developers integrate code into a shared repository frequently, and Continuous Deployment (CD) automates the deployment of applications to production environments. GitHub Actions is a powerful tool that allows you to automate, customize, and execute your software development workflows right in your GitHub repository.

2. Preparing Your Environment

Before diving into the setup, ensure you have the following:

  • A GitHub repository for your web application.
  • FTP credentials for your cPanel hosting account.
  • Basic knowledge of shell scripting and GitHub Actions.

3. Creating the Deployment Script

We'll create a script that uses lftp to transfer files from your local repository to your cPanel server. This script ensures that only newer and updated files are uploaded, optimizing the deployment process.

Step-by-Step Deployment Script

  1. Create the deploy.sh script in the root of your project repository:

    #!/bin/bash
    
    # Exit immediately if a command exits with a non-zero status
    set -e
    
    # FTP server details
    FTP_HOST=$1
    FTP_USERNAME=$2
    FTP_PASSWORD=$3
    LOCAL_DIR=$4
    REMOTE_DIR=$5
    
    # Print debug information
    echo "FTP_HOST: $FTP_HOST"
    echo "FTP_USERNAME: $FTP_USERNAME"
    echo "LOCAL_DIR: $LOCAL_DIR"
    echo "REMOTE_DIR: $REMOTE_DIR"
    
    # Use lftp to mirror the local directory to the remote directory, skipping SSL verification
    lftp -d -c "
    set ssl:verify-certificate no;
    open -u $FTP_USERNAME,$FTP_PASSWORD $FTP_HOST;
    mirror -R --verbose --only-newer --parallel=10 $LOCAL_DIR $REMOTE_DIR;
    bye;
    "
    

    This script:

    • Connects to your FTP server.
    • Mirrors the local directory to the remote directory.
    • Skips SSL certificate verification (useful for self-signed certificates).
    • Uploads only newer and updated files.
  2. Make the script executable:

    chmod +x deploy.sh
    

4. Setting Up GitHub Actions Workflow

Next, we'll create a GitHub Actions workflow to automate the deployment process whenever changes are pushed to the main branch.

GitHub Actions Workflow Configuration

  1. Create the workflow file .github/workflows/deploy.yml in your repository:

    name: Deploy
    
    on:
      push:
        branches:
          - main
    
    jobs:
      deploy:
        runs-on: ubuntu-latest
    
        steps:
          - name: Checkout code
            uses: actions/checkout@v3
    
          - name: Set up LFTP
            run: sudo apt-get install -y lftp
    
          - name: Deploy to FTP
            run: |
              chmod +x deploy.sh
              ./deploy.sh ${{ secrets.FTP_HOST }} ${{ secrets.FTP_USERNAME }} ${{ secrets.FTP_PASSWORD }} ./ /your.domain.com/src
    

    This workflow:

    • Runs on every push to the main branch.
    • Checks out the code.
    • Installs lftp.
    • Executes the deploy.sh script with the FTP credentials and directories.
  2. Store FTP Credentials as GitHub Secrets:

    • Go to your GitHub repository.
    • Navigate to Settings > Secrets and variables > Actions.
    • Add the following secrets:
      • FTP_HOST: Your FTP server’s hostname or IP address.
      • FTP_USERNAME: Your FTP username.
      • FTP_PASSWORD: Your FTP password.

5. Troubleshooting and Optimization

Debugging Long Running Jobs

If your workflow is stuck or taking too long, add debugging information to the script and check the workflow logs in GitHub Actions.

# Use lftp with debug flag
lftp -d -c "
set ssl:verify-certificate no;
open -u $FTP_USERNAME,$FTP_PASSWORD $FTP_HOST;
mirror -R --verbose --only-newer --parallel=10 $LOCAL_DIR $REMOTE_DIR;
bye;
"
Enter fullscreen mode Exit fullscreen mode

Common Issues and Solutions

  • Network Issues: Ensure stable internet connectivity and correct FTP credentials.
  • Server Overload: Check cPanel server resource usage (CPU, RAM, disk space).
  • Retry Workflow: Sometimes, workflows can get stuck due to temporary issues. Retry the workflow from the Actions tab.

6. Conclusion

By setting up CI/CD with GitHub Actions and deploying to a shared hosting cPanel environment using FTP, you can automate your deployment process, ensuring that your web application is always up-to-date with the latest changes.
This guide provide a comprehensive guide though i found this approach not very reliable than using the actual FTP Softwares like filezila.

Thanks for reading, hope you got an idea 💡

Top comments (0)