Commit d2293106 authored by William Chia's avatar William Chia 🌴

change CI to CI/CD

parent 7262931d
Pipeline #53705749 canceled with stages
in 7 minutes and 57 seconds
......@@ -7,7 +7,7 @@ categories: engineering
image_title: '/images/blogimages/tm-cover-image-small.jpg'
description: "Ticketmaster Android developer Jeff Kelsey shares why GitLab CI was a game changer for his team."
twitter_image: '/images/blogimages/tm-cover-image-small.jpg'
tags: CI, user stories
tags: CI/CD, user stories
---
It's always been a goal for the Ticketmaster mobile team to get to weekly releases. In the first half of this year we were able to accomplish it, delivering new versions
......
......@@ -6,7 +6,7 @@ author_gitlab: sytses
categories: insights
image_title: '/images/blogimages/whats-next-for-gitlab-ci.jpg'
description: 'GitLab first became the standard for self hosting git with two-thirds of the market, then became the next generation CI system, and the next step is creating Auto DevOps.'
tags: git, DevOps, news, CI
tags: git, DevOps, news, CI/CD
---
GitLab has transformed from offering just version control to becoming the first integrated product for DevOps. With GitLab you can go all the way from chatting about an idea to measuring it in production without spending time on configuring a bunch of tools. The version control part of GitLab is now used by 2/3 of the market that self host Git. The continuous integration (CI) part of GitLab is now the most popular next generation CI system. Today we introduce the future direction of GitLab: Auto DevOps.
......
......@@ -7,7 +7,7 @@ categories: engineering
image_title: '/images/blogimages/dockerizing-review-apps.jpg'
twitter_image: '/images/tweets/dockerizing-gitlab-review-apps.png'
description: "A GitLab user shows us how to deploy Docker containers as a Review App."
tags: user stories, CI
tags: user stories, CI/CD
---
Last year GitLab introduced the [Review Apps](/product/review-apps/) feature. Review Apps are app environments that are created dynamically every time you push a new branch up to GitLab. As a bonus point the app environments are automatically deleted when the branch is deleted. Since we moved to using Docker for quite a few of our projects I was keen on figuring out how to combine Docker and the GitLab Review Apps functionality as the documentation only mentions NGINX as a way to run Review Apps. As it turns out, it is rather simple to deploy Docker containers as a Review App.
......
---
title: "Making CI easier with GitLab"
title: "Making CI/CD easier with GitLab"
author: Rob Ribeiro
author_twitter: azurelogic
guest: True
categories: engineering
image_title: '/images/blogimages/making-ci-easier-with-gitlab.jpg'
description: "The team at Trek10 tries to consider the need for automation and repeatability with everything they do. One team member gives a crash course in GitLab CI and explains how they use it."
tags: CI, user stories
description: "The team at Trek10 tries to consider the need for automation and repeatability with everything they do. One team member gives a crash course in GitLab CI/CD and explains how they use it."
tags: CI/CD, user stories
---
At [Trek10](https://www.trek10.com/), we always try to consider the need for automation and repeatability with everything that we do. That’s why we focus on using tools like CloudFormation, Serverless, and CI, as well as building other tools. Recently, I was tasked with doing various maintenance tasks on a number of internal tools/projects. Some needed upgrades from Node.js 0.10, some needed code fixes, and most needed CI. Today, we’re just going to focus on the CI part.
At [Trek10](https://www.trek10.com/), we always try to consider the need for automation and repeatability with everything that we do. That’s why we focus on using tools like CloudFormation, Serverless, and CI/CD, as well as building other tools. Recently, I was tasked with doing various maintenance tasks on a number of internal tools/projects. Some needed upgrades from Node.js 0.10, some needed code fixes, and most needed CI/CD. Today, we’re just going to focus on the CI/CD part.
<!-- more -->
In spite of my past experience with Jenkins and TeamCity and our team’s experience with AWS (CodePipeline/CodeDeploy), I chose GitLab CI to standardize these projects. The biggest reason for this choice is history. As a project evolves, its CI configuration may change. If you ever need to go back in time, you may have difficulty deploying again. Since GitLab CI is based on a `.gitlab-ci.yml` config file that is committed with the code, as long as a commit built and deployed then, it stands a pretty good chance of building and deploying now. Being able to tweak CI without leaving my editor was an additional bonus.
In spite of my past experience with Jenkins and TeamCity and our team’s experience with AWS (CodePipeline/CodeDeploy), I chose GitLab CI/CD to standardize these projects. The biggest reason for this choice is history. As a project evolves, its CI/CD configuration may change. If you ever need to go back in time, you may have difficulty deploying again. Since GitLab CI/CD is based on a `.gitlab-ci.yml` config file that is committed with the code, as long as a commit built and deployed then, it stands a pretty good chance of building and deploying now. Being able to tweak CI/CD without leaving my editor was an additional bonus.
### Crash course in GitLab CI
### Crash course in GitLab CI/CD
GitLab CI relies on having a `.gitlab-ci.yml` file in the root of your repo. CI for each commit is run against the `.gitlab-ci.yml` that is current for that commit. The fundamental unit of CI for GitLab is a “job”. A job is a construct that runs a bash script against a commit in a particular context. You might have one job to run tests, other jobs to build for staging or production, and other jobs to deploy to particular environments. In the config file, jobs are represented by top level maps (aka “objects”) that are not otherwise “reserved” GitLab CI maps. Examples of reserved top level maps: `image` (Docker image in which your jobs run), `services` (other Docker images that need to run while your jobs run), `before_script` (runs before every `script`), `after_script` (runs after every `script`), `stages` (redefines the stage names and order), `variables` (variables available to all jobs), and `cache` (controls what is cached between CI runs; good for stuff from your package manager).
GitLab CI/CD relies on having a `.gitlab-ci.yml` file in the root of your repo. CI/CD for each commit is run against the `.gitlab-ci.yml` that is current for that commit. The fundamental unit of CI/CD for GitLab is a “job”. A job is a construct that runs a bash script against a commit in a particular context. You might have one job to run tests, other jobs to build for staging or production, and other jobs to deploy to particular environments. In the config file, jobs are represented by top level maps (aka “objects”) that are not otherwise “reserved” GitLab CI/CD maps. Examples of reserved top level maps: `image` (Docker image in which your jobs run), `services` (other Docker images that need to run while your jobs run), `before_script` (runs before every `script`), `after_script` (runs after every `script`), `stages` (redefines the stage names and order), `variables` (variables available to all jobs), and `cache` (controls what is cached between CI/CD runs; good for stuff from your package manager).
Every job must belong to a stage (if left out, `test` is the default). Stages are run in a sequence, and all of the jobs in a stage run with max parallelism available. The default stage sequence is: `build`, `test`, `deploy`. Each job also has `before_script`, `after_script`, `variables`, and `cache`. Defining these at a job level will override the top-level configuration. The most important of these is `variables`, because your variables are what make the production deploy job’s context different from the staging deploy job’s context. `variables` is just a map with a bunch of key value pairs. Variables are consumed with a syntax simiar to bash: `${myVar}`. There are some limitations that you should know:
......@@ -65,9 +65,9 @@ As mentioned before, jobs run a bash script in a context. So every job must have
One more important fact: jobs that start with a period character are disabled, e.g.: `.my_disabled_job`
That should be enough to get us started. You can find more GitLab CI documentation [here](https://docs.gitlab.com/ee/ci/). The most useful bit is the `.gitlab-ci.yml` reference found [here](https://docs.gitlab.com/ee/ci/yaml/README.html).
That should be enough to get us started. You can find more GitLab CIdocumentation [here](https://docs.gitlab.com/ee/ci/). The most useful bit is the `.gitlab-ci.yml` reference found [here](https://docs.gitlab.com/ee/ci/yaml/README.html).
As with any new tool, I got to read and re-read the documentation and make some mistakes getting things right. By the time I was knee-deep in this, I realized there was a need to prevent anyone from having to do this again, myself included. The solution requires two things: a well-designed CI template and a way to get that template into all of your new repositories. Let’s tackle template design next.
As with any new tool, I got to read and re-read the documentation and make some mistakes getting things right. By the time I was knee-deep in this, I realized there was a need to prevent anyone from having to do this again, myself included. The solution requires two things: a well-designed CI/CD template and a way to get that template into all of your new repositories. Let’s tackle template design next.
### Designing a template
......@@ -240,7 +240,7 @@ Notice that we have changed the job names to reflect having multiple regions. In
What’s more useful at this point is that, as long as you have made your script flexible enough, you can now distribute this to your development team as a template. If their project fits the script and configuration perfectly, they should just have to fill in the correct values for the top-level variables and go. For those needing something different, they should hopefully be able to just tweak the script. Now, we just need to solve the problem of making sure that they actually use the template…
### Automatic CI injection with GitLab and AWS Lambda
### Automatic CI/CD injection with GitLab and AWS Lambda
I was inspired by GitHub’s option to select a .gitignore and license during the repo creation process. What if we could have that for CI? Forking GitLab and figuring out how to hack this in did not sound like a quick or easy thing to do. However, after a little research, I found that we could use a system hook to trigger a Lambda that could inject the desired template via the commit API. This part is not as interesting to read about, so we did one better: we have open sourced this tool so you can deploy it in your environment. Check out the repo [here](https://github.com/trek10inc/gitlab-boilerplate-injector). And if you’re looking for someone to help you implement these and other awesome automations and AWS solutions, we would love to talk to you. Feel free to reach out to us at info@trek10.com for more. Thanks for reading!
......
......@@ -6,7 +6,7 @@ categories: engineering
image_title: '/images/blogimages/how-we-use-gitlab-at-nova-scotia.jpg'
twitter_image: '/images/twitter/how-we-use-gitlab-at-nova-scotia-twitter.png'
description: "The Unix operations team at the Province of Nova Scotia decided to implement GitLab for source control and CI/CD. Here's how we started exploring DevOps."
tags: DevOps, CI, workflow
tags: DevOps, CI/CD, workflow
---
In 2015 the Unix operations team at the Province of Nova Scotia decided to implement GitLab for source control and [Continuous Integration and Continuous Deployment](/features/gitlab-ci-cd/). This was the beginning of our foray into DevOps practices. This article describes our automated testing, integration and release of Puppet code.
......
......@@ -7,7 +7,7 @@ categories: engineering
image_title: '/images/blogimages/whats-next-for-gitlab-ci.jpg'
twitter_image: '/images/tweets/automatic-new-mr-tweet.png'
description: "With this script, every time we push a commit, GitLab CI checks if the branch that commit belongs to already has an open MR and, if not, creates one."
tags: CI, user stories
tags: CI/CD, user stories
---
At [fleetster](https://www.fleetster.net/), we have our own instance of [GitLab](https://gitlab.com/) and we rely a lot on [GitLab CI](/features/gitlab-ci-cd/). How could it be otherwise? We are a small team, with a lot of different projects (only in last month, we had more than **13,000 commits** over **25 different projects**, and we are only 10 people – with myself working part time). Automating as many development steps as possible (from build to QA to deploy) is helping us a lot, but sometimes we write some code and then forget about it. This is a disaster! We have some bug fix or some new feature ready, but it is forgotten in some branch somewhere.
......
---
title: "How to use GitLab CI for Vue.js"
title: "How to use GitLab CI/CD for Vue.js"
author: Simon Tarchichi
author_gitlab: kartsims
author_twitter: vuetips
......@@ -7,11 +7,11 @@ categories: engineering
guest: true
image_title: '/images/blogimages/build-test-deploy-vue.jpg'
twitter_image: '/images/tweets/gitlab-ci-vuejs-tweet.png'
description: "Learn how to get the most out of GitLab CI with this guide from VueTips."
tags: CI, user stories
description: "Learn how to get the most out of GitLab CI/CD with this guide from VueTips."
tags: CI/CD, user stories
---
The author of [VueTips.com](http://vuetips.com/) walks through how to use GitLab CI to build, test, and deploy Vue.js apps easily.
The author of [VueTips.com](http://vuetips.com/) walks through how to use GitLab CI/CD to build, test, and deploy Vue.js apps easily.
<!-- more -->
......@@ -27,9 +27,9 @@ GitLab is a service that started as an open-source GitHub competitor, mostly to
Docker has to be mentioned as well. It is the most popular containerization service. It basically means you get to execute code in a secure environment, configured exactly like your dev/prod. Very useful when you need to make sure your code is executed with all its dependencies.
Each of these tools would require many posts to be covered. We’ll focus on setting up CI for your Vue.js project. We’ll assume you have no knowledge in the matter.
Each of these tools would require many posts to be covered. We’ll focus on setting up CI/CD for your Vue.js project. We’ll assume you have no knowledge in the matter.
[GitLab CI is free for personal projects](/gitlab-com/), I don’t know any other tool with such a beautiful UI that does that. If you do, please let me know.
[GitLab CI/CD is free for personal projects](/gitlab-com/), I don’t know any other tool with such a beautiful UI that does that. If you do, please let me know.
### The .gitlab-ci.yml file
......@@ -82,13 +82,13 @@ Now commit and push the `.gitlab-ci.yml` file to your GitLab repo.
Here is how it will look in the Pipelines tab of GitLab UI:
![GitLab CI Pipelines](/images/blogimages/gitlab-ci-pipelines.png){: .shadow}<br>
![GitLab CI/CD Pipelines](/images/blogimages/gitlab-ci-pipelines.png){: .shadow}<br>
The green checkmark indicates that the step has succeeded and you can see the logs when clicking it.
In the second example, the tests have failed, click the red mark to read the logs and understand what went wrong.
![GitLab CI logs](/images/blogimages/gitlab-ci-failed.png){: .shadow}<br>
![GitLab CI/CD logs](/images/blogimages/gitlab-ci-failed.png){: .shadow}<br>
### File anatomy
......@@ -124,12 +124,12 @@ cat id_dsa && rm id_dsa
Then go to GitLab UI “Settings” (the gear icon), then “Variables” and copy/paste the content of your terminal in “Value”. The “Key” should be `SSH_PRIVATE_KEY`. This private key will be used to do the `rsync`.
![GitLab CI variables](/images/blogimages/gitlab-ci-variables.png){: .shadow}<br>
![GitLab CI/CD variables](/images/blogimages/gitlab-ci-variables.png){: .shadow}<br>
## Links
- [Sample GitLab repository](https://gitlab.com/kartsims/vue-ci)
- [Gitlab CI docs](https://docs.gitlab.com/ee/ci/README.html)
- [Gitlab CI/CD docs](https://docs.gitlab.com/ee/ci/README.html)
If you need more information, leave a comment I’ll be happy to help you if I can.
......
......@@ -8,7 +8,7 @@ guest: true
image_title: '/images/blogimages/how-to-create-ci-cd-pipeline-with-autodeploy-to-kubernetes-using-gitlab-and-helm.jpg'
twitter_image: '/images/tweets/auto-deploy-gitlab-helm-tweet.png'
description: "One user walks through how he tried GitLab caching and split the job into multiple steps to get better feedback."
tags: CI, user stories
tags: CI/CD, user stories
---
......
......@@ -7,7 +7,7 @@ categories: engineering
guest: true
image_title: '/images/blogimages/gitbot-automate-git-operations.jpg'
description: "Guest author Kristian Larsson shares how he automates some common Git operations, like rebase, using GitLab CI."
tags: CI, user stories, git
tags: CI/CD, user stories, git
---
Git is super useful for anyone doing a bit of development work or just trying to
......
......@@ -8,7 +8,7 @@ guest: true
image_title: '/images/blogimages/yaml-gitlab-ci-android.png'
twitter_image:
description: "Guest author Renato Stanic shares a sample YAML configuration for Android projects, which helps his team with faster, more iterative development."
tags: CI, user stories
tags: CI/CD, user stories
---
Using continuous integration in our everyday workflow can help us a lot with faster and iterative development, and having CI do checks every time we change our codebase helps us with deal with fear of modifying code.
......
......@@ -7,7 +7,7 @@ image_title: '/images/blogimages/go-tools-and-gitlab.jpg'
description: "How the team at Pantomath makes their lives easier with GitLab CI."
guest: true
twitter_text: "How to do CI like a boss"
tags: CI, user stories
tags: CI/CD, user stories
---
At [Pantomath](https://pantomath.io/), we use [GitLab](/) for all our development work. The purpose of this paper is not to present GitLab and all [its features](/features/), but to introduce how we use these tools to ease our lives. So what is it all about? To automate everything that is related to your development project, and let you focus on your code.
......
......@@ -6,25 +6,25 @@ categories: engineering
image_title: '/images/blogimages/beginners-guide-to-ci.jpg'
description: "Here's how to help everyone on your team, like designers and testers, get started with GitLab CI."
guest: true
twitter_text: "A beginner's guide to CI via @rpadovani"
tags: CI, user stories
twitter_text: "A beginner's guide to CI/CD via @rpadovani"
tags: CI/CD, user stories
---
At [fleetster](https://www.fleetster.net/) we have our own instance of GitLab and we rely a lot on [GitLab CI](/features/gitlab-ci-cd/). Also our designers and QA guys use (and love) it, thanks to its advanced features.
At [fleetster](https://www.fleetster.net/) we have our own instance of GitLab and we rely a lot on [GitLab CI/CD](/features/gitlab-ci-cd/). Also our designers and QA guys use (and love) it, thanks to its advanced features.
<!-- more -->
GitLab CI is a very powerful system of continuous integration, with a lot of different features, and with every new release, new features land. It has very rich [technical documentation](https://docs.gitlab.com/ee/ci/README.html#gitlab-continuous-integration-gitlab-ci-cd), but it lacks a generic introduction for people who want to use it in an existing setup. A designer or a tester doesn’t need to know how to autoscale it with Kubernetes or the difference between an image or a service.
GitLab CI/CD is a very powerful system of continuous integration, with a lot of different features, and with every new release, new features land. It has very rich [technical documentation](https://docs.gitlab.com/ee/ci/README.html#gitlab-continuous-integration-gitlab-ci-cd), but it lacks a generic introduction for people who want to use it in an existing setup. A designer or a tester doesn’t need to know how to autoscale it with Kubernetes or the difference between an image or a service.
But still, he needs to know what a pipeline is, and how to see a branch deployed to an environment. In this article therefore I will try to cover as many features as possible, highlighting how the end users can enjoy them; in the last months I explained such features to some members of our team, also developers: not everyone knows what continuous integration is or has used Gitlab CI in a previous job.
But still, he needs to know what a pipeline is, and how to see a branch deployed to an environment. In this article therefore I will try to cover as many features as possible, highlighting how the end users can enjoy them; in the last months I explained such features to some members of our team, also developers: not everyone knows what continuous integration is or has used Gitlab CI/CD in a previous job.
If you want to know why continuous integration is important I suggest reading [this article](/2015/02/03/7-reasons-why-you-should-be-using-ci/), while for finding the reasons for using Gitlab CI specifically, I leave the job to [GitLab](/features/gitlab-ci-cd/) itself.
If you want to know why continuous integration is important I suggest reading [this article](/2015/02/03/7-reasons-why-you-should-be-using-ci/), while for finding the reasons for using Gitlab CI/CD specifically, I leave the job to [GitLab](/features/gitlab-ci-cd/) itself.
## Introduction
Every time a developer changes some code he saves his changes in a commit. He can then push that commit to GitLab, so other developers can review the code.
GitLab will also start some work on that commit, if GitLab CI has been configured. This work is executed by a runner. A runner is basically a server (it can be a lot of different things, also your PC, but we can simplify it as a server) that executes instructions listed in the `.gitlab-ci.yml` file, and reports the result back to GitLab itself, which will show it in his graphical interface.
GitLab will also start some work on that commit, if GitLab CI/CD has been configured. This work is executed by a runner. A runner is basically a server (it can be a lot of different things, also your PC, but we can simplify it as a server) that executes instructions listed in the `.gitlab-ci.yml` file, and reports the result back to GitLab itself, which will show it in his graphical interface.
When a developer has finished implementing a new feature or a bugfix (activity that usual requires multiple commits), they can open a merge request, where other members of the team can comment on the code and on the implementation.
......
......@@ -6,7 +6,7 @@ categories: engineering
image_title: '/images/blogimages/test-all-the-things-in-gitlab-ci-with-docker-by-example.jpg'
description: "Running tests is easier than you think guest author Gabriel Le Breton shares his presentation about testing everything automatically with GitLab CI/CD."
guest: true
tags: user stories, CI
tags: user stories, CI/CD
---
Do you write tests? Or do you skip them because it’s too complicated to run? Or maybe developers on your team just don’t care? You should take a few minutes and set up CI so you can enforce good practices. Good news, you can test [all the things](http://knowyourmeme.com/memes/all-the-things) automagically in [GitLab CI/CD](/features/gitlab-ci-cd/) with Docker and very little effort 🤘
......
---
title: "Setting up GitLab CI for Android projects"
title: "Setting up GitLab CI/CD for Android projects"
author: Stojan Anastasov
author_twitter: s_anastasov
categories: engineering
image_title: '/images/blogimages/ci-for-android.jpg'
description: "Guest author Stojan Anastasov shares how he switched from Jenkins and Fabric to GitLab CI/CD."
guest: true
tags: CI, user stories
tags: CI/CD, user stories
---
Note: Below is an older post. Read our latest blog post on [setting up GitLab CI for Android apps](/2018/10/24/setting-up-gitlab-ci-for-android-projects/) for the most up-to-date instructions.
Note: Below is an older post. Read our latest blog post on [setting up GitLab CI/CD for Android apps](/2018/10/24/setting-up-gitlab-ci-for-android-projects/) for the most up-to-date instructions.
{: .alert .alert-info}
My first experience with continuous integration was using Bitbucket in combination with [Jenkins](https://jenkins.io/). I was pretty happy with my setup. Jenkins would run on every commit: making sure my code compiles, run Android Lint and run my unit tests. I also set up continuous deployment using [Fabric](https://get.fabric.io/). Now, at work, we use GitLab as a code repository. GitLab also offers [continuous integration](/features/gitlab-ci-cd/). When we decided to start using continuous integration at work we decided to give GitLab a chance.
......@@ -20,11 +20,11 @@ My first experience with continuous integration was using Bitbucket in combinati
It was already integrated with GitLab and to use it we just needed to install a [runner](https://docs.gitlab.com/runner/).
Using CI with GitLab is simple, after you install a runner you need to add a `.gitlab-ci.yml` file at the root of the repository. GitLab even offers template `.gitlab-ci.yml` files for various languages and frameworks. The Android template is based on [this blog post](/2016/11/30/setting-up-gitlab-ci-for-android-projects/) from 2016. It is a great guide but unfortunately today it doesn’t work. Google introduced a few changes in the command line tools.
Using CI/CD with GitLab is simple, after you install a runner you need to add a `.gitlab-ci.yml` file at the root of the repository. GitLab even offers template `.gitlab-ci.yml` files for various languages and frameworks. The Android template is based on [this blog post](/2016/11/30/setting-up-gitlab-ci-for-android-projects/) from 2016. It is a great guide but unfortunately today it doesn’t work. Google introduced a few changes in the command line tools.
## Installing Android SDK
To install the Android SDK on a CI we need to install the [command line tools](https://developer.android.com/studio/index.html#downloads) (scroll to the bottom to get just the command line tools). The command line tools include the [sdkmanager](https://developer.android.com/studio/command-line/sdkmanager.html) – a command line tool that allows you to view, install, update, and uninstall packages for the Android SDK. So instead of
To install the Android SDK on a CI/CD we need to install the [command line tools](https://developer.android.com/studio/index.html#downloads) (scroll to the bottom to get just the command line tools). The command line tools include the [sdkmanager](https://developer.android.com/studio/command-line/sdkmanager.html) – a command line tool that allows you to view, install, update, and uninstall packages for the Android SDK. So instead of
```
- wget --quiet --output-document=android-sdk.tgz https://dl.google.com/android/android-sdk_r${ANDROID_SDK_TOOLS}-linux.tgz
......@@ -38,7 +38,7 @@ we can use
to download and install the Android SDK tools.
There is also an improvement in accepting licenses for the Android SDK. After you accept the licenses on your development machine the tools will generate a licenses folder in the Android SDK root directory. You can accept the licences for all Android SDK components by running ```sdkmanager --licenses``` on your development machine. You can transfer the licenses from your development machine to your CI server. To accept the licenses on the CI server you can use:
There is also an improvement in accepting licenses for the Android SDK. After you accept the licenses on your development machine the tools will generate a licenses folder in the Android SDK root directory. You can accept the licences for all Android SDK components by running ```sdkmanager --licenses``` on your development machine. You can transfer the licenses from your development machine to your CI/CD server. To accept the licenses on the CI/CD server you can use:
```
- mkdir android-sdk-linux/licenses
......@@ -59,7 +59,7 @@ A sample project based on the [Android Testing codelab](https://codelabs.develop
Stojan Anastasov is a pragmatic developer with four years' experience in building native apps for Android. Now working at [Cosmic Development](http://www.cosmicdevelopment.com/), he previously worked on the Claxi app at Bransys. You can find him on [Stack Overflow](https://stackoverflow.com/) in the `android` and `rxjava` tags.
*[Setting up GitLab CI for Android projects](https://dev.to/s_anastasov/setting-up-gitlab-ci-for-android-projects-a6o) was originally published on dev.to.*
*[Setting up GitLab CI/CD for Android projects](https://dev.to/s_anastasov/setting-up-gitlab-ci-for-android-projects-a6o) was originally published on dev.to.*
Cover image by [Jamison McAndie](https://unsplash.com/photos/uf4oyaimWwg) on [Unsplash](https://unsplash.com/search/photos/pipeline)
{: .note}
......@@ -5,7 +5,7 @@ author_twitter: j4lenn
categories: engineering
image_title: '/images/blogimages/setting-up-gitlab-ci-for-android-projects/banner.jpg'
description: "Learn how to set up GitLab CI to ensure your Android app compiles and passes tests."
tags: CI, user stories
tags: CI/CD, user stories
postType: content marketing
ee_cta: false
---
......
......@@ -4,7 +4,7 @@ author: Fabio Busatto
author_gitlab: bikebilly
author_twitter: gitlab
categories: engineering
tags: CI
tags: CI/CD
just_commit_button_text: 'Join us for a <strong>GitLab + Cloud Native</strong> webcast!'
just_commit_button_link: '/webcast/cloud-native-transformation/'
image_title: '/images/blogimages/multi-project-pipelines.jpg'
......
......@@ -6,7 +6,7 @@ guest: true
categories: open source
image_title: '/images/blogimages/sentry-io-blog.jpg'
description: "Your code has bugs, my code has bugs, everyone’s code has bugs (probably). Let’s fix that."
tags: CI, collaboration, DevOps, integrations, open source, security, testing, user stories, workflow
tags: CI/CD, collaboration, DevOps, integrations, open source, security, testing, user stories, workflow
postType: product
twitter_text: "Streamline and shorten error remediation with @getsentry's new @gitlab integration"
---
......
......@@ -5,7 +5,7 @@ author_twitter: j4lenn
categories: engineering
image_title: '/images/blogimages/android-fastlane-pipeline.png'
description: "See how GitLab, together with fastlane, can build, sign, and publish apps for Android to the Google Play Store."
tags: CI, integrations, google, features
tags: CI/CD, integrations, google, features
postType: product
ee_cta: false
twitter_text: "How to publish @android apps to the @googleplay Store with @gitlab and @FastlaneTools"
......@@ -38,7 +38,7 @@ source "https://rubygems.org"
gem "fastlane"
```
Once your Gemfile is updated, you can run `bundle update` to update/generate your `Gemfile.lock`. From this point you can run _fastlane_ by typing `bundle exec fastlane`. Later, you'll see that in CI we use `bundle install ...` to ensure the command runs within the context of our project environment.
Once your Gemfile is updated, you can run `bundle update` to update/generate your `Gemfile.lock`. From this point you can run _fastlane_ by typing `bundle exec fastlane`. Later, you'll see that in CI/CD we use `bundle install ...` to ensure the command runs within the context of our project environment.
Now that we have _fastlane_ ready to run, we just need to initialize our repo with our configuration. Run `bundle exec fastlane init` from within your project directory, answer a few questions, and _fastlane_ will create a new `./fastlane` directory containing its configuration.
......@@ -52,7 +52,7 @@ Once you've set this up, simply run `bundle exec fastlane supply init` and all y
### Appfile
The `./fastlane/Appfile` is pretty straightforward, and contains basic configuration you chose when you initialized your project. Later we'll see how to inject the `json_key_file` in your CI pipeline at runtime.
The `./fastlane/Appfile` is pretty straightforward, and contains basic configuration you chose when you initialized your project. Later we'll see how to inject the `json_key_file` in your CI/CD pipeline at runtime.
`./fastlane/Appfile`
``` yaml
......@@ -152,7 +152,7 @@ else {
### Automatic versioning
We also set up automatic versioning using environment variables `VERSION_CODE`, `VERSION_SHA`, which we will set up later in CI (locally they will just be `null` which is fine). Because each build's `versionCode` that you submit to the Google Play Store needs to be higher than the last, this makes it simple to deal with.
We also set up automatic versioning using environment variables `VERSION_CODE`, `VERSION_SHA`, which we will set up later in CI/CD (locally they will just be `null` which is fine). Because each build's `versionCode` that you submit to the Google Play Store needs to be higher than the last, this makes it simple to deal with.
`app/build.gradle`
``` groovy
......@@ -356,7 +356,7 @@ Next, we automatically generate a changelog to include by copying whatever you h
# Make the changelog
- cp ./fastlane/metadata/android/en-GB/changelogs/CURRENT_VERSION.txt "./fastlane/metadata/android/en-GB/changelogs/$VERSION_CODE.txt"
# We allow the remote push and MR creation to fail because the other job could create it
# and it's not strictly necessary (we just need the file locally for the CI build)
# and it's not strictly necessary (we just need the file locally for the CI/CD build)
- ./ci-scripts/create-changlog-mr.sh || true
# Because we allow the MR creation to fail, just make sure we are back in the right repo state
- git checkout "$CI_COMMIT_SHA"
......
---
title: "How to set up multi-account AWS SAM deployments with GitLab CI"
title: "How to set up multi-account AWS SAM deployments with GitLab CI/CD"
author: Forrest Brazeal
author_gitlab: fbrazeal
author_twitter: forrestbrazeal
categories: engineering
image_title: "/images/blogimages/gitlab-aws-cover.png"
description: "Our guest author, an AWS Serverless hero, shares how to automate SAM deployments using GitLab CI/CD."
tags: CI, demo, integrations, open source, production, user stories
tags: CI/CD, demo, integrations, open source, production, user stories
guest: true
ee_cta: false
twitter_text: "How to set up multi-account @awcloud SAM deployments with @gitlab CI"
twitter_text: "How to set up multi-account @awcloud SAM deployments with @gitlab CI/CD"
---
I've been working with serverless applications in AWS for about three years – that makes me an old salt in serverless terms! So I know that deploying and maintaining a serverless app can be tricky; the tooling often has critical gaps.
......@@ -18,12 +18,12 @@ AWS's [SAM (Serverless Application Model)](https://aws.amazon.com/serverless/sam
You need CI/CD.
I've used several different CI systems to automate SAM deployments, and I always look for the following features:
I've used several different CI/CD systems to automate SAM deployments, and I always look for the following features:
- A single deployment pipeline that can build once and securely deploy to multiple AWS accounts (dev, staging, prod).
- Dynamic feature branch deployments, so serverless devs can collaborate in the cloud without stepping on each other.
- Automated cleanup of feature deployments.
- Review of our SAM application directly integrated with the CI tool's user interface.
- Review of our SAM application directly integrated with the CI/CD tool's user interface.
- Manual confirmation before code is released into production.
In this post, we'll find out how [GitLab CI](/product/continuous-integration/) can check these boxes on its way to delivering effective CI/CD for AWS SAM. You can follow along using [the official example code, available here](https://gitlab.com/gitlab-examples/aws-sam).
......@@ -43,18 +43,18 @@ You can use existing AWS accounts if you have them, or [provision new ones under
Run the following AWS CLI call with admin credentials in each of the three accounts:
```
aws cloudformation deploy --stack-name GitLabCIRoles --template-file setup-templates/roles.yml --capabilities CAPABILITY_NAMED_IAM --parameter-overrides CIAccountID="<AWS Account ID where your GitLab CI runner lives>" CIAccountSTSCondition="<The aws:userid for the IAM principal used by the Gitlab runner>"
aws cloudformation deploy --stack-name GitLabCIRoles --template-file setup-templates/roles.yml --capabilities CAPABILITY_NAMED_IAM --parameter-overrides CIAccountID="<AWS Account ID where your GitLab CI/CD runner lives>" CIAccountSTSCondition="<The aws:userid for the IAM principal used by the Gitlab runner>"
```
Replace `CIAccountID` and `CIAccountSTSCondition` as indicated with values from the AWS account where your GitLab CI runner exists. (Need help finding the `aws:userid` for your runner’s IAM principal? Check out [this guide](see https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_variables.html#principaltable).)
Replace `CIAccountID` and `CIAccountSTSCondition` as indicated with values from the AWS account where your GitLab CI/CD runner exists. (Need help finding the `aws:userid` for your runner’s IAM principal? Check out [this guide](see https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_variables.html#principaltable).)
This CloudFormation template defines two roles: `SharedServiceRole` and `SharedDeploymentRole`. The `SharedServiceRole` is assumed by the GitLab CI runner when calling the AWS CloudFormation service. This role trusts the GitLab CI runner's role. It has permissions to call the CloudFormation service, pass a role via IAM, and access S3 and CloudFront: nothing else. This role is not privileged enough to do arbitrary AWS deployments on its own.
This CloudFormation template defines two roles: `SharedServiceRole` and `SharedDeploymentRole`. The `SharedServiceRole` is assumed by the GitLab CI/CD runner when calling the AWS CloudFormation service. This role trusts the GitLab CI/CD runner's role. It has permissions to call the CloudFormation service, pass a role via IAM, and access S3 and CloudFront: nothing else. This role is not privileged enough to do arbitrary AWS deployments on its own.
The `SharedDeploymentRole`, on the other hand, has full administrative access to perform any AWS action. A such, it cannot be assumed directly by the GitLab CI runner. Instead, this role must be "passed" to CloudFormation using the service's `RoleArn` parameter. The CloudFormation service trusts the `SharedDeploymentRole` and can use it to deploy whatever resources are needed as part of the pipeline.
The `SharedDeploymentRole`, on the other hand, has full administrative access to perform any AWS action. A such, it cannot be assumed directly by the GitLab CI/CD runner. Instead, this role must be "passed" to CloudFormation using the service's `RoleArn` parameter. The CloudFormation service trusts the `SharedDeploymentRole` and can use it to deploy whatever resources are needed as part of the pipeline.
### 3\. Create an S3 bucket for CI artifacts
Grab the AWS account ID for each of your development, staging, and production accounts, then deploy this CloudFormation template **in the account where your GitLab CI Runner exists**:
Grab the AWS account ID for each of your development, staging, and production accounts, then deploy this CloudFormation template **in the account where your GitLab CI/CD Runner exists**:
`aws cloudformation deploy --stack-name GitLabCIBucket --template-file setup-templates/ci-bucket.yml --parameter-overrides DevAwsAccountId="<AWS Account ID for dev>" StagingAwsAccountId="<AWS Account ID for staging>" ProdAwsAccountId="<AWS Account ID for prod>" ArtifactBucketName="<A unique name for your bucket>"`
......@@ -65,11 +65,11 @@ We have provided the script `assume-role.sh`, which will assume the provided rol
## Single deployment pipeline
That brings us to the `.gitlab-ci.yml` file you can see at the root of our example repository. GitLab CI is smart enough to dynamically create and execute the pipeline based on that template when we push code to GitLab. The file has a number of variables at the top that you can tweak based on your environment specifics.
That brings us to the `.gitlab-ci.yml` file you can see at the root of our example repository. GitLab CI/CD is smart enough to dynamically create and execute the pipeline based on that template when we push code to GitLab. The file has a number of variables at the top that you can tweak based on your environment specifics.
### Stages
Our Gitlab CI pipeline contains seven possible stages, defined as follows:
Our Gitlab CI/CD pipeline contains seven possible stages, defined as follows:
![Multi-account AWS SAM deployment model with GitLab CI](/images/blogimages/multi-account-aws-sam/deployment-model.png){: .shadow.medium.center}
......@@ -110,7 +110,7 @@ test:unit:
python -m pytest --ignore=functions/
```
Every GitLab CI job runs a script. Here, we install any dependencies, then execute Python unit tests.
Every GitLab CI/CD job runs a script. Here, we install any dependencies, then execute Python unit tests.
##### Dependency scans
......@@ -177,7 +177,7 @@ deploy:dev:
- master
```
The link specified in the `url` field of the `environment` property will be accessible in the `Environments` section of GitLab CI or on any merge request of the associated branch. (In the case of the sample SAM application provided with our example, since we don't have a front end to view, the link just takes you to a GET request for the `/services` API endpoint and should display some raw JSON in your browser.)
The link specified in the `url` field of the `environment` property will be accessible in the `Environments` section of GitLab CI/CD or on any merge request of the associated branch. (In the case of the sample SAM application provided with our example, since we don't have a front end to view, the link just takes you to a GET request for the `/services` API endpoint and should display some raw JSON in your browser.)
![Link to live environment](/images/blogimages/multi-account-aws-sam/link-live-environment.png){: .shadow.medium.center}
......@@ -212,7 +212,7 @@ When a change is merged into the master branch, the code is built, tested (inclu
![Staging environment](/images/blogimages/multi-account-aws-sam/staging-environment.png){: .shadow.medium.center}
After deploying code to the staging environment, the pipeline will create a change set for the production stack, and then pause for a manual intervention. A human user must click a button in the Gitlab CI "Environments" view to execute the final change set.
After deploying code to the staging environment, the pipeline will create a change set for the production stack, and then pause for a manual intervention. A human user must click a button in the Gitlab CI/CD "Environments" view to execute the final change set.
## Now what?
......@@ -222,7 +222,7 @@ The next step is to try this on your own. If you'd like to start with our sample
## Further reading
We have barely scratched the surface of GitLab CI and AWS SAM in this post. Here are some interesting readings if you would like to take your work to the next level:
We have barely scratched the surface of GitLab CI/CD and AWS SAM in this post. Here are some interesting readings if you would like to take your work to the next level:
### SAM
......
......@@ -6,7 +6,7 @@ author_twitter: GitLab
categories: open source
image_title: '/images/blogimages/verizon_video_blog.jpg'
description: "Verizon utilized microservices, automation, and GitLab to reduce datacenter deploys to under 8 hours. "
tags: CI, DevOps, user stories, workflow
tags: CI/CD, DevOps, user stories, workflow
cta_button_text: 'Watch the <strong>customer story</strong> video' # optional
cta_button_link: 'https://youtu.be/zxMFaw5j6Zs' # optional
twitter_text: ".@verizonconnect reduces datacenter deploys from 30 days to under 8 hours"
......
......@@ -6,61 +6,61 @@ author_twitter: sytses
categories: company
image_title: '/images/blogimages/consolidate.jpg'
description: "The DevOps industry is consolidating. GitLab is here to stay."
tags: news, CI
tags: news, CI/CD
twitter_text: "The DevOps industry is consolidating. GitLab is here to stay."
featured: yes
featured: yes
postType: corporate
---
Since the beginning of the year, we’ve seen consolidation in the DevOps industry.
In January, we saw that [Travis CI was acquired by Idera](https://techcrunch.com/2019/01/23/idera-acquires-travis-ci/)
and today we saw [Shippable acquired by JFrog](https://techcrunch.com/2019/02/21/jfrog-acquires-shippable-adding-continuous-integration-and-delivery-to-its-devops-platform/).
Continuous integration is a key part of a developer’s workflow and important for
getting your code to market quickly. As enterprises continue to go cloud-native,
CI/CD is a key part of [delivering innovative software products](https://about.gitlab.com/just-commit/application-modernization/)
to market and staying ahead of competition.
Since the beginning of the year, we’ve seen consolidation in the DevOps industry.
In January, we saw that [Travis CI was acquired by Idera](https://techcrunch.com/2019/01/23/idera-acquires-travis-ci/)
and today we saw [Shippable acquired by JFrog](https://techcrunch.com/2019/02/21/jfrog-acquires-shippable-adding-continuous-integration-and-delivery-to-its-devops-platform/).
Continuous integration is a key part of a developer’s workflow and important for
getting your code to market quickly. As enterprises continue to go cloud-native,
CI/CD is a key part of [delivering innovative software products](https://about.gitlab.com/just-commit/application-modernization/)
to market and staying ahead of competition.
Most technology markets go through stages as they mature. When a young technology
is first becoming popular, there tends to be an explosion of tools to support it.
New technologies have a lot of rough edges that make them difficult to use and
early tools tend to center around making the experience easier to adopt and use.
Once a technology matures, tool consolidation is a natural part of the life cycle.
Most technology markets go through stages as they mature. When a young technology
is first becoming popular, there tends to be an explosion of tools to support it.
New technologies have a lot of rough edges that make them difficult to use and
early tools tend to center around making the experience easier to adopt and use.
Once a technology matures, tool consolidation is a natural part of the life cycle.
## Partnering on CI
With consolidation, it’s no secret that people get nervous about the partner they
With consolidation, it’s no secret that people get nervous about the partner they
are choosing as their CI backbone.
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Where should OSS projects move to if currently using <a href="https://twitter.com/travisci?ref_src=twsrc%5Etfw">@travisci</a>? <a href="https://t.co/TZJF80T1X9">https://t.co/TZJF80T1X9</a></p>&mdash; Carl DB (@carllerche) <a href="https://twitter.com/carllerche/status/1098669954759516162?ref_src=twsrc%5Etfw">February 21, 2019</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Here at GitLab, our users are first and foremost in mind. We’re not going anywhere.
In fact, we continue to build out our [leadership team](https://www.businessinsider.com/gitlab-cmo-cro-ipo-2019-2) and have stated publicly,
many times over, that we’re on the road to IPO by November 2020. So we invite you
to [try out GitLab](https://gitlab.com/users/sign_in#register-pane).
Here at GitLab, our users are first and foremost in mind. We’re not going anywhere.
In fact, we continue to build out our [leadership team](https://www.businessinsider.com/gitlab-cmo-cro-ipo-2019-2) and have stated publicly,
many times over, that we’re on the road to IPO by November 2020. So we invite you
to [try out GitLab](https://gitlab.com/users/sign_in#register-pane).
## We make it easy - GitLab CI/CD for GitHub
So no matter where you store your code, we can help. If you host your code on
GitHub, you can build, test, and deploy all on GitLab. You can follow along in
the video below or learn more [here](https://about.gitlab.com/solutions/github/) or follow the documentation [here](https://docs.gitlab.com/ee/ci/ci_cd_for_external_repos/github_integration.html).
So no matter where you store your code, we can help. If you host your code on
GitHub, you can build, test, and deploy all on GitLab. You can follow along in
the video below or learn more [here](https://about.gitlab.com/solutions/github/) or follow the documentation [here](https://docs.gitlab.com/ee/ci/ci_cd_for_external_repos/github_integration.html).
<iframe width="560" height="315" src="https://www.youtube.com/embed/qgl3F2j-1cI" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
And if you’d like to try using GitLab end-to-end from planning to product monitoring,
we make it easy to move your code over to GitLab and use a single application for
your developer workflow.
And if you’d like to try using GitLab end-to-end from planning to product monitoring,
we make it easy to move your code over to GitLab and use a single application for
your developer workflow.
<iframe width="560" height="315" src="https://www.youtube.com/embed/VYOXuOg9tQI" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
## #TravisAlums - GitLab is hiring
Lastly if you’re a Travis Alum, first off thank you for your work on advancing the industry forward.
Lastly if you’re a Travis Alum, first off thank you for your work on advancing the industry forward.
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Can I ask a favor? Given the recent news I&#39;ve been sharing about Travis CI&#39;s recent layoffs, and your overwhelming support in my DMs, if you used Travis and are looking to hire, can you tweet using the hashtag <a href="https://twitter.com/hashtag/travisAlums?src=hash&amp;ref_src=twsrc%5Etfw">#travisAlums</a> ?</p>&mdash; Carmen Hernández Andoh (@carmatrocity) <a href="https://twitter.com/carmatrocity/status/1098583889864478720?ref_src=twsrc%5Etfw">February 21, 2019</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
We know that with any acquisition there are always folks who will find a good home
in their new parent company and folks for whom the new situation will no longer
be a good fit. We hope for the former, but if you are looking for a [new opportunity](https://about.gitlab.com/jobs/),
we believe we have a great team of folks and are working on some of the most
exciting challenges in this space.
\ No newline at end of file
We know that with any acquisition there are always folks who will find a good home
in their new parent company and folks for whom the new situation will no longer
be a good fit. We hope for the former, but if you are looking for a [new opportunity](https://about.gitlab.com/jobs/),
we believe we have a great team of folks and are working on some of the most
exciting challenges in this space.
\ No newline at end of file
......@@ -6,7 +6,7 @@ author_twitter: EricaLindberg_
categories: insights
image_title: '/images/blogimages/just-commit-blog-cover.png'
description: "How to overcome analysis paralysis and take your digital transformation efforts from theory to practice."
tags: agile, CI, DevOps
tags: agile, CI/CD, DevOps
cta_button_text: 'Just commit'
cta_button_link: '/just-commit/application-modernization/'
ee_cta: false
......@@ -62,4 +62,4 @@ Start with a single application and document how a change goes from idea all the
Finally, the end goal is to enable teams with fully automated CI/CD pipelines so developers can get their code to production faster. Taking both a cultural and technological approach to change is needed to adopt DevOps methodology.
Are you ready to commit to your digital transformation journey? [Get inspired and learn how Ask Media Group modernized their architecture and development with microservices, containers, and kubernetes](/webcast/cloud-native-transformation/).
Are you ready to commit to your digital transformation journey? [Get inspired and learn how Ask Media Group modernized their architecture and development with microservices, containers, and kubernetes](/webcast/cloud-native-transformation/).
......@@ -5,7 +5,7 @@ author_twitter: gitlab
categories: company
image_title: '/images/blogimages/gitlab-digitalocean-cover.jpg'
description: "Now you can skip the complexity of installation and get up and running with GitLab in just one click."
tags: cloud, kubernetes, CI, collaboration, DevOps, integrations, open source, security, testing, user stories, workflow
tags: cloud, kubernetes, CI/CD, collaboration, DevOps, integrations, open source, security, testing, user stories, workflow
postType: product
twitter_text: "Announcing @gitlab's 1-Click App on @digitalocean Marketplace"
---
......
......@@ -5,7 +5,7 @@ author_twitter: j4lenn
categories: engineering
image_title: '/images/blogimages/ios-publishing-cover.jpg'
description: "See how GitLab, together with fastlane, can build, sign, and publish apps for iOS to the App Store."
tags: CI, integrations, features
tags: CI/CD, integrations, features
postType: product
ee_cta: false
twitter_text: "How to publish #ios apps to the @appstore with @gitlab and @FastlaneTools"
......@@ -75,7 +75,7 @@ approach](https://docs.fastlane.tools/codesigning/getting-started/#using-match)
## Setting up GitLab and _fastlane_
### Setting up your CI runner
### Setting up your CI/CD runner
With the above information gathered or set up, we can start with configuring the
GitLab runner on a MacOS device. Unfortunately, building on MacOS is the only
......@@ -109,7 +109,7 @@ What you need to be careful about here is ensuring your Apple keychain is set up
on this host and has access to the keys that Xcode needs in order
to build. The easiest way to test this is to log in as the user that will be
running the build and try to build manually. You may receive system prompts for
keychain access which you need to "always allow" for CI to work. You will probably
keychain access which you need to "always allow" for CI/CD to work. You will probably
also want to log in and watch your first pipeline or two to make sure that
no prompts come up for additional keychain access. Unfortunately Apple does not
make this super easy to use in unattended mode, but once you have it working it
......@@ -188,7 +188,7 @@ output_directory("./")
### Our `.gitlab-ci.yml`
Now, we have a CI runner associated with our project so we're ready to try a
Now, we have a CI/CD runner associated with our project so we're ready to try a
pipeline. Let's see what's in our `.gitlab-ci.yml`:
```yaml
......@@ -253,7 +253,7 @@ to my [simple demo app](https://gitlab.com/jlenny/flappyokr).
Hopefully this has been helpful and has inspired you to get iOS builds and
publishing working within your GitLab project. There is some good additional
[CI best-practice](https://docs.fastlane.tools/best-practices/continuous-integration/)
[CI/CD best-practice](https://docs.fastlane.tools/best-practices/continuous-integration/)
documentation for _fastlane_ if you get stuck anywhere,
and you could also consider using the `CI_BUILD_ID` (which increments each build)
to [automatically increment a version](https://docs.fastlane.tools/best-practices/continuous-integration/gitlab/#auto-incremented-build-number).
......
......@@ -5,7 +5,7 @@ author_gitlab: smcgivern
categories: engineering
image_title: "/images/blogimages/automate-retrospectives.jpg"
description: "How one engineering team is using GitLab CI to automate asynchronous retrospectives, making collaboration across four continents a breeze."
tags: CI, collaboration, inside GitLab, workflow
tags: CI/CD, collaboration, inside GitLab, workflow
ee_cta: false # required only if you do not want to display the EE-trial banner