[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner
![[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner](http://pic.ttrar.cn/nice/%5bGitops3%5d%e9%a1%b9.jpg)
项目代码发布案例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](https://img-blog.csdnimg.cn/3ba244b968f8431b8d5f7f3fc6cef0fb.png)
![[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner](https://img-blog.csdnimg.cn/fb34621f46294a8da93f502dcbedcfa0.png)
推送完成后在gitlab的master分支就能看到文件了
![[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner](https://img-blog.csdnimg.cn/1309c10e284646a18fb2a5d1c6fae63e.png)
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](https://img-blog.csdnimg.cn/bf80e536782542c2a1607cc759459751.png)
这里注意:保护变量不要勾选
![[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner](https://img-blog.csdnimg.cn/26f684f00b434fb18bdf1f874db53eb0.png)
3. 提交项目代码
添加远程仓库
![[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner](https://img-blog.csdnimg.cn/849dd2a5e7c34247b26f8e8384832bda.png)
http://192.168.31.14/apidemo/apidemo.git
![[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner](https://img-blog.csdnimg.cn/bcff228e5f2b4ea58042efe97305b5a5.png)
4. ArgoCd配置
4.1 创建项目
![[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner](https://img-blog.csdnimg.cn/6d1dbd8f8b3841f7aec47a8f5d455e8f.png)
![[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner](https://img-blog.csdnimg.cn/9922850363604be5b2508cd4a39e05fe.png)
4.2 创建仓库配置
![[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner](https://img-blog.csdnimg.cn/25e0f45f13504992988cd65f597ae2e7.png)
![[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner](https://img-blog.csdnimg.cn/7d0fcfb10ed64bb1a03b01e8857efc0a.png)
 ![[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner](https://img-blog.csdnimg.cn/bcf5b3e45e5f467abd0df716687d70bb.png)
4.3 配置项目
SOURCE REPOSITORIES
![[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner](https://img-blog.csdnimg.cn/cd8e736c8a9840a3a752cf8d0f30dab3.png)
DESTINATIONS
![[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner](https://img-blog.csdnimg.cn/af2762ee8e9e42e5a7e433b92a2ff3ba.png)
CLUSTER RESOURCE ALLOW LIST
![[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner](https://img-blog.csdnimg.cn/b27ca14a0de04504948a19fff858b2a1.png)
4.4 添加应用
![[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner](https://img-blog.csdnimg.cn/6a7dbf686ffe4acf85c91fb800977a9a.png)
![[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner](https://img-blog.csdnimg.cn/3d28fd910ce64b63bc84a748be70f521.png)
![[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner](https://img-blog.csdnimg.cn/cc53b65960ae49d197fb518e7c9ee2c1.png)
![[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner](https://img-blog.csdnimg.cn/2ea7cdf54c3b4e88b2790321bcbff6ef.png)
更新版本
![[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner](https://img-blog.csdnimg.cn/bfcf803b618b490d91b1d71449622ee9.png)
此时gitlab收到了更新,触发cicd
![[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner](https://img-blog.csdnimg.cn/4955494b321e4bfa9f50286a973ee9c2.png)
构建完成后镜像自动上传到harbor
![[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner](https://img-blog.csdnimg.cn/15a59421f5b64f67b682aec4c760ba09.png)
随之触发argocd的发布
![[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner](https://img-blog.csdnimg.cn/cc42d4c14315409ab3604340e63a411d.png)
当发布完成后刷新/info页面.就获取到了之前提交的最新版本内容 v1.5.3
![[Gitops--3]项目代码发布案例Argocd+Gitlab-Runner](https://img-blog.csdnimg.cn/978a1396db5e474ea49baf6e438ac36e.png)


