Го мод Си Дабэня
官方背书的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 секунды