Janrs.com | 杨建勇
Janrs.com | 杨建勇

CICD部署07 - jenkins + gitlab + harbor + k8s

[!TIP]
Jenkins 部署 go 应用到 k8s

转载请注明出处:https://janrs.com


Jenkins 部署 go 应用到 k8s

go-zero 项目为例构建镜像并推送到 Harbor 镜像仓库中心,并且使用 kubectl 部署到 k8s

1.设置 Jenkins 参数

Jenkins 使用 Docker 构建镜像需要挂载 Docker 的进程 sock 已经可执行文件。参数如下:

该参数已经在前面部署 Jenkins 的时候设置了

-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \

如果没设置,设置后重新运行 Jenkins 容器。

2.设置 kubectl

复制 kubectl 可执行文件以及 kubectl.configJenkins 容器内

kubectl.kubeconfig 位置一般存放在 ~/.kube/config

# 复制 config
docker cp config jenkins:/root/.kube/
# 复制 kubectl
docker cp kubectl jenkins:/usr/local/bin/

复制后到 Jenkins 容器内执行 kubectl 命令测试

kubectl get cs

显示

Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE                         ERROR
etcd-0               Healthy   {"health":"true","reason":""}
controller-manager   Healthy   ok
scheduler            Healthy   ok

3.设置密码脱敏

在执行 pipeline 的过程中会把一些账号密码显示在终端,比如 Docker 登录到 Harbor 的密码。这些都需要脱敏。

设置位置:系统管理 -> Manage Credentials -> System -> 全局凭据 -> 添加一些凭据

截图如下:

[!NOTE]
选择 Username with password

勾选 Treat username as secret 将账号也脱敏。

ID 可填可不填。没有填写会自动生成。
账号跟密码就填写 Harbor 的账号跟密码。

https://cdn.janrs.com/wp-content/uploads/2023/02/deploy-01.png

4.创建 Dockerfile

该教程使用的是 go-zero 项目的 Dockerfile。其他 go 项目自行设置。

FROM golang:alpine AS builder

LABEL stage=gobuilder

ENV CGO_ENABLED 0
ENV GOPROXY https://goproxy.cn,direct
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories

RUN apk update --no-cache && apk add --no-cache tzdata

WORKDIR /build

ADD go.mod .
ADD go.sum .
RUN go mod download
COPY . .
COPY service/permission/api/etc /app/etc
RUN go build -ldflags="-s -w" -o /app/admin service/permission/api/admin.go

FROM scratch

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

WORKDIR /app
COPY --from=builder /app/admin /app/admin
COPY --from=builder /app/etc /app/etc

CMD ["./admin", "-f", "etc/admin-api.yaml"]

5.编写 pipeline

[!NOTE]
编写 pipeline ,也就是 gz-admin-jenkinsfile 项目下的 Jenkinsfile 文件。

编写完成后 pushgitlab

pipeline{

    agent   any

    //选项
    options {
        //设置终端显示颜色
        ansiColor('gnome-terminal')
    }

    //全局变量
    environment {
        //设置镜像版本
        IMAGE_VERSION = "v1"
    }

    stages{
        //拉取项目代码
        stage('Pull Code'){
            steps{

                echo '>>>>>>>>>>>>>>>>>>START PULL CODE<<<<<<<<<<<<<<<<<<<<'

                checkout([$class: 'GitSCM', branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[url: 'ssh://git@172.16.222.250:1122/janrs/gz-admin.git']]])

                echo '>>>>>>>>>>>>>>>>>>END PULL CODE <<<<<<<<<<<<<<<<<<<<'

            }
        }
        //构建镜像
        stage('Build Image'){
            steps{

                echo '>>>>>>>>>>>>>>>>>>START BUILD IMAGE<<<<<<<<<<<<<<<<<<<<'

                sh "docker build -t gz-admin:${IMAGE_VERSION} -f $WORKSPACE/service/permission/api/Dockerfile ."

                echo '>>>>>>>>>>>>>>>>>>START BUILD IMAGE<<<<<<<<<<<<<<<<<<<<'
            }
        }
        //推送镜像
        stage('Push Image'){
            steps{

                echo '>>>>>>>>>>>>>>>>>>START PUSH IMAGE<<<<<<<<<<<<<<<<<<<<'

                //账号密码脱敏
                withCredentials([usernamePassword(credentialsId: 'harbor_secret', passwordVariable: 'password', usernameVariable: 'username')]) {
                    sh "echo $password | docker login https://172.16.222.250:8443 -u $username --password-stdin"
                }

                sh "docker tag gz-admin:${IMAGE_VERSION} 172.16.222.250:8443/gz-admin/gz-admin:${IMAGE_VERSION}"
                sh "docker push 172.16.222.250:8443/gz-admin/gz-admin:${IMAGE_VERSION}"

                echo '>>>>>>>>>>>>>>>>>>END PUSH IMAGE<<<<<<<<<<<<<<<<<<<<'
            }
        }
        //删除镜像
        stage('Delete Image'){
            steps{

                echo '>>>>>>>>>>>>>>>>>>START DELETE IMAGE<<<<<<<<<<<<<<<<<<<<'

                //删除本地镜像
                sh "docker rmi gz-admin:${IMAGE_VERSION}"
                sh "docker rmi 172.16.222.250:8443/gz-admin/gz-admin:${IMAGE_VERSION}"

                //删除缓存的中间镜像。如果是第一次部署项目,可先将该命令注释。
                //后面再打开该参数。不删除的话,会一直增加中间镜像,占用磁盘空间。
                sh "docker image prune -f --filter \"until=10m\""

                echo '>>>>>>>>>>>>>>>>>>END DELETE IMAGE<<<<<<<<<<<<<<<<<<<<'

            }
        }
        //部署到 kubernetes
        stage('Deploy to k8s'){

            steps{

                echo '>>>>>>>>>>>>>>>>>>START DEPLOY<<<<<<<<<<<<<<<<<<<<'

                sh "kubectl apply -f $WORKSPACE/service/permission/api/gz-admin.yaml"

                echo '>>>>>>>>>>>>>>>>>>END DEPLOY<<<<<<<<<<<<<<<<<<<<'

            }
        }
    }
}

6.部署 gz-admin 项目

gz-admin 项目里随便创建一个没用的空文件,然后 push 代码触发 jenkins 进行 pipeline 部署。

部署结果截图如下:

可以看到 gz-admin 镜像已经部署到 k8s

https://cdn.janrs.com/wp-content/uploads/2023/02/deploy-02.png

至此。全部 go-zero + CICD + k8s 已经整套走通。

如果你有任何问题,欢迎在底部留言。或者点击加入微信技术交流群 | 我的GitHub

码仔

文章作者

Janrs.com

发表回复

textsms
account_circle
email

Janrs.com | 杨建勇

CICD部署07 - jenkins + gitlab + harbor + k8s
[!TIP] Jenkins 部署 go 应用到 k8s 转载请注明出处:https://janrs.com Jenkins 部署 go 应用到 k8s 以 go-zero 项目为例构建镜像并推送到 Harbor 镜像仓库中心,并且使用 kubectl 部…
扫描二维码继续阅读
2022-11-19