логотип PurpleSchool
логотип PurpleSchool

Автоматизация Golang проектов — CI/CD с GitLab CI и Jenkins

Автор

Александр Гольцман

Автоматизация сборки и развертывания играет ключевую роль в разработке современных приложений, включая проекты на Go. Использование CI/CD (Continuous Integration / Continuous Deployment) позволяет сократить время на тестирование, уменьшить количество ошибок при развертывании и ускорить выпуск новых версий. В этой статье я покажу, как настроить CI/CD для Go-проектов с помощью GitLab CI и Jenkins, а также объясню ключевые принципы автоматизации.

Почему CI/CD важен для Go-проектов?

Прежде чем перейти к настройке, давайте разберёмся, зачем нужна CI/CD-платформа в разработке на Go.

  1. Автоматизация тестирования. Go имеет встроенную систему тестирования, и CI позволяет запускать тесты автоматически при каждом изменении кода.
  2. Единообразие сборок. Автоматическая сборка гарантирует, что все версии приложения создаются одинаково, без зависимости от локальной среды разработчика.
  3. Быстрое развертывание. CI/CD позволяет автоматически выкатывать новые версии без ручного вмешательства.
  4. Лёгкость интеграции. GitLab CI и Jenkins поддерживают работу с Docker, Kubernetes и облачными платформами, что делает их удобными инструментами для Go-разработки.

Теперь давайте разберёмся, как настроить GitLab CI и Jenkins для автоматизации Go-проекта.

Настройка CI/CD с GitLab CI

GitLab CI/CD встроен в экосистему GitLab и позволяет легко автоматизировать процесс сборки, тестирования и развертывания.

Конфигурация .gitlab-ci.yml

Смотрите, в корне вашего репозитория нужно создать файл .gitlab-ci.yml, который определяет, как будет выполняться процесс CI/CD.

Простейший .gitlab-ci.yml для Go-проекта выглядит так:

stages:
  - build
  - test

build:
  stage: build
  image: golang:1.20
  script:
    - go mod tidy
    - go build -o myapp .

test:
  stage: test
  image: golang:1.20
  script:
    - go test ./...

Здесь я разместил две стадии:

  • build — сборка проекта;
  • test — запуск тестов.

Этот файл GitLab CI автоматически выполнит сборку и тестирование приложения при каждом коммите.

Добавление Docker и развертывания

Если нужно развернуть приложение в Docker, добавьте стадию деплоя:

deploy:
  stage: deploy
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker build -t my-dockerhub-user/myapp:latest .
    - docker push my-dockerhub-user/myapp:latest
  only:
    - main

Теперь при каждом изменении в main-ветке будет собираться Docker-образ и загружаться в реестр.

Автоматизация с Jenkins

Jenkins — это гибкий инструмент для CI/CD, который позволяет создавать сложные пайплайны.

Установка и запуск Jenkins

Если у вас Jenkins ещё не установлен, можно развернуть его через Docker:

docker run -d -p 8080:8080 --name jenkins jenkins/jenkins:lts

После этого зайдите в браузер по http://localhost:8080, настройте Jenkins и установите нужные плагины.

Создание пайплайна

В Jenkins можно использовать файлы Jenkinsfile для определения процессов CI/CD. Вот пример для Go-проекта:

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                sh 'go mod tidy'
                sh 'go build -o myapp .'
            }
        }
        stage('Test') {
            steps {
                sh 'go test ./...'
            }
        }
        stage('Deploy') {
            steps {
                sh 'docker build -t my-dockerhub-user/myapp:latest .'
                sh 'docker push my-dockerhub-user/myapp:latest'
            }
        }
    }
}

Этот Jenkinsfile выполняет сборку, тестирование и загрузку Docker-образа.

Запуск пайплайна

Добавьте Jenkinsfile в репозиторий, создайте новую задачу в Jenkins и настройте её на отслеживание изменений в репозитории. После этого при каждом коммите Jenkins будет автоматически запускать процесс CI/CD.

Заключение

Автоматизация CI/CD для Go-проектов значительно упрощает процесс разработки и развертывания. В этой статье я показал, как использовать GitLab CI и Jenkins для автоматизации сборки, тестирования и развертывания приложений.

Если вам нужен быстрый и простой вариант, GitLab CI подойдёт лучше. Если же требуется больше контроля и гибкости, Jenkins станет хорошим выбором. В любом случае, автоматизация CI/CD поможет вам ускорить процесс разработки и минимизировать риски ошибок при развертывании.

Стрелочка влевоКоманда go build в GolangОтладка кода в GolangСтрелочка вправо

Все гайды по Golang

Работа с YAML в GolangПреобразование типов в GolangКонвертация структур в JSON в GolangStrconv в GolangИспользование пакета SQLx для работы с базами данных в GolangРазбираемся с SQL в GolangРазделение строк с помощью функции split в GolangSort в GoПоиск и замена строк в Go - GolangИспользование пакета reflect в GolangРабота с PostgreSQL в GoPointers в GolangПарсинг в GoРабота со списками (list) в GolangПреобразование int в string в GolangРабота с числами с плавающей точкой в GolangРабота с полями в GolangИспользование enum в GolangОбработка JSON в GoЧтение и запись CSV-файлов в GolangРабота с cookie в GolangРегистры в GoКэширование данных в GolangПреобразование byte в string в GolangByte в GoИспользование bufio для работы с потоками данных в GolangДобавление данных и элементов (add) в Go
Логирование в Golang. Zap, Logrus, Loki, GrafanaРабота с Docker-контейнерами в GoИспользование pprof в GolangМеханизмы синхронизации в GolangРабота с пакетом S3 в GolangМониторинг Golang приложений с помощью PrometheusОптимизация проектов на GoПаттерны проектирования в GolangМиграции базы данных в GolangОркестрация контейнеров Go с Kubernetes + DockerGjGo Playground и компилятор GolangИспользование go mod init для создания модулей GolangРабота с переменными окружения (env) в GolangКоманда go build в GolangАвтоматизация Golang проектов — CI/CD с GitLab CI и JenkinsОтладка кода в GolangЧтение и использование конфигурации в приложениях на GolangКомпиляция в GolangКак развернуть Go-приложение на облаке AWSАутентификация в Golang
Сетевые протоколы в GoПеременные в GolangЗначения в GolangДженерик %T и его применение в GolangТипы данных в GolangИспользование tls в GolangИспользование tag в структурах GolangSwitch в GoСтроки в GolangРабота с потоками (stream) в GolangSelect в GoРуны в GoРабота с пакетом params в GolangКонвертация строк в числа в GolangNull, Nil, None, 0 в GoНаименования переменных, функций и структур в GoInt в GolangУстановка GolangЧтение и установка HTTP заголовков в GolangMethods в GolangGoLand — IDE для разработки на Golang от JetBrainsОбработка «not found» в GolangFloat в GolangФлаги командной строки в Go (Golang)Запуск внешних команд в GolangОбработка ошибок в GoИспользование defer в GolangЗначения default в GolangГенерация кода в GoФорматирование кода в GolangЧистая архитектура в GolangКаналы (channels) в GolangПолучение body из HTTP запроса в Golang
Открыть базу знаний