一、gitops 简述

GitOps 是一个操作框架,采用用于应用程序开发的 DevOps 最佳实践(例如版本控制、协作、合规性和 CI/CD),并将其应用于基础设施自动化。

GitOps也是实现持续交付的一种方式。通过使用Git作为唯一的事实来源,去声明基础架构以及应用负载所期望达到的最终运行状态。GitOps持续交付工具会实时观察声明式基础架构本身以及运行其上的工作负载状态,并与保存在Git中所期望的配置和部署文件比较差异。如果有差异,则会自动触发一系列预先配置好的自动更新或回滚策略,以确保基础架构和工作负载始终按照Git中的配置文件及部署文件所描述的期望状态运行。

1、gitops优点

GitOps 有很多好处,包括提高效率和安全性、更好的开发人员体验、降低成本和更快的部署

借助 GitOps,组织可以使用单一、统一的工具来管理整个基础设施和应用程序开发生命周期。这使得团队之间能够更好地协作和协调,从而减少错误并更快地解决问题。

此外,GitOps 可以帮助组织利用容器和微服务,并保持所有基础设施的一致性——从 Kubernetes 集群配置和 Docker 镜像到云实例和任何本地部署

2、gitops与devops的区别

GitOps 严重依赖自动化和工具来管理和部署代码更改,而 DevOps 更注重团队之间的沟通和协作。此外,GitOps 通常与 Kubernetes 等容器化技术结合使用,而 DevOps 可以与任何类型的应用程序一起使用。

GitOps 是 DevOps 的一个分支,专注于使用 Git 代码存储库来管理基础设施和应用程序代码部署。两者之间的主要区别在于,在 GitOps 中,Git 存储库是部署状态的真实来源,而在 DevOps 中,它是应用程序或服务器配置文件

3、gitops关键组件

GitOps 工作流程有四个关键组件:Git 存储库、持续交付 (CD) 管道、应用程序部署工具和监控系统。

  1. Git 存储库是应用程序配置和代码的真实来源。

  2. CD 管道负责构建、测试和部署应用程序。

  3. 部署工具用于管理目标环境中的应用程序资源。

  4. 监控系统跟踪应用程序性能并向开发团队提供反馈。

二、cicd流水线
1、gitops架构

此架构是以gitlab为核心的gitops流水线,通过gitlab-runner执行ci部分,argocd执行cd部分,使用了禅道、snorqube、metersphere、harbor等组件构建而成的企业级cicd流水线。

2、组件介绍
1、gitlab

地址:GitLab-10万企业使用的一站式DevOps平台_GitLab中文官网

GitLab是项目管理和代码托管平台,可通过Web界面进行访问公开的或者私人项目,常用于源代码版本控制,但是也可以用于保存各类文件。它提供了一个集中式的Web界面,使团队成员能够在同一个地方管理和协作开发项目。GitLab支持各种功能,包括代码仓库管理、问题跟踪、持续集成/持续交付(CI/CD)、代码审查、Wiki、容器注册表等。

2、gitlab-runner

地址:安装极狐GitLab Runner | 极狐GitLab

GitLab Runner是GitLab CI/CD的执行代理,用于执行和管理CI/CD作业。它是一个独立的二进制文件,可以在各种操作系统上运行,并且可以与GitLab服务器进行通信。负责接收GitLab服务器发送的作业请求,并根据配置文件中定义的规则和脚本来执行这些作业。

3、argocd

地址:Argo CD - Declarative GitOps CD for Kubernetes

Argo CD是一个开源的持续交付工具,用于部署和管理应用程序到Kubernetes集群。它借助GitOps的理念,将应用程序的部署和配置定义为Git存储库中的声明性文件,并自动将其同步到Kubernetes集群中。

4、harbor

地址:Harbor

Harbor是一个开源的企业级Docker镜像仓库,用于存储、分发和管理Docker镜像。它提供了一个安全可靠的环境,用于存储和处理容器镜像,并支持用户权限控制、镜像复制和同步、自动构建等功能,支持与CI/CD工具集成,可以自动构建和推送镜像。

5、sonarqube

地址:Code Quality, Security & Static Analysis Tool with SonarQube | Sonar

SonarQube是一个开源的静态代码分析工具,用于评估和提高代码质量。它提供了一系列功能,包括代码质量度量、静态代码分析、代码覆盖率、代码复杂度等,帮助开发团队发现和修复潜在的代码问题。

6、禅道

地址:项目管理软件 开源项目管理软件 免费项目管理软件 - 禅道开源项目管理软件

禅道(Zentao)是一款开源的项目管理软件,旨在帮助团队高效地进行项目管理和协作。它提供了一系列的功能,包括需求管理、任务管理、缺陷跟踪、文档管理、团队协作等,以支持整个项目的生命周期。

7、metersphere

地址:MeterSphere - 开源持续测试平台 - 官网

Metersphere是一个开源的测试管理平台,用于帮助团队进行软件测试和质量管理。它提供了一系列的功能和工具,包括测试计划、测试用例管理、自动化测试、性能测试、缺陷管理等,以支持软件测试的全过程。

各组件的部署安装这里不做详细介绍,可参考官方文档安装,所有组件均可部署在k8s集群之上,后续我也会发布相关部署文本文档。

三、基于snowy项目的cicd流水线实战
1、snowy微服务项目

地址:小诺开源技术

Snowy-Cloud(SnowyAdmin微服务版)是国内首个国密前后端分离快速开发平台,本实例主要是基于这个项目的流水线示例。

2、pipeline流水

CI部分

.gitlab-ci.yaml

 variables:
 # gitlab
   CI_PUSH_TOKEN: glpat-snSy2sxxDJPwmVUwcj5d       # gitlab令牌
   GIT_USER_MAIL: dfcv@dfcv.com.cn       # gitlab注册邮箱
   GIT_USER_NAME: tandan             # gitlab用户名
   #CD_REPO: gitlab.tc.dfmc.com.cn/dcb-cloudbase-dashboard-stack/dashboard-backend-cd.git    # CD库地址
   #CD_PATH: dashboard-backend     # git目录名称
 # registry
   CI_REGISTRY: harbor-ops.dfcv.com.cn    # 上游镜像仓库地址
   CI_REGISTRY_USER: admin      # 镜像仓库登录用户
   CI_REGISTRY_PASSWORD: Ujwxpy28fh6X      # 镜像仓库登录密码
   CI_REGISTRY_IMAGE: "$CI_REGISTRY/devops"    # 镜像路径
   MAVEN_VERSION: 3.8.1-jdk-8-infra-ops                             # maven镜像tag
 # sonar
   #SONAR_HOST_URL: https://sonar-ops.dfcv.com.cn    # sonar 地址
   #SONAR_PROJECTKEY: snowy    # sonar 项目key
   #SONAR_LOGIN: cba7b40b668ed4c841b212defe13fa07236adba5    # sonar 令牌
 ​
 ​
 stages:
   # - scan
   - build
   - publish
   - deploy-dev
 ​
 # scan-backend:
 #   stage: scan
 #   image: harbor-ops.dfcv.com.cn/library/maven:$MAVEN_VERSION
 #   script:
 #     - num=`sed -n -e "/<mirrors>/=" $MAVEN_HOME/conf/settings.xml`
 #     - sed -i "${num}a <mirror>" $MAVEN_HOME/conf/settings.xml
 #     - sed -i "`expr $num + 1`a <id>local-repo</id>" $MAVEN_HOME/conf/settings.xml
 #     - sed -i "`expr $num + 2`a <mirrorOf>*</mirrorOf>" $MAVEN_HOME/conf/settings.xml
 #     - sed -i "`expr $num + 3`a <name>本地私仓</name>" $MAVEN_HOME/conf/settings.xml
 #     - sed -i "`expr $num + 4`a <url>https://nexus-ops.dfcv.com.cn/repository/maven-public/</url>" $MAVEN_HOME/conf/settings.xml
 #     - sed -i "`expr $num + 5`a </mirror>" $MAVEN_HOME/conf/settings.xml
 #     - mvn verify  sonar:sonar -Dsonar.projectKey=snowy-cloud -Dsonar.host.url=https://sonar-ops.dfcv.com.cn -Dsonar.login=e9d731474ea5d255e581ddf6c8256efe0d808d42
 ​
 # scan-ui:
 #   stage: scan
 #   image: 
 #     name: $CI_REGISTRY/library/sonarsource/sonar-scanner-cli:latest
 #   script: 
 #     - sonar-scanner -Dsonar.projectKey=snowy-cloud -Dsonar.sources=./snowy-admin-web -Dsonar.host.url=https://sonar-ops.dfcv.com.cn -Dsonar.login=e9d731474ea5d255e581ddf6c8256efe0d808d42
 ​
 # compile-snowy-server:
 #   stage: build
 #   image: harbor-ops.dfcv.com.cn/library/maven:${MAVEN_VERSION}
 #   script:
 #     - num=`sed -n -e "/<mirrors>/=" $MAVEN_HOME/conf/settings.xml`
 #     - sed -i "${num}a <mirror>" $MAVEN_HOME/conf/settings.xml
 #     - sed -i "`expr $num + 1`a <id>local-repo</id>" $MAVEN_HOME/conf/settings.xml
 #     - sed -i "`expr $num + 2`a <mirrorOf>*</mirrorOf>" $MAVEN_HOME/conf/settings.xml
 #     - sed -i "`expr $num + 3`a <name>本地私仓</name>" $MAVEN_HOME/conf/settings.xml
 #     - sed -i "`expr $num + 4`a <url>https://nexus-ops.dfcv.com.cn/repository/maven-public/</url>" $MAVEN_HOME/conf/settings.xml
 #     - sed -i "`expr $num + 5`a </mirror>" $MAVEN_HOME/conf/settings.xml
 #     - mvn package -Dmaven.test.skip=true
 #     - ls -l ./
 #     - pwd 
 #   artifacts:
 #     paths:
 #       - ./snowy-server/snowy-actuator-app/target/*.jar
 #       - ./snowy-server/snowy-gateway-app/target/*.jar
 #       - ./snowy-server/snowy-nacos-app/target/*.jar
 #       - ./snowy-server/snowy-sentinel-app/target/*.jar
 #       - ./snowy-server/snowy-xxl-job-app/target/*.jar
 #     expire_in: 1 week
 ​
 # compile-snowy-modules-1:
 #   stage: build
 #   image: harbor-ops.dfcv.com.cn/library/maven:${MAVEN_VERSION}
 #   script:
 #     - num=`sed -n -e "/<mirrors>/=" $MAVEN_HOME/conf/settings.xml`
 #     - sed -i "${num}a <mirror>" $MAVEN_HOME/conf/settings.xml
 #     - sed -i "`expr $num + 1`a <id>local-repo</id>" $MAVEN_HOME/conf/settings.xml
 #     - sed -i "`expr $num + 2`a <mirrorOf>*</mirrorOf>" $MAVEN_HOME/conf/settings.xml
 #     - sed -i "`expr $num + 3`a <name>本地私仓</name>" $MAVEN_HOME/conf/settings.xml
 #     - sed -i "`expr $num + 4`a <url>https://nexus-ops.dfcv.com.cn/repository/maven-public/</url>" $MAVEN_HOME/conf/settings.xml
 #     - sed -i "`expr $num + 5`a </mirror>" $MAVEN_HOME/conf/settings.xml
 #     - mvn package -Dmaven.test.skip=true
 #     - ls -l ./
 #     - pwd 
 #   artifacts:
 #     paths:
 #       - ./snowy-modules/snowy-biz-app/target/*.jar
 #       - ./snowy-modules/snowy-flw-app/target/*.jar
 ​
 #     expire_in: 1 week
 ​
 # compile-snowy-modules-2:
 #   stage: build
 #   image: harbor-ops.dfcv.com.cn/library/maven:${MAVEN_VERSION}
 #   script:
 #     - num=`sed -n -e "/<mirrors>/=" $MAVEN_HOME/conf/settings.xml`
 #     - sed -i "${num}a <mirror>" $MAVEN_HOME/conf/settings.xml
 #     - sed -i "`expr $num + 1`a <id>local-repo</id>" $MAVEN_HOME/conf/settings.xml
 #     - sed -i "`expr $num + 2`a <mirrorOf>*</mirrorOf>" $MAVEN_HOME/conf/settings.xml
 #     - sed -i "`expr $num + 3`a <name>本地私仓</name>" $MAVEN_HOME/conf/settings.xml
 #     - sed -i "`expr $num + 4`a <url>https://nexus-ops.dfcv.com.cn/repository/maven-public/</url>" $MAVEN_HOME/conf/settings.xml
 #     - sed -i "`expr $num + 5`a </mirror>" $MAVEN_HOME/conf/settings.xml
 #     - mvn package -Dmaven.test.skip=true
 #     - ls -l ./
 #     - pwd 
 #   artifacts:
 #     paths:
 #       - ./snowy-modules/snowy-ten-app/target/*.jar
 #       - ./snowy-modules/snowy-urp-app/target/*.jar
 #       - ./snowy-modules/snowy-web-app/target/*.jar
 #     expire_in: 1 week
 ​
 compile-ui:
   stage: build
   image: harbor-ops.dfcv.com.cn/devops/node:16.15.1-slim
   script:
     - cd snowy-admin-web
     - npm install --registry=https://registry.npmmirror.com
     - npm run build  
     - ls ./
   artifacts:
     paths:
       - ./snowy-admin-web/dist/
     expire_in: 1 week
 ​
 ​
 container-snowy-server:
   stage: publish
   image:
     name: harbor-ops.dfcv.com.cn/devops/gcr.io/kaniko-project/executor:debug
     entrypoint: [""]
   script:
 #    - wget ${FILE_SERVER_URL}/general-tools/SSL_HARBOR_CERT.pem -q -O /SSL_HARBOR_CERT.pem
 #    - cat /SSL_HARBOR_CERT.pem >> /kaniko/ssl/certs/ca-certificates.crt
     # - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json    
     # - /kaniko/executor --context ./ --dockerfile ./docker/portal/portal-modules/snowy-biz-app/dockerfile --destination harbor-ops.dfcv.com.cn/devops/snowy-biz-app:$CI_COMMIT_SHORT_SHA --skip-tls-verify --insecure=true
     # - /kaniko/executor --context ./ --dockerfile ./docker/portal/portal-modules/snowy-flw-app/dockerfile --destination harbor-ops.dfcv.com.cn/devops/snowy-flw-app:$CI_COMMIT_SHORT_SHA --skip-tls-verify --insecure=true
     # - /kaniko/executor --context ./ --dockerfile ./docker/portal/portal-modules/snowy-ten-app/dockerfile --destination harbor-ops.dfcv.com.cn/devops/snowy-ten-app:$CI_COMMIT_SHORT_SHA --skip-tls-verify --insecure=true
     # - /kaniko/executor --context ./ --dockerfile ./docker/portal/portal-modules/snowy-urp-app/dockerfile --destination harbor-ops.dfcv.com.cn/devops/snowy-urp-app:$CI_COMMIT_SHORT_SHA --skip-tls-verify --insecure=true
     # - /kaniko/executor --context ./ --dockerfile ./docker/portal/portal-modules/snowy-web-app/dockerfile --destination harbor-ops.dfcv.com.cn/devops/snowy-web-app:$CI_COMMIT_SHORT_SHA --skip-tls-verify --insecure=true   
     # - /kaniko/executor --context ./ --dockerfile ./docker/portal/portal-server/snowy-actuator-app/dockerfile --destination harbor-ops.dfcv.com.cn/devops/snowy-actuator-app:$CI_COMMIT_SHORT_SHA --skip-tls-verify --insecure=true
     # - /kaniko/executor --context ./ --dockerfile ./docker/portal/portal-server/snowy-gateway-app/dockerfile --destination harbor-ops.dfcv.com.cn/devops/snowy-gateway-app:$CI_COMMIT_SHORT_SHA --skip-tls-verify --insecure=true
     # - /kaniko/executor --context ./ --dockerfile ./docker/portal/portal-server/snowy-nacos-app/dockerfile --destination harbor-ops.dfcv.com.cn/devops/snowy-nacos-app:$CI_COMMIT_SHORT_SHA --skip-tls-verify --insecure=true
     # - /kaniko/executor --context ./ --dockerfile ./docker/portal/portal-server/snowy-sentinel-app/dockerfile --destination harbor-ops.dfcv.com.cn/devops/snowy-sentinel-app:$CI_COMMIT_SHORT_SHA --skip-tls-verify --insecure=true
     # - /kaniko/executor --context ./ --dockerfile ./docker/portal/portal-server/snowy-xxl-job-app/dockerfile --destination harbor-ops.dfcv.com.cn/devops/snowy-xxl-job-app:$CI_COMMIT_SHORT_SHA --skip-tls-verify --insecure=true
     - /kaniko/executor --context ./ --dockerfile ./docker/portal/nginx/dockerfile --destination harbor-ops.dfcv.com.cn/devops/snowy-admin-web:$CI_COMMIT_SHORT_SHA --skip-tls-verify --insecure=true
     
   # dependencies:
   #   - compile-snowy-modules-1
   #   - compile-snowy-modules-2
   #   - compile-snowy-server
   #   - compile-ui
 ​
 ​
 deploy-dev:
   stage: deploy-dev
   image: harbor-ops.dfcv.com.cn/devops/kustomize:v1
   before_script:
     - git remote set-url origin https://${GIT_USER_NAME}:${CI_PUSH_TOKEN}@gitlab-ops.dfcv.com.cn/snowy/snowy-cd.git
     - git config --global user.email "gitlab@git.k8s.local"
     - git config --global user.name "GitLab CI/CD"
     - git config --global http.sslVerify false
   script:
     - git checkout -B master
     - git pull origin master
     - git remote -v
     - cd dev/deploy
     # - kustomize edit set image harbor-ops.dfcv.com.cn/devops/snowy-actuator-app:$CI_COMMIT_SHORT_SHA
     # - kustomize edit set image harbor-ops.dfcv.com.cn/devops/snowy-gateway-app:$CI_COMMIT_SHORT_SHA
     # - kustomize edit set image harbor-ops.dfcv.com.cn/devops/snowy-nacos-app:$CI_COMMIT_SHORT_SHA
     # - kustomize edit set image harbor-ops.dfcv.com.cn/devops/snowy-sentinel-app:$CI_COMMIT_SHORT_SHA
     # - kustomize edit set image harbor-ops.dfcv.com.cn/devops/snowy-xxl-job-app:$CI_COMMIT_SHORT_SHA
     # - kustomize edit set image harbor-ops.dfcv.com.cn/devops/snowy-biz-app:$CI_COMMIT_SHORT_SHA
     # - kustomize edit set image harbor-ops.dfcv.com.cn/devops/snowy-web-app:$CI_COMMIT_SHORT_SHA
     # - kustomize edit set image harbor-ops.dfcv.com.cn/devops/snowy-urp-app:$CI_COMMIT_SHORT_SHA
     # - kustomize edit set image harbor-ops.dfcv.com.cn/devops/snowy-ten-app:$CI_COMMIT_SHORT_SHA
     # - kustomize edit set image harbor-ops.dfcv.com.cn/devops/snowy-flw-app:$CI_COMMIT_SHORT_SHA
     - kustomize edit set image harbor-ops.dfcv.com.cn/devops/snowy-admin-web:$CI_COMMIT_SHORT_SHA
     - cat kustomization.yaml
     - git commit -am '[skip ci] PROD image update'
     - git push origin master

后端dockerfile-模板

 # 后端dockerfile-demo
 FROM 10.50.1.50/data-market/openjdk:8u342-jdk
 # author
 MAINTAINER ruoyi
 ​
 # 挂载目录
 VOLUME /home/ruoyi
 # 创建目录
 RUN mkdir -p /home/ruoyi
 # 指定路径
 WORKDIR /home/ruoyi
 # 复制jar文件到路径
 COPY ./ruoyi-auth/target/ruoyi-auth.jar  /home/ruoyi/ruoyi-auth.jar
 # 启动认证服务
 ENTRYPOINT ["java","-jar","ruoyi-auth.jar"]

前端dockerfile-模板

 # 前端dockerfile-demo
 FROM 10.50.1.50/data-market/nginx:latest
 ​
 VOLUME /home/ruoyi/projects/ruoyi-ui
 ​
 RUN mkdir -p /home/ruoyi/projects/ruoyi-ui
 ​
 WORKDIR /home/ruoyi/projects/ruoyi-ui
 ​
 COPY ruoyi-ui/dist /home/ruoyi/projects/ruoyi-ui

CD部分

cd主要是对接argocd部分,需要编写相关的kustomization和yaml文件,将我的应用部署到k8s集群之上。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐