194 lines
8.2 KiB
Markdown
194 lines
8.2 KiB
Markdown
|
---
|
||
|
description: "An overview of Continuous Integration, Continuous Delivery, and Continuous Deployment, as well as an introduction to GitLab CI/CD."
|
||
|
---
|
||
|
|
||
|
# Introduction to CI/CD with GitLab
|
||
|
|
||
|
In this document we'll present an overview of the concepts of Continuous Integration,
|
||
|
Continuous Delivery, and Continuous Deployment, as well as an introduction to
|
||
|
GitLab CI/CD.
|
||
|
|
||
|
## Introduction to CI/CD methodologies
|
||
|
|
||
|
The continuous methodologies of software development are based on
|
||
|
automating the execution of scripts to minimize the chance of
|
||
|
introducing errors while developing applications. They require
|
||
|
less human intervention or even no intervention at all, from the
|
||
|
development of new code until its deployment.
|
||
|
|
||
|
It involves continuously building, testing, and deploying code
|
||
|
changes at every small iteration, reducing the chance of developing
|
||
|
new code based on bugged or failed previous versions.
|
||
|
|
||
|
There are three main approaches to this methodology, each of them
|
||
|
to be applied according to what best suits your strategy.
|
||
|
|
||
|
### Continuous Integration
|
||
|
|
||
|
Consider an application which has its code stored in a Git
|
||
|
repository in GitLab. Developers push code changes every day,
|
||
|
multiple times a day. For every push to the repository, you
|
||
|
can create a set of scripts to build and test your application
|
||
|
automatically, decreasing the chance of introducing errors to your app.
|
||
|
|
||
|
This practice is known as [Continuous Integration](https://en.wikipedia.org/wiki/Continuous_integration);
|
||
|
for every change submitted to an application - even to development branches -
|
||
|
it's built and tested automatically and continuously, ensuring the
|
||
|
introduced changes pass all tests, guidelines, and code compliance
|
||
|
standards you established for your app.
|
||
|
|
||
|
[GitLab itself](https://gitlab.com/gitlab-org/gitlab-ce) is an
|
||
|
example of using Continuous Integration as a software
|
||
|
development method. For every push to the project, there's a set
|
||
|
of scripts the code is checked against.
|
||
|
|
||
|
### Continuous Delivery
|
||
|
|
||
|
[Continuous Delivery](https://continuousdelivery.com/) is a step
|
||
|
beyond Continuous Integration. Your application is not only
|
||
|
built and tested at every code change pushed to the codebase,
|
||
|
but, as an additional step, it's also deployed continuously, though
|
||
|
the deployments are triggered manually.
|
||
|
|
||
|
This method ensures the code is checked automatically but requires
|
||
|
human intervention to manually and strategically trigger the deployment
|
||
|
of the changes.
|
||
|
|
||
|
### Continuous Deployment
|
||
|
|
||
|
[Continuous Deployment](https://www.airpair.com/continuous-deployment/posts/continuous-deployment-for-practical-people)
|
||
|
is also a further step beyond Continuous Integration, similar to
|
||
|
Continuous Delivery. The difference is that instead of deploying your
|
||
|
application manually, you set it to be deployed automatically. It does
|
||
|
not require human intervention at all to have your application
|
||
|
deployed.
|
||
|
|
||
|
## Introduction to GitLab CI/CD
|
||
|
|
||
|
GitLab CI/CD is a powerful tool built into GitLab that allows you
|
||
|
to apply all the continuous methods (Continuous Integration,
|
||
|
Delivery, and Deployment) to your software with no third-party
|
||
|
application or integration needed.
|
||
|
|
||
|
### How GitLab CI/CD works
|
||
|
|
||
|
To use GitLab CI/CD, all you need is an application codebase hosted in a
|
||
|
Git repository, and for your build, test, and deployment
|
||
|
scripts to be specified in a file called [`.gitlab-ci.yml`](../yaml/README.md),
|
||
|
located in the root path of your repository.
|
||
|
|
||
|
In this file, you can define the scripts you want to run, define include and
|
||
|
cache dependencies, choose commands you want to run in sequence
|
||
|
and those you want to run in parallel, define where you want to
|
||
|
deploy your app, and specify whether you will want to run the scripts automatically
|
||
|
or trigger any of them manually. Once you're familiar with
|
||
|
GitLab CI/CD you can add more advanced steps into the configuration file.
|
||
|
|
||
|
To add scripts to that file, you'll need to organize them in a
|
||
|
sequence that suits your application and are in accordance with
|
||
|
the tests you wish to perform. To visualize the process, imagine
|
||
|
that all the scripts you add to the configuration file are the
|
||
|
same as the commands you run on a terminal in your computer.
|
||
|
|
||
|
Once you've added your `.gitlab-ci.yml` configuration file to your
|
||
|
repository, GitLab will detect it and run your scripts with the
|
||
|
tool called [GitLab Runner](https://docs.gitlab.com/runner/), which
|
||
|
works similarly to your terminal.
|
||
|
|
||
|
The scripts are grouped into **jobs**, and together they compose
|
||
|
a **pipeline**. A minimalist example of `.gitlab-ci.yml` file
|
||
|
could contain:
|
||
|
|
||
|
```yml
|
||
|
before_script:
|
||
|
- apt-get install rubygems ruby-dev -y
|
||
|
|
||
|
run-test:
|
||
|
script:
|
||
|
- ruby --version
|
||
|
```
|
||
|
|
||
|
The `before_script` attribute would install the dependencies
|
||
|
for your app before running anything, and a **job** called
|
||
|
`run-test` would print the Ruby version of the current system.
|
||
|
Both of them compose a **pipeline** triggered at every push
|
||
|
to any branch of the repository.
|
||
|
|
||
|
GitLab CI/CD not only executes the jobs you've
|
||
|
set, but also shows you what's happening during execution, as you
|
||
|
would see in your terminal:
|
||
|
|
||
|
![job running](img/job_running.png)
|
||
|
|
||
|
You create the strategy for your app and GitLab runs the pipeline
|
||
|
for you according to what you've defined. Your pipeline status is also
|
||
|
displayed by GitLab:
|
||
|
|
||
|
![pipeline status](img/pipeline_status.png)
|
||
|
|
||
|
At the end, if anything goes wrong, you can easily
|
||
|
[roll back](../environments.md#retrying-and-rolling-back) all the changes:
|
||
|
|
||
|
![rollback button](img/rollback.png)
|
||
|
|
||
|
### Basic CI/CD workflow
|
||
|
|
||
|
This is a very simple example for how GitLab CI/CD fits in a common
|
||
|
development workflow.
|
||
|
|
||
|
Assume that you have discussed a code implementation in an issue
|
||
|
and worked locally on your proposed changes. Once you push your
|
||
|
commits to a feature branch in a remote repository in GitLab,
|
||
|
the CI/CD pipeline set for your project is triggered. By doing
|
||
|
so, GitLab CI/CD:
|
||
|
|
||
|
- Runs automated scripts (sequential or parallel) to:
|
||
|
- Build and test your app.
|
||
|
- Preview the changes per merge request with Review Apps, as you
|
||
|
would see in your `localhost`.
|
||
|
|
||
|
Once you're happy with your implementation:
|
||
|
|
||
|
- Get your code reviewed and approved.
|
||
|
- Merge the feature branch into the default branch.
|
||
|
- GitLab CI/CD deploys your changes automatically to a production environment.
|
||
|
- And finally, you and your team can easily roll it back if something goes wrong.
|
||
|
|
||
|
<img src="img/gitlab_workflow_example_11_9.png" alt="GitLab workflow example" class="image-noshadow">
|
||
|
|
||
|
GitLab CI/CD is capable of a doing a lot more, but this workflow
|
||
|
exemplifies GitLab's ability to track the entire process,
|
||
|
without the need of any external tool to deliver your software.
|
||
|
And, most usefully, you can visualize all the steps through
|
||
|
the GitLab UI.
|
||
|
|
||
|
### Setting up GitLab CI/CD for the first time
|
||
|
|
||
|
To get started with GitLab CI/CD, you need to familiarize yourself
|
||
|
with the [`.gitlab-ci.yml`](../yaml/README.md) configuration file
|
||
|
syntax and with its attributes.
|
||
|
|
||
|
This document [introduces the concepts of GitLab CI/CD in the scope of GitLab Pages](../../user/project/pages/getting_started_part_four.md), for deploying static websites.
|
||
|
Although it's meant for users who want to write their own Pages
|
||
|
script from scratch, it also serves as an introduction to the setup process for GitLab CI/CD.
|
||
|
It covers the very first general steps of writing a CI/CD configuration
|
||
|
file, so we recommend you read through it to understand GitLab's CI/CD
|
||
|
logic, and learn how to write your own script (or tweak an
|
||
|
existing one) for any application.
|
||
|
|
||
|
For a deep view of GitLab's CI/CD configuration options, check the
|
||
|
[`.gitlab-ci.yml` full reference](../yaml/README.md).
|
||
|
|
||
|
### GitLab CI/CD feature set
|
||
|
|
||
|
- Easily set up your app's entire lifecycle with [Auto DevOps](../../topics/autodevops/index.md).
|
||
|
- Deploy static websites with [GitLab Pages](../../user/project/pages/index.md).
|
||
|
- Deploy your app to different [environments](../environments.md).
|
||
|
- Preview changes per merge request with [Review Apps](../review_apps/index.md).
|
||
|
- Develop secure and private Docker images with [Container Registry](../../user/project/container_registry.md).
|
||
|
- Install your own [GitLab Runner](https://docs.gitlab.com/runner/).
|
||
|
- [Schedule pipelines](../../user/project/pipelines/schedules.md).
|
||
|
- Check for app vulnerabilities with [Security Test reports](https://docs.gitlab.com/ee/user/project/merge_requests/#security-reports-ultimate). **[ULTIMATE]**
|
||
|
|
||
|
To see all CI/CD features, navigate back to the [CI/CD index](../README.md).
|