Implementation of CI/CD in C/C++ Application(Linux) Using Shell and Docker Executor on GitLab - GeeksforGeeks

01 Feb, 2021
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. 
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  
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 
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 https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
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.
Follow some more GitLab Runner commands to familiarize yourself.  
Command
Description 
.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
Advanced Computer Subject
C++
Git
Linux-Unix
CPP
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Copying Files to and from Docker Containers
Markov Decision Process
Fuzzy Logic | Introduction
Q-Learning in Python
Principal Component Analysis with Python
Vector in C++ STL
Arrays in C/C++
Initialize a vector in C++ (6 different ways)
Inheritance in C++
Map in C++ Standard Template Library (STL)