jenkins + docker 实现 golang 项目持续集成

723 阅读3分钟

jenkins + docker 实现 golang 项目持续集成

本文将介绍如何使用 jenkins + docker 时间 golang 项目的 持续集成

准备

  1. 安装 docker
  • 删除旧版本
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
  • 国内 daocloud 一键安装
curl -sSL https://get.daocloud.io/docker | sh
  1. 安装 docker-compose
 curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
 
 chmod +x /usr/local/bin/docker-compose
 
 # 确定 docker-compose 是否安装成功
 docker-compose version
  1. 安装 jenkins
  • 方法1 - docker 版本 jenkins
docker run \
  -u root \
  --rm \
  -d \
  -p 8080:8080 \
  -p 50000:50000 \
  -v jenkins-data:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  jenkinsci/blueocean

说明
- -u root : root 用户
- --rm : 关闭时自动删除Docker容器 (可选)
- -d : 后台执行
- -p : 映射端口
- -v: 配置挂载
- jenkinsci/blueocean: 选择的 jenkins 容器版本
更多请参考:jenkins 安装官方文档

  • 方法2 - jenkins 本地安装
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo 
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
	
yum install jenkins

golang 项目 配置 Dockerfiledocker-compose.yml

  • Dockerfile
# 选择定制镜像
FROM golang:1.17-alpine AS builder

# 配置工作目录
WORKDIR /opt/app

# 配置环境
# CGO_ENABLED 是否支持 cgo 命令 默认 1 ,0 会把在目标文件中未定义的符号(外部函数)一起链接到可执行文件中。
ENV CGO_ENABLED 0
ENV GOPROXY https://goproxy.cn,direct
ENV GO111MODULE on

# 配置时间
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \
    apk add --no-cache upx ca-certificates tzdata

COPY ./go.mod ./
COPY ./go.sum ./
RUN go mod download
COPY . .

# 复制配置文件
COPY ./conf/test.toml ./conf

# 拷贝相应信息到容器中
RUN go build -ldflags "-s -w" -o server


# 多阶段构建 
FROM alpine as runner

COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/

# 注意,多阶段构建时,下版本镜像不能从本地复制文件,而是从上一个构建镜像中复制
# 复制服务
COPY --from=builder /opt/app/server /opt/app/server
# 复制配置文件内容
COPY --from=builder /opt/app/conf /opt/app/conf


# 运行命令
CMD ["/opt/app/server"]

补充说明: Dockerfile 命令说明 - 菜鸟教程
docker基础镜像(base image):scratch 、 busybox 、 alpine
构建 Go 应用 docker 镜像的十八种姿势

  • docker-compose.yml
version: "3"

services:
  web:
    build: . 	# docker-compose 路径
    container_name: golang_project 		# 项目名称
	volumes:	# 挂载目录(自定义配置)
	  - /tmp/log:/opt/app/log
    ports:
      - "9091:9091" 	#端口配置

补充说明:
docker-compose 配置说明

自定义脚本配置

vim /deploy/common.sh
  • 脚本内容
#!/bin/bash
export HOST=$1
export APP=$2

echo host:${HOST}
echo app:${APP}

# 这一步可以优化成远程登录
cd /root/.jenkins/workspace
ls -la
scp -r -P 22 ${APP}/ ${HOST}:/tmp/${APP}/

echo '开始远程操作'

ssh -tt ${HOST} " \
cd /tmp/${APP}; \
ls -la ; \
docker-compose stop; \
echo y | docker-compose rm -v; \
echo y | docker container prune; \
docker rmi ${APP}_web; \
docker image prune -f ; \

docker-compose up -d --no-deps; \
cd /tmp ; \
rm -rf ${APP}; \
"

echo '完成'

补充说明:
远程执行 单引号和双引号的区别
shell 教程

jenkins 项目配置

  1. 新建项目 - 选择第一个 Freestyle project jenkins  + docker 实现 golang 项目持续集成

  2. 进入该项目的 Configuration

  • 配置项目仓库

jenkins  + docker 实现 golang 项目持续集成

  • 配置

jenkins  + docker 实现 golang 项目持续集成

最后在 jenkins 中执行项目 - 构建成功

jenkins  + docker 实现 golang 项目持续集成

参考文档