Gitlab 提供了完整 CI/CD 功能而且集成了 docker 镜像服务, 能够在此基础上快速实现 docker 镜像交付.html
样例工程目录结构以下github.com/dodocat/git…:linux
├── .gitlab-ci.yml
├── Dockerfile
├── Gopkg.lock
├── Gopkg.toml
├── README.md
├── app.conf
├── main.go
└── vendor
复制代码
项目使用 golang 官方包管理工具 dep
进行依赖管理, 参考官方文档: github.com/golang/depgit
直接经过 go get 安装 depgithub
go get -u github.com/golang/dep/cmd/dep
复制代码
记得设置环境变量golang
export PATH=$PATH:$GOPATH/bin
复制代码
在工程根目录初始 depdocker
dep init
复制代码
执行以后会生成 Gopkg.toml
Gopkg.lock
vendor/
这三文件都须要 commit 进入版本管理系统. 全部的依赖文件都在 vendor/
目录里. 详细信息参阅 dep 文档. 添加新库或者更新了已有库致使 vendor
目录变动, 须要将变动 commit 进入版本管理里.bash
CI 配置了三个阶段 test
build
deploy
, 配置了 before_script 在每一个任务执行前初始 Go 的相关环境变量.服务器
在 test 阶段运行单元测试并发
在 build 阶段将 Go 程序编译成单体二进制文件, 并做为 artifact 存储, 用于其余阶段的任务使用.app
在 deploy 阶段将编译的结果打包成 docker 镜像, 并发布到 registry.
CI 配置文件 .gitlab-ci.yml
内容以下
image: docker:git
stages:
- test
- build
- deploy
build-dev:
stage: build
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build --build-arg APP_ROOT=/go/src/$CI_PROJECT_NAME -t $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME -f docker/test/Dockerfile .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME
only:
- develop
deploy-dev:
stage: deploy
variables:
DOCKER_HOST: $DOCKER_HOST_DEV
DOCKER_TLS_VERIFY: 1
SERVICE_NAME: dev
image: docker:latest
script:
- mkdir -p ~/.docker
- echo "$DOCKER_HOST_TLS_CA_CERT_DEV" > ~/.docker/ca.pem
- echo "$DOCKER_HOST_TLS_CERT_DEV" > ~/.docker/cert.pem
- echo "$DOCKER_HOST_TLS_KEY_DEV" > ~/.docker/key.pem
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker service update --with-registry-auth --image $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME $TEST_SERVICE_NAME
environment:
name: dev
url: http://${CI_BUILD_REF_NAME}.project.example.com
only:
- dev
复制代码
编写 Dockerfile:
FROM golang:1.9.0
ARG APP_ROOT
WORKDIR ${APP_ROOT}
COPY ./ ${APP_ROOT}
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .
FROM alpine:latest
ARG APP_ROOT
RUN apk --no-cache add ca-certificates tzdata
WORKDIR /app/
RUN mkdir -p ./conf/dev && touch ./conf/dev/app.conf
COPY --from=0 ${APP_ROOT}/main .
COPY --from=0 ${APP_ROOT}/conf/app.conf ./conf/app.conf
ENV DREAMENV TEST
ENV DEPLOY_TYPE DOCKER
ENTRYPOINT ["/app/main"]
复制代码
Gitlab 内集成了 registry 能够为全部项目提供 docker 镜像服务.
go build -o main
docker login # 输入用户名密码登录
docker built -t registry.gitlab.example.com/group/project -f Dockerfile . # 编译 Docker 镜像
docker push registry.gitlab.example.com/group/project # 把 docker 镜像发布到 gitlab registry
复制代码
本地测试docker环境编译执行:
go build -o main
docker build -t gitlab-go-docker-demo docker/test/Dockerfile .
docker run gitlab-go-docker-demo
复制代码
在服务器上登录 docker registry:
docker login registry.gitlab.example.com
复制代码
登录成功后拉取 docker 镜像:
# 以测试服务器为例, 正式服务器需指定相应版本
docker pull registry.gitlab.examlple.com/group/project/test:latest
复制代码
运行:
docker run -p 80:80 -v /var/log/:/app/log/ --restart unless-stopped registry.gitlab.example.com/group/project/test
复制代码
https://github.com/golang/dep
https://docs.gitlab.com/ce/ci/docker/using_docker_build.html 详解了如何配置 gitlab-ci docker 构建
https://about.gitlab.com/2016/05/23/gitlab-container-registry/ 介绍了关于 gitlab container registry 的使用
https://blog.stackahoy.io/a-guide-to-automated-docker-deployments-w-gitlab-ci-510966dd6022 云服务商 stackahoy.io 关于 go 的部署教程
https://docs.gitlab.com/ee/ci/yaml/
https://docs.gitlab.com/ee/ci/variables/README.html