How To Deploy A Git Repository To A Server Using GitLab CI/CD
Do you want to learn how to deploy a git repository to your own server using GitLab CI/CD? In this post, I will lead you through creating it step-by-step. This includes the steps on your server, the steps on GitLab, and the action itself. Therefore we will go through the different sections:
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.
GitLab CI/CD 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:
Need help or want to share feedback? Join my discord community!
- Create a new user or use your own
- Check that user has access to the directory containing the repository
- Create an SSH key:
ssh-keygen -t rsa -b 4096
- Add the public key to the authorized_keys file:
cat <path/to/public/key> >> ~/.ssh/authorized_keys
- Copy content of the private key file:
cat <path/to/private/key> | base64 -w0
- 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 GitLab website:
- Go to “Settings > CI/CD > Variables > ‘Expand'”
- Create the following variables (mask the possible ones and make sure the private key is masked):
SSH_PRIVATE_KEY: content of the private key file encoded as base64
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)
- Go to the “Repository” tab in your GitLab repository
- Click on “New file” and name it “.gitlab-ci.yml”
- Then paste the following content:
stages: - deploy deploy: image: ubuntu:latest stage: deploy only: - main before_script: - apt-get -yq update - apt-get -yqq install ssh - install -m 600 -D /dev/null ~/.ssh/id_rsa - echo "$SSH_PRIVATE_KEY" | base64 -d > ~/.ssh/id_rsa - ssh-keyscan -H $SSH_HOST > ~/.ssh/known_hosts script: - ssh $SSH_USER@$SSH_HOST "cd $WORK_DIR && git checkout $MAIN_BRANCH && git pull && exit" after_script: - rm -rf ~/.ssh
The different blocks do the following:
before_script: setup ssh keys and known hosts
script: connect to the server via ssh, go to the correct directory and branch and then pull changes
after_script: remove the ssh keys and known hosts again
In this post, we create a GitLab CI/CD 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 email@example.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: