项目代码发布案例Argocd+Gitlab-Runner

1. 项目文件

demo项目放在gitee上需要自取

git clone https://gitee.com/qqmiller/godemo.git

1.1 项目代码

apidemo.go

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	r := gin.Default()
	r.GET("/info", Info)
	r.Run(":10088")
}

func Info(c *gin.Context) {
	c.JSON(http.StatusOK, gin.H{
		"version": "1.1.1",
	})
}

1.2 Dockerfile

FROM centos:centos7	# 基础镜像
ADD ./apidemo /root # 将编译后的可执行文件添加至/root目录下
EXPOSE 10088 # 服务暴露端口
CMD ["/root/apidemo"] #容器运行命令

1.3 项目部署文件

1.3.1 deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: apidemo
  name: apidemo
  labels:
    app: apidemo
spec:
  replicas: 4
  selector:
    matchLabels:
      app: apidemo
  template:
    metadata:
      name: apidemo
      labels:
        app: apidemo
    spec:
      containers:
        - name: apidemo
          image: 192.168.31.104/apidemo/apidemo:v1.1.1
          imagePullPolicy: Always
          ports:
            - containerPort: 10088

1.3.2 service

apiVersion: v1
kind: Service
metadata:
  namespace: apidemo
  name: apidemo
  labels:
    app: apidemo
spec:
  type: NodePort
  ports:
    - name: apidemoport
      port: 10088
      targetPort: 10088
      nodePort: 30080
  selector:
    app: apidemo

1.3.3 ingress

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-apidemo                    #自定义ingress名称
  namespace: apidemo
  annotations:
    ingressclass.kubernetes.io/is-default-class: "true"
    kubernetes.io/ingress.class: nginx
spec:
  rules:
    - host: apidemo.intra.com                   # 自定义域名
      http:
        paths:
          - pathType: Prefix
            path: "/"
            backend:
              service:
                name: apidemo     # 对应上面创建的service名称
                port:
                  number: 10088

1.3.4 kustomization

定义项目依赖文件

resources:
- apidemo-deployment.yaml
- apidemo-service.yaml
- apidemo-ingress.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

1.3.5 gitlab-ci

workflow:  #设置工作流
  rules:
    - if: $CI_COMMIT_BRANCH == 'master'  #如果代码分支为master则使用以下环境变量
      variables:
        registry: $ci_registry  #镜像仓库地址,gitlab配置全局变量
        registry_name: $ci_registry_name #镜像仓库登录用户,gitlab配置全局变量
        registry_passwd: $ci_registry_passwd #镜像仓库登录密码,gitlab配置全局变量

variables:  #
  app_name: $CI_PROJECT_NAME #项目名,gitlab项目仓库名,gitlab内置变量
  app_version: $CI_COMMIT_SHORT_SHA #app版本号,每次push项目的编号,后面会作为镜像版本,gitlab内置变量
  namespace: $CI_PROJECT_NAMESPACE #项目所在组,gitlab内置变量
  GIT_CLONE_PATH: '$CI_BUILDS_DIR/$CI_JOB_ID/$CI_PROJECT_NAME' #定义gitlab-runner,clone代码的位置

stages: #定义流水线有几个阶段
  - build #编译阶段
  - deploy #部署阶段

build code: #自定义的步骤名称
  stage: build #此步骤为build阶段
  script:
    - go build #具体执行的命令,此处为编译go项目,编译完成会产生apidemo可执行文件
  artifacts: #gitlab流水线文件内置关键字,作用为保留制品
    paths: #保留制品所在位置
      - apidemo #当前步骤需要保留的制品文件,提供个下一步骤使用

docker build:
  stage: build
  script:
    - docker build -t $app_name:$app_version .  #此步骤通过项目源码内的Dockerfile文件编译docker镜像
  needs: #gitlab流水线文件内置关键字,作用为此步骤所依赖的步骤,只有当被依赖的步骤完成后,此步骤才会执行
    - build code #此步骤被依赖的步骤

docker tag:
  stage: build
  script:
    - docker tag $app_name:$app_version $registry/$app_name/$app_name:$app_version #此步骤为上一步骤生成的镜像打上仓库标签
  needs:
    - docker build

docker push:
  stage: build
  script:
    - docker login -u $ci_registry_name -p $ci_registry_passwd $ci_registry #登录镜像仓库
    - docker push $registry/$app_name/$app_name:$app_version #推送镜像至镜像仓库
    - docker logout #登出镜像仓库
  needs:
    - docker tag

deploy dev:
  stage: deploy
  before_script: #gitlab流水线内置关键字,作用为在该步骤执行流水线操作前所依赖步骤。这里需要runner通过修改kustomization.yaml文件,来修改镜像版本信息
    #所以需要在修改镜像版本信息后,重新push代码
    - git remote set-url origin http://${CI_USERNAME}:${CI_PASSWORD}@192.168.31.14/apidemo/apidemo.git #设置远程仓库地址,CI_USERNAME为代码仓库登录用户名,需要在gitlab自定义全局变量,CI_PASSWORD为代码仓库登录密码,需要在gitlab自定义全局变量
    - git config --global user.name "Administrator" #配置本地仓库用户名信息
    - git config --global user.email "admin@example.com" #配置本地仓库邮箱信息
  script:
    - git checkout -B master #切换项目分支
    - cd base #进入资源清单文件目录
    - kustomize edit set image $registry/$app_name/$app_name:$app_version #runner通过kustomize客户端工具修改镜像版本信息
    - cat kustomization.yaml
    - git commit -am '[skip ci] DEV image update'  #git 本地提交,注意“skip ci”为gitlab流水线文件内置关键字,作用为跳过ci流水线操作,未设置可能导致流水线进入死循环
    - git push origin master #重新提交修改镜像版本后的代码
  needs:
    - docker push

1.4 将代码推送到gitlab

请添加图片描述

请添加图片描述

推送完成后在gitlab的master分支就能看到文件了

请添加图片描述

2. Gitlab设置变量

依次添加五个变量

变量 作用
ci_registry 192.168.31.104 Harbor仓库地址
ci_registry_name admin Harbor仓库用户名
ci_registry_passwd root123 Harbor仓库密码
CI_USERNAME root Gitlab用户名
CI_PASSWORD P@ssw0rd Gitlab密码

请添加图片描述

这里注意:保护变量不要勾选

请添加图片描述

3. 提交项目代码

添加远程仓库

请添加图片描述

http://192.168.31.14/apidemo/apidemo.git

请添加图片描述

4. ArgoCd配置

4.1 创建项目

请添加图片描述

请添加图片描述

4.2 创建仓库配置

请添加图片描述

请添加图片描述
请添加图片描述

4.3 配置项目

SOURCE REPOSITORIES

请添加图片描述

DESTINATIONS

请添加图片描述

CLUSTER RESOURCE ALLOW LIST

请添加图片描述

4.4 添加应用

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

更新版本

请添加图片描述

此时gitlab收到了更新,触发cicd

请添加图片描述

构建完成后镜像自动上传到harbor

请添加图片描述

随之触发argocd的发布

请添加图片描述

当发布完成后刷新/info页面.就获取到了之前提交的最新版本内容 v1.5.3

请添加图片描述

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐