DEV Community

Cover image for Setting up Automatic Deployment from one repository to another
Tousif Izaz
Tousif Izaz

Posted on

Setting up Automatic Deployment from one repository to another

I recently wanted to host my React portfolio on GitHub Pages, but with a twist. Most tutorials show you how to deploy to [username.github.io/repository-name], which is straightforward. However, I wanted my portfolio to live at the root domain: username.github.io.
But, I didn't want my GitHub Pages repository cluttered with React source code, node_modules, and development files. I wanted clean separation:

  • One repository for my React source code (development, version control, collaboration)
  • Another repository (username.github.io) with only the production build

Manually building and pushing every time I made changes? Not ideal. There had to be a better way.

Cross-Repository GitHub Actions

After some tinkering, I discovered GitHub Actions could automate deployments between repositories. Here's what I learned.

Understanding GitHub Pages Root Domain Deployment

Option A: Put React code in username.github.io
❌ Messy: Source code mixed with builds
❌ Unprofessional: Shows development artifacts

Option B: Build locally, push to username.github.io
❌ Manual process every deployment
❌ Error-prone: Forget to build? Push wrong files?
❌ Not scalable: No CI/CD pipeline

Option C: Separate repos + GitHub Actions
✅ Clean separation of concerns
✅ Automated builds and deployments
✅ Professional CI/CD workflow

The Solution: Two-Repository Architecture

Repository 1: my-portfolio (Private/Public)

  • React source code
  • Development dependencies
  • GitHub Actions workflow
  • Version control for features

Repository 2: username.github.io (Public)

  • Only production build files
  • Automatically updated by CI/CD
  • Serves the live website

Step 1: Setting Up the Workflow File

In my React repository, I created .github/workflows/deploy.yml:

name: Deploy to GitHub Pages

on:
  push:
    branches:
      - main  # Triggers on every push to main
  workflow_dispatch:  # Allows manual deployment

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

    steps:
      - name: Checkout source repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '18'
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Run tests
        run: npm test -- --watchAll=false --passWithNoTests
        continue-on-error: false

      - name: Build React app
        run: npm run build
        env:
          CI: true

      - name: Verify build output
        run: |
          echo "Build completed successfully"
          ls -la ./build
          du -sh ./build

      - name: Deploy to GitHub Pages repository
        uses: peaceiris/actions-gh-pages@v3
        with:
          personal_token: ${{ secrets.PAGES_DEPLOY_TOKEN }}
          external_repository: username/username.github.io
          publish_branch: main #branch name of repo u want to deploy to
          publish_dir: ./build #directory of the action
          user_name: 'github-actions[bot]'
          user_email: 'github-actions[bot]@users.noreply.github.com'
          commit_message: 'Deploy from ${{ github.repository }}@${{ github.sha }}'
Enter fullscreen mode Exit fullscreen mode

Step 2: Authentication Setup

GitHub Actions needs permission to push to another repository. Here's what I learned about authentication options:

Option A: Personal Access Token (What I Used)

Creating the token:

GitHub Settings → Developer settings → Personal access tokens → Tokens (classic)
Generate new token (classic)
Name it descriptively: "Portfolio Deploy to GitHub Pages"
Expiration: Choose based on security needs
Required scopes:

repo - Full control of repositories
workflow - Update GitHub Action workflows

Adding to repository secrets:

Go to React repository → Settings → Secrets and variables → Actions
New repository secret
Name: PAGES_DEPLOY_TOKEN
Value: Paste the token
Add secret

Option B: Deploy Keys (More Secure Alternative)

I also explored deploy keys, which are SSH-based and repository-specific:

# Generate SSH key pair
ssh-keygen -t ed25519 -C "deploy-key-pages" -f deploy_key -N ""
Enter fullscreen mode Exit fullscreen mode

Then:

Add deploy_key.pub to username.github.io → Settings → Deploy keys (with write access)
Add deploy_key (private) to React repo → Settings → Secrets as PAGES_DEPLOY_KEY

Update workflow to use deploy_key: ${{ secrets.PAGES_DEPLOY_KEY }} instead of personal_token.

Why I chose Personal Access Token:

Simpler for a single-user portfolio. Deploy keys are better for team projects.

Configuring the Build

Important customizations I had to make:

yaml# Node version matching my local environment
node-version: '18'  # Check with: node --version

# Build output directory
publish_dir: ./build  # React uses 'build', Vite uses 'dist'

# Package manager
run: npm ci  # Or 'yarn install --frozen-lockfile' for Yarn
Enter fullscreen mode Exit fullscreen mode

Pro tip: Always verify your build directory locally:

npm run build
ls -la  # Check if 'build' or 'dist' folder was created
Enter fullscreen mode Exit fullscreen mode

Step 4: Testing the Workflow
First deployment:

git add .github/workflows/deploy.yml
git commit -m "Add automated deployment workflow"
git push origin main
Enter fullscreen mode Exit fullscreen mode

Then I monitored it:

  1. React repository → Actions tab
  2. Watched the "Deploy to GitHub Pages" workflow
  3. Each step showed real-time logs
  4. Green checkmarks = success!

Within 5 minutes, username.github.io received the build files and my portfolio was live!

How It Works: The Complete Flow

Developer pushes code
        ↓
GitHub Actions triggers in React repo
        ↓
1. Checkout source code
2. Install dependencies
3. Run tests
4. Build React app (npm run build)
5. Generate ./build folder
        ↓
Workflow authenticates with token
        ↓
Push build files to username.github.io
        ↓
GitHub Pages auto-deploys
        ↓
Site live at username.github.io
Enter fullscreen mode Exit fullscreen mode

Troubleshooting Issues I Encountered

Issue 1: Build Fails in CI but Works Locally

Problem: Different Node versions
Solution: Match Node version in workflow to local:

node --version  # Check local version
# Update workflow: node-version: '18'
Enter fullscreen mode Exit fullscreen mode

Issue 2: 404 on GitHub Pages

Problem: Routing issues with React Router
Solution:

  • Make sure your homepage for the react is set correctly.
  • Add 404.html that redirects to index.html or use hash routing: <BrowserRouter basename="/"> // For username.github.io

Resources

GitHub Actions Documentation
peaceiris/actions-gh-pages
GitHub Pages Documentation

Top comments (0)