Автоматизированная CI/CD с модом go в сочетании с многоуровневым кешем Docker

Go
Автоматизированная CI/CD с модом go в сочетании с многоуровневым кешем Docker

Го мод Си Дабэня

官方背书的go mod拯救了我的代码洁癖症!

окрестности

  • go v1.12
  • docker ce 18.09.0
  • gitlab ce latest

godep

При написании программы на ходу, если вы просто пишете ее самостоятельно или просто пишете гаджет для игры, управление зависимостями может быть для вас не так важно.

Однако в коммерческих инженерных проектах, где сотрудничают несколько человек, управление зависимостями go особенно важно.До сих пор было не так много доступных вариантов.Большинство методов реализации, предоставляемых сообществом, похожи, например, тот, который я использовал ранее.godep. Так что в проекте будетvendorпапка для хранения внешних зависимостей, например:

При такой реализации каждый раз, когда обновляется внешняя зависимость, другим людям приходится много тянуть вниз. . .

go mod

Давайте посмотрим на структуру проекта, которая использует официальный модуль для управления зависимостями:

Не правда ли, очень освежился, а еще проект похудел!

Просто расскажите о справке по go mod.Что касается шагов по открытию go mod, то есть много других статей в Интернете, поэтому я не буду их копировать. В конце концов, эта статья посвящена разработке CI/CD.

В настоящее времяgo v1.12версия, командаgo mod helpРезультат выглядит следующим образом:

The commands are:

	download    download modules to local cache
	edit        edit go.mod from tools or scripts
	graph       print module requirement graph
	init        initialize new module in current directory
	tidy        add missing and remove unused modules
	vendor      make vendored copy of dependencies
	verify      verify dependencies have expected content
	why         explain why packages or modules are needed

Что CI/CD нужно будет использовать позже, так этоdownloadинструкция.

dockerfile

Давайте посмотрим на dockerfile моего проекта:

FROM golang:1.12 as build

ENV GOPROXY https://go.likeli.top
ENV GO111MODULE on

WORKDIR /go/cache

ADD go.mod .
ADD go.sum .
RUN go mod download

WORKDIR /go/release

ADD . .

RUN GOOS=linux CGO_ENABLED=0 go build -ldflags="-s -w" -installsuffix cgo -o app main.go

FROM scratch as prod

COPY --from=build /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
COPY --from=build /go/release/app /
COPY --from=build /go/release/conf.yaml /

CMD ["/app"]

В моем проекте есть некоторые внешние зависимости, которые были скорректированы при локальной разработке, и компиляция прошла, и в локальной среде разработки были сгенерированы два файлаgo.mod,go.sum

В первом шаге dockerfile сначала запускаем модульный режим и настраиваем прокси, так как некоторые пакетные сервисы за стенкой без ладдера скачать нельзя, доменное имя прокси здесь мое, и его тоже можно использовать при необходимости. .

инструкцияRUN go mod downloadПри выполнении будет построен слой кеша, содержащий все зависимости элемента. В коде, представленном снова позже, еслиgo.mod,go.sumЕсли изменений нет, кеш будет использоваться напрямую для ускорения сборки.不用重复的去外网下载依赖. Если эти два файла изменятся, слой кэша будет перестроен.

Эффекты, созданные с помощью кеша:

Эффект ускорения очевиден.

уменьшить размер

использование команды go build-ldflags="-s -w"

В официальной документации:Command_LineОн назван внутри-s -wЗначение параметров может быть выбрано по мере необходимости.

  • -s: опустить таблицу символов и отладочную информацию
  • -w: Опустить таблицу символов DWARF

Вроде работает отлично 🙂

Использование скретч-изображений

использоватьgolang:1.12После разработки образа и создания приложения используйтеscratchчтобы обернуть двоичный файл сборки.

о最小基础镜像, в докере есть несколько категорий:

  • царапина: пустое базовое изображение, наименьшее базовое изображение
  • busybox: с некоторыми распространенными инструментами для легкой отладки и некоторыми расширениями busybox:glibc
  • alpine: еще один распространенный базовый образ с функцией управления пакетами, легко загружаемый другими зависимыми пакетами.

Окончательный эффект зеркального похудения

Что ж, давайте посмотрим на эффект окончательного построения приложения:

Размер встроенного образа:16.4MB

CI/CD

На основе gitlab runner для CI/CD взгляните на мой.gitlab-ci.ymlКонфигурация:

before_script:
- if [[ $(whereis docker-compose | wc -l) -eq 0 ]]; then curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose; fi

# ******************************************************************************************************
# ************************************** 测试环境配置 ****************************************************
# ******************************************************************************************************

deploy-test-tour:
  stage: deploy
  tags:
    - build
  only:
    - release/v2.0
  script:
    - export PRODUCTION=false
    - docker-compose stop
    - docker-compose up -d --build


# ******************************************************************************************************
# ************************************** 生产环境配置 ****************************************************
# ******************************************************************************************************

deploy-prod-tour:
  stage: deploy
  tags:
    - release
  only:
    - master
  script:
    - export PRODUCTION=true
    - docker-compose stop
    - docker-compose up -d --build

я используюdocker-composeдля контроля контейнеров, поэтому вbefore_scriptЭтот шаг добавлен в процесс, чтобы облегчить полную автоматизацию новой машины.

Я немного поработал над этим проектом, поэтому он немного более формальный и разделен на две среды: тестовую и производственную. привязаны к разным ветвям.

Главное — эти три строки, выполненные ниже:

export PRODUCTION=false
docker-compose stop
docker-compose up -d --build
  • exportУправляйте временными переменными среды, чтобы упростить публикацию различных сред.
  • docker-compose stopостановить старые контейнеры
  • docker-compose up -d --buildКогда новый контейнер организован и запущен, будет использоваться предыдущее кэшированное многоуровневое изображение, поэтому, за исключением первой сборки, используется последующая скорость.

Смотрите реальный скриншот релиза:

Первое исполнение, всего: 1 минута 22 секунды

Сборка с кешем, всего: 33 секунды