YT10‐GitHub Action - zhamri/CSC584-Enterprise_Programming GitHub Wiki

1. Create SSH key for GitHub Actions

On your own machine, generate a deployment key:

ssh-keygen -t ed25519 -C "github-actions-deploy" -f github_actions_deploy_key

(best practices)
ssh-keygen -t ed25519 -C "github-actions-deploy" -f ~/.ssh/github_actions_deploy_key

This gives:

  • github_actions_deploy_key
  • github_actions_deploy_key.pub
File Purpose
github_actions_deploy_key 🔐 Private key → put in GitHub Secrets
github_actions_deploy_key.pub 🔓 Public key → put in server (authorized_keys)

Add the public key to your Droplet:

ssh-copy-id -i github_actions_deploy_key.pub root@YOUR_SERVER_IP

Or manually append it to:

~/.ssh/authorized_keys

2. Logging into the server to check the key

% ssh -i ./github_actions_deploy_key 'root@YOUR_SERVER_IP'

3. Add GitHub repository secrets

In GitHub repo:

Settings → Secrets and variables → Actions

Create these secrets:

  • DO_HOST = your droplet IP
  • DO_USER = root or deploy user
  • DO_SSH_KEY = contents of github_actions_deploy_key
  • DO_PORT = 22

4. Create the GitHub Actions workflow

Create this file:

.github/workflows/deploy.yml

Then paste:

name: Build and Deploy JSP Servlet App

on:
  push:
    branches:
      - mydeploy

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout source
        uses: actions/checkout@v4

      - name: Set up Java
        uses: actions/setup-java@v4
        with:
          distribution: temurin
          java-version: '21'
          cache: maven

      - name: Build WAR with Maven
        run: mvn clean package -DskipTests

      - name: Start SSH agent
        uses: webfactory/[email protected]
        with:
          ssh-private-key: ${{ secrets.DO_SSH_KEY }}

      - name: Add server to known_hosts
        run: |
          mkdir -p ~/.ssh
          ssh-keyscan -p ${{ secrets.DO_PORT }} ${{ secrets.DO_HOST }} >> ~/.ssh/known_hosts

      - name: Upload WAR to server
        run: |
          scp -P ${{ secrets.DO_PORT }} target/ROOT.war \
            ${{ secrets.DO_USER }}@${{ secrets.DO_HOST }}:/tmp/ROOT.war

      - name: Deploy on Tomcat server
        run: |
          ssh -p ${{ secrets.DO_PORT }} ${{ secrets.DO_USER }}@${{ secrets.DO_HOST }} << 'EOF'
            sudo systemctl stop tomcat10
            sudo rm -rf /var/lib/tomcat10/webapps/ROOT
            sudo rm -f /var/lib/tomcat10/webapps/ROOT.war
            sudo mv /tmp/ROOT.war /var/lib/tomcat10/webapps/ROOT.war
            sudo chown tomcat:tomcat /var/lib/tomcat10/webapps/ROOT.war || true
            sudo systemctl start tomcat10
          EOF

This workflow:

  • triggers on push to main
  • builds your app with Maven
  • uploads the WAR via scp
  • deploys it to Tomcat over SSH