Implementation of CI/CD in C/C++ Application(Linux) Using Shell and Docker Executor on GitLab
Last Updated :
11 Apr, 2025
There are many executors available to implement CI/CD with GitLab Runner. However, Shell and Docker are more popular among them, and we can easily configure a repository with these runners. These runners can be chosen based on the requirements and availability of the resources. This article mainly focuses on Shell and Docker executor of C/C++ Linux application and code is written in bash script. The application can build and test using a bash script.
Shell Executor: Shell Executor is a very simple executor that helps to build the solution locally on the machine, where GitLab Runner is installed. In this case, GitLab Runner is installed on Linux Machine, so need to install the required software in the same system.
Docker Executor: It is a powerful tool that includes much software and it can be accessed by image. The advantage of this executor is that, we do not need to install any software manually, everything will be taken care of through docker and the required image will be downloaded from the docker hub. However, the disadvantageous is that this communication is blocked in some organizations due to security purposes. So, If this is the case Shell Executor is the best alternative.
Implementation of C/C++ on Shell Executor
Requirements: These are the basic software which needs to install in Linux machine. However, it can be changed based on the compilation script and need to download other software if needed.
Software
|
Description
|
Git |
This is the first requirement, to commit the changes on GitLab. It is a version control software which tracks the changing set of files |
cmake |
To build automation, testing, and packaging c/c++application, need to install cmake in Linux machine. |
gcc |
It is a compiler that needs to compile the c/c++ programs |
g++ |
It is also a compiler that needs to compile the c/c++ programs. It can be chosen based on the written script. |
grep |
Install it if the program is searching plain-text. |
Path Configuration: After successful installation above, need to set the path of this installed software in the machine if it is not set. Run the below command on the machine.
Variable /File
|
Path
|
G++ |
export GCC=/usr/bin/g++ |
CC |
export CC=/usr/bin/gcc |
GREP |
export GREP=/usr/bin/grep |
Permission |
Give Permission to script before it run: the chmod -R 777 * |
.gitlab-ci.yml |
This file should be inside root directory of the project which contains all the CI/CD configuration including software and script path. Here, you can mention how this repository should run. Before adding this file to the root directory, should check it is a valid yml file or not. |
GitLab Runner Set Up: Follow the below steps to download and configure the GitLab Runner.
1. Download GitLab Runner on Linux Machine using the following command
sudo curl -L --output /usr/local/bin/gitlab-runner
2. Give it permissions for execution using the following command
sudo chmod +x /usr/local/bin/gitlab-runner
3. Create a GitLab CI using the following command
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
4. Install and run as service using the following command
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
5. Start GitLab Runner using the following command
sudo gitlab-runner start
6. Stop the GitLab Runner before registering the repository
sudo gitlab-runner stop
7. Once GitLab Runner is successfully stopped enter the following command in the terminal for repository registration.
sudo gitlab-runner register
8. When you do repository registration with GitLab Runner, the below questions have to answer.
- Enter your GitLab instance URL: It can be different with each organization and the format will be like http://gitlab.example.com
- Path: Go to GitLab Account → Select repository which you want to register with runner → Settings → CI/CD → Expand Runner
- Enter the gitlab-ci token for this runner: It will be a unique token of each project which will need while registration and it can be found Path: Go to GitLab Account → Select repository which you want to register with runner → Settings → CI/CD → Expand Runner
- Enter the gitlab-ci description for this runner: Put Runner name(any name), which will help you to remember that which runner’ is running
- Enter the gitlab-ci tags for this runner: It is optional if you want to start GitLab runner when a specific tag is available in yml file.
- Enter the executor: There will be a list of several executors, and type shell(as GitLab Runner will run our system)
9. After successful registration, start the GitLab Runner using the following command.
sudo gitlab-runner start
10. To verify that GitLab Runner has registered the respective repository and the runner has been started. Go to GitLab Account → Select repository which you want to register with runner → Settings → CI/CD → Expand Runner, There will be green color circle will be available and displaying message will be Runners activated for this project. Note: If the circle is gray, it means the runner has not started and starts again.
Linux GitLab Runner Commands
Follow some more GitLab Runner commands to familiarize yourself.
Command
|
Description
|
sudo gitlab-runner register |
Register the project with GitLab Runner |
sudo gitlab-runner start |
Start the runner |
sudo gitlab-runner stop |
Stop the runner |
sudo gitlab-runner status |
To know the status of gitlab-runner |
sudo gitlab-runner unregister –name test-runner |
Unregister the Runner of a project and replace the test-runner with your runner name and this name can be found inside the config.toml file (where your gitlab-runner ) available. |
sudo gitlab-runner unregister –url http://gitlab.example.com/ –token t0k3n |
Remove Runner by URL and token |
sudo gitlab-runner unregister –all-runners |
To unregister All Runners |
sudo gitlab-runner restart |
This command stops and then starts the GitLab Runner service |
sudo gitlab-runner uninstall |
This command stops and uninstalls the GitLab Runner from being run as a service |
sudo gitlab-runner exec |
To see a list of available executors, run |
sudo gitlab-runner –help |
Check a recent list of commands by executing |
sudo gitlab-runner run –help |
Can see the name of the environment variable |
sudo gitlab-runner –debug |
To run a command in debug mode |
sudo gitlab-runner exec shell |
To see a list of all available options for the shell executor, run |
.gitlab-ci.yml_ shell Executor:
Below is the content of .gitlab-ci.yml on shell executor mode. However, change it if needed.
stages:
- build
- test
build_job:
stage: build
only:
- master
script:
- cd sourcecode
- export G++=/usr/bin/g++ //if not set manually path of g++
- export GCC=/usr/bin/gcc //if not set manually path of gcc
- chmod -R 777 *
- ./BuildPackage.sh
- pwd
artifacts:
expire_in: 365 days //save the binary which needed while test the application, and it can be downloaded from GitLab
paths:
- sourcecode/binaryfolder_name // save the binary
test_job:
stage: test
only:
- master
script:
- pwd
- cd testdir //go to test directory for run the test case script
- chmod -R 777 *
- ./tests.sh
dependencies:
- build_job
- build_job
Implementation of C/C++ on Docker Executor: There is no need to install any software manually, everything will be taken from the docker container. However, you can install the required software inputting the name in yml file and also can export the path. To run the gitlab runner on docker executor mode, Go to GitLab Runner Set-Up(above), and select docker instead of shell.
.gitlab-ci.yml_ Docker Executor:
Below is the content of .gitlab-ci.yml on docker executor mode. However, change it if needed.
image: ubuntu:latest
stages:
- build
- test
before_script:
- echo "Before script install this on ubuntu image "
- apt-get update && apt-get -y install cmake && apt-get -y install gcc && apt-get -y install g++
build_job:
stage: build
only:
- master
script:
- cd sourcecode
- export G++=/usr/bin/g++ //if not set manually path of g++
- export GCC=/usr/bin/gcc //if not set manually path of gcc
- chmod -R 777 *
- ./BuildPackage.sh
- pwd
artifacts:
expire_in: 365 days //save the binary which needed while test the application, and it can be downloaded from GitLab
paths:
- sourcecode/binaryfolder_name // save the binary
test_job:
stage: test
only:
- master
script:
- pwd
- cd testdir //go to test directory for run the test case script
- chmod -R 777 *
- ./tests.sh
dependencies:
- build_job
Similar Reads
Create Directory or Folder with C/C++ Program
Problem: Write a C/C++ program to create a folder in a specific directory path. This task can be accomplished by using the mkdir() function. Directories are created with this function. (There is also a shell command mkdir which does the same thing). The mkdir() function creates a new, empty director
2 min read
Implementation of CI/CD in Java application(Linux) Using Shell and Docker Executor on GitLab
There are many executors available to implement CI/CD with GitLab Runner. However, Shell and Docker are more popular among them, and we can easily configure a repository with these runners. These runners can be chosen based on the requirements and availability of the resources. This article mainly f
6 min read
Implementation of CI/CD in .NET application Using Shell Executor on GitLab
Continuous Integration and Continuous Deployment (CI/CD) have revolutionized software development, allowing teams to automate build, test, and deployment processes for rapid and reliable software delivery. In the .NET ecosystem, implementing CI/CD pipelines is important for maintaining code quality,
6 min read
Setting Up A CI/CD Pipeline For PHP Applications Using Jenkins
In contemporary software development, Continuous Integration and Continuous Deployment (CI/CD) pipelines have arisen as key devices for smoothing out the deployment cycle and ensuring the quick conveyance of high-quality applications. This guide centers around designing a CI/CD pipeline custom-fitte
6 min read
Running GUI Applications on Docker in Linux
Let's say you are trying to build a UI application and deploying it as a Docker Container. If you want that UI application to display the user interface on your local machine while running the application inside the Docker Container, you will have to connect the display of the Docker Container with
3 min read
Build, Test and Deploy a Flask REST API Application from GitHub using Jenkins Pipeline Running on Docker
Nowadays even for small web applications or microservices, we need an easier and faster way to deploy applications that is reliable and safe. These applications may be simple but they undergo rapid changes from the business requirement, to handle these changes we definitely need a CI/CD pipeline for
4 min read
Implementing CI/CD Pipelines with Docker and Jenkins
Modern software development has CI and CD pipelines as its core practices, fostering the delivery of code faster, more reliably, and with fewer errors. CI/CD pipelines generally automate the process of building, testing, and deployment to ease the development process, so that the lifecycle becomes s
6 min read
Running a Ruby Application using Docker
Pre-requisite:- Docker Docker is a containerization platform that allows you to package your applications and their dependencies into a lightweight and portable containers. Using Docker, you can easily deploy and run your applications on any platform that supports Docker, without having to worry abo
4 min read
How to Dockerize django application for production deployment with Gunicorn and Nginx
Docker is an open-source containerization platform used for building, running, and managing applications in an isolated environment. A container is isolated from another and bundles its software, libraries, and configuration files. Django is an open-source Python web framework that can be used to qu
5 min read
Spring Boot Application Deployment in Kubernetes with Jenkins CI/CD Pipeline
As we know in the modern world we use Continuous Integration and Continuous Deployment for fast and and efficient delivery of our application to the market. Here in this Article, we are deep-diving into how we can actually deploy Spring boot applications on Kubernetes with the help of Jenkins CI/CD.
14 min read