I’ll go over this topic this weekend, as it will also help me refresh my own memory of it.
In earlier topics, we have to manually create the Amazon AWS EC2 cloud instance manually but with Terraform – A tool from HashiCorp that lets us define infrastructure as code and it allows us to automate the provision of this instance automatically through hcl code (HashiCorp Configuration Language) and it is file with .tf extension — for example1: main.tf
In short, with Terraform, we can use it to define infrastructure as code as seen above so it allows us to automate the infrastructure (AWS, GCP, Azure, etc.) through GitLab Pipelines instead of manual provisioning. It’s very useful since manual processes are typically more prone to errors than automated ones.
e.g we would have a GitLab project that is responsible to automate the infrastructure of the cloud providers like AWS, Google Cloud Platform (GCP), Azure etc. and another GitLab project that is responsible to do the actual software development on that said infrastructure.
And with this automation of the infrastructure of the cloud providers we can quickly provision them through code – hcl code. It is an advance topic.
Runner is a GitLab component that actually executes our CI/CD pipeline (Continuous Integration (CI)/Continuous Delivery (CD) ).
We define our CI/CD pipeline stage and job using its .gitlab-ci.yml (.yaml) file which defines jobs (like builds, tests, deploys), the runner is what runs those scripts on some compute environment e.g our aws ec2 cloud instance amazon linux.
test-job1: stage: test script: - echo "This job tests something"
test-job2: stage: test script: - echo "This job tests something, but takes more time than test-job1." - echo "After the echo commands complete, it runs the sleep command for 20 seconds" - echo "which simulates a test that runs 20 seconds longer than test-job1" - sleep 20
deploy-prod: stage: deploy script: - echo "This job deploys something from the $CI_COMMIT_BRANCH branch." environment: production
with .yml above, it is like set of instruction that we tell how GitLab would run the runners for our CI/CD pipeline. Like above, we tell GitLab that the runner would have 3 stages
first stage is build, second stage is test, and third stage is deploy.
First we will have to add GitLab runner repo and then yum install it:
by executing below curl piped command to add the repo & yum install command to install it at terminal:
# Add the official GitLab Runner repository curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash
# Install the runner sudo yum install gitlab-runner -y
after the piped command we should see this which mean our gitlab repo is added to our amazon linux distro repos:
This looks good our GitLab’s runner is now installed in our AWS ec2 cloud linux distro successfully.
Next, we need to setup our GitLab’s repo and point our runner to our AWS ec2 cloud linux runner instance.
Go to our project’s repository, then navigate to Settings → CI/CD → Runners, and disable the instance (SaaS) runners by toggling them off.
Next, go to Project Runners → Create project runner
For the simplicity, we will check untagged and click create runner
Choose Linux since our AWS cloud is EC2 Amazon linux
And copied and paste the following command at our aws ec2 cloud instance (amazon linux) to register it there (to link them: Gitlab <-> aws ec2 linux runner instance)
hit enter since we will use the default url https://gitlab.com
and enter “linuxrunner” as the name our self-managed runner here:
next type shell for the executor and hit enter (since this is a simple demonstration of the setup of self-managed runner, we chose shell for our .gitlab-ci.yml’s script aka bash, but if you want you can choose vm, or docker etc and chose by typing the executor type here)
This looks good:
we use https://gitlab.com as instance url,
named it “linuxrunner”
and chose shell as an executor.
At our GitLab project settings CI/CD we would see this below:
Click on View runners and we should see our project runner is registered successfully and online (green means it is online)
Note that our simple .gitlab-ci.yml is as below: 3 stages (build, test, deploy), 1 build job, 2 test jobs, and one deploy job.
so any commit to our main branch of our project branch would trigger the pipeline as seen below:
All the jobs completed and passed successfully
We can check our ci/cd pipeline jobs log as seen above and we saw that our script were executed successfully.
This concluded that we have pointed our project’s CI/CD pipeline runner to our self-managed runner on AWS EC2 cloud Amzon Linux successfully.
In addition, how do we check the status of our runner whether it is running or not?
our runner is actually a daemon. think of daemon like a windows service which we can check using service.msc but how do we check the status of daemon service in linux?
A Linux daemon service is a background process that runs continuously on a Linux system, typically without direct user interaction. Daemons are often used for system or network services — like web servers, database servers, or schedulers — and are managed using the systemd service manager in most modern Linux distributions.
in centos family like Amazon linux distribution, we can check it using
sudo systemctl status <daemon_service_name>
e.g:
sudo systemctl status gitlab-runner
to make gitlab-runner daemon service run automatically at start up we can execute command below: