How To Deploy A Git Repository To A Server Using GitHub Actions

No Comments

Do you want to learn how to deploy a git repository to your own server using GitHub Actions? In this post, I will lead you through creating it step-by-step. This includes the steps on your server, the steps on GitHub, and the action itself. Therefore we will go through the different sections:

  1. The idea and the goal
  2. GitHub Action to deploy a git repository on a server
  3. Conclusion
  4. Helpful Links

The idea and the goal

The goal of this action is to push changes to your repository and to pull them onto your server automatically. This can be useful for deploying a website or a web app that automatically updates when the user visits/reloads your page.
To accomplish this, the idea of the action is to first connect to the server via ssh as a user with enough rights for the next steps. Then we want to change the directory to the directory containing the repository, change to the main branch, and pull the changes. Afterward, we can exit the shell again.

GitHub Action to deploy a git repository on a server

Now that we described the action’s goal and idea, we can start to set everything up. Follow the following steps:

On your server:

  1. Create a new user or use your own
  2. Check that user has access to the directory containing the repository
  3. Create an SSH key:
    ssh-keygen -t rsa -b 4096
  4. Copy content of the key file:
    more <path/to/private/key>
  5. Add the public key to the authorized_keys file:
    cat <path/to/public/key> >> ~/.ssh/authorized_keys
  6. You need to paste it in the next step, and now you can delete the private key:
    rm -rf <path/to/private/key>

On the GitHub website:

  1. Go to “Settings > Secrets > Actions”
  2. Create the following secrets:
    • SSH_PRIVATE_KEY: content of the private key file
    • SSH_USER: user to access the server
    • SSH_HOST: hostname/ip-address of your server
    • WORK_DIR: path to the directory containing the repository
    • MAIN_BRANCH: name of the main branch (mostly main)
  3. Go to the “Actions” tab in your GitHub repository
  4. Click on “set up a workflow yourself”
  5. Paste the following content:
on:
  push:
    branches:
      - main
  workflow_dispatch:
  
jobs:
  run_pull:
    name: run pull
    runs-on: ubuntu-latest
    
    steps:
    - name: install ssh keys
      # check this thread to understand why its needed:
      # https://stackoverflow.com/a/70447517
      run: |
        install -m 600 -D /dev/null ~/.ssh/id_rsa
        echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
        ssh-keyscan -H ${{ secrets.SSH_HOST }} > ~/.ssh/known_hosts
    - name: connect and pull
      run: ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} "cd ${{ secrets.WORK_DIR }} && git checkout ${{ secrets.MAIN_BRANCH }} && git pull && exit"
    - name: cleanup
      run: rm -rf ~/.ssh

The different blocks do the following:

Conclusion

In this post, we create a GitHub Action to deploy changes in a git repository to a server easily. I hope this little guide was helpful to you. In case you have any questions, feel free to ask in the comments or send me a mail at mail@programonaut.com (also check out the helpful links sections before).

If you liked this post, consider subscribing to my newsletter to get monthly updates!

With these links, I solved problems that occurred along the way:

  1. Connect via SSH in GitHub Actions
  2. GitHub “Permission denied (publickey)” on git pull (although all keys are created)
  3. Bad owner or permissions on /home/<user>/.ssh/config

Discussion (0)

Add Comment

Your email address will not be published. Required fields are marked *