> 文章列表 > [Gitops--3]项目代码发布案例Argocd+Gitlab-Runner

[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner

[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner

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

1. 项目文件

demo项目放在gitee上需要自取

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

1.1 项目代码

apidemo.go

package mainimport ("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: apidemoname: apidemolabels:app: apidemo
spec:replicas: 4selector:matchLabels:app: apidemotemplate:metadata:name: apidemolabels:app: apidemospec:containers:- name: apidemoimage: 192.168.31.104/apidemo/apidemo:v1.1.1imagePullPolicy: Alwaysports:- containerPort: 10088

1.3.2 service

apiVersion: v1
kind: Service
metadata:namespace: apidemoname: apidemolabels:app: apidemo
spec:type: NodePortports:- name: apidemoportport: 10088targetPort: 10088nodePort: 30080selector:app: apidemo

1.3.3 ingress

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress-apidemo                    #自定义ingress名称namespace: apidemoannotations:ingressclass.kubernetes.io/is-default-class: "true"kubernetes.io/ingress.class: nginx
spec:rules:- host: apidemo.intra.com                   # 自定义域名http:paths:- pathType: Prefixpath: "/"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: buildscript:- docker build -t $app_name:$app_version .  #此步骤通过项目源码内的Dockerfile文件编译docker镜像needs: #gitlab流水线文件内置关键字,作用为此步骤所依赖的步骤,只有当被依赖的步骤完成后,此步骤才会执行- build code #此步骤被依赖的步骤docker tag:stage: buildscript:- docker tag $app_name:$app_version $registry/$app_name/$app_name:$app_version #此步骤为上一步骤生成的镜像打上仓库标签needs:- docker builddocker push:stage: buildscript:- 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 tagdeploy dev:stage: deploybefore_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

[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner

[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner

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

[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner

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密码

[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner

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

[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner

3. 提交项目代码

添加远程仓库

[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner

http://192.168.31.14/apidemo/apidemo.git

[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner

4. ArgoCd配置

4.1 创建项目

[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner

[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner

4.2 创建仓库配置

[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner

[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner
[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner

4.3 配置项目

SOURCE REPOSITORIES

[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner

DESTINATIONS

[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner

CLUSTER RESOURCE ALLOW LIST

[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner

4.4 添加应用

[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner

[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner

[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner

[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner

更新版本

[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner

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

[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner

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

[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner

随之触发argocd的发布

[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner

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

[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner