SSH GitHub Action
Today I configured a GitHub Action to SSH my server and pull the main branch after a successful PR. Here’s how …
Background
I was needing to explore some CI/CD stuffs, specifically how the CD part works. I wanted to start small. I have a repo that holds my simple CV webpage and which is being hosted on my own sandbox VM - shaunnielsen.com. Given I would generally update the repo locally and push to GitHub, I would then have to 1) log in into the server, 2) navigate to the folder and 3) pull the changes to have the most recent version be served.
I expected that I would be able to use a GitHub Action to SSH into my server and do a git pull after changes were pushed to the main branch. Searching the internet revealed this to be a relatively simple task. This is how it was done …
An SSH GitHub Action
I googled github ssh action and the top hit led me to - https://github.com/appleboy/ssh-action. I noticed it had about 30 K users (2023-01-26), so it looked like the real deal.
In the simplest case, all it requires are the HOST, USERNAME, PASSWORD, PORT and some terminal commands (e.g. whoami, ls -al).
name: remote ssh command
on: [push]
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- name: executing remote ssh commands using password
uses: appleboy/ssh-action@v0.1.7
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
password: ${{ secrets.PASSWORD }}
port: ${{ secrets.PORT }}
script: |
whoami
ls -al
All I was required to do was to set up my secrets within the GitHub repo and determine my terminal commands.
GitHub repo secrets
Another google of github secrets led me to the relevant GitHub Docs. Within the repo, you go to
- the
Settingstab, - click on
Secrets and variablesin sidebar, - and click the
Actionssub-link.
Here you create your repo secrets that would be referenced in your actions YAML e.g. ${{ secrets.USERNAME }}. Simply click the New repository secret button.
I created the required secrets for the GitHub SSH Action but also thought to keep the path of repo secret as well - otherwise these details show up in the public action logs.
My SSH action
I created a simple action as follows
- when a push occurs to the
mainbranch (through a PR) - use the action
appleboy/ssh-action@v0.1.7 - on the server
cdto the repo directory- ensure the
mainbranch is checked out git pullthe latest change
name: Deploy to server
on:
push:
branches: [main]
jobs:
deploy:
name: Deploy to server
runs-on: ubuntu-latest
steps:
- name: executing remote ssh commands using password
uses: appleboy/ssh-action@v0.1.7
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
password: ${{ secrets.PASSWORD }}
port: ${{ secrets.PORT }}
script: |
cd ${{ secrets.PATH }}
git checkout main
git pull
I created a branch, made some changes and PR’d them to main. The action ran as expected (well, after some trial and error that we can easily omit here!)
Conclusion
A simple SSH action was created here thanks to appleboy/ssh-action. This example may be overly simple, as a real world case might involve unit testing and whatnot to pass before the deployment occurs. I’m sure there are examples out there and that is what I will be looking at next.