CICD简易版操作流程

  1. jenkins上的操作

    • 在jenkins上新建一个多分支流水线作业
    • 在对应的Branch Sources处选择使用的分支来源
    • 在Build Confiiguration处的mode选择by Jenkinsfiles,表示以Jenkinsfies为系统部署的触发入口
    • 点击Save即可
  2. 代码上操作

    • 在项目的路径下新建Jenkinsfie文件,内容为
      pipeline {
      agent {
        label 'docker'
      }
      options {
       buildDiscarder(logRotator(numToKeepStr: '5', daysToKeepStr: '14'))
      }
      triggers {
      	pollSCM 'H/5 * * * *'
      }
      stages {
      stage('Build Image & Upload') {
          when {
              branch "对应部署的分支"
          }
          agent {
              label 'docker'
          }
          steps {
                withKubeConfig([
                      credentialsId: 'k8s配置在jenkins上的秘钥id',
                      contextName  : 'kubernetes']) {
                  sh 'chmod +x go'
                  sh './go build'
              }
          }
      }
      stage('deploy for prod') {
          agent {
              label 'docker'
          }
          when {
              branch '对应部署的分支'
          }
          environment {
             /*此处为对应的环境变量*/
          }
          steps {
              withKubeConfig([
                      credentialsId: 'k8s配置在jenkins上的秘钥id',
                      contextName  : 'kubernetes']) {
                  sh 'chmod +x go'
                  sh './go deploy'
              }
          }
        }
       }
      }
      
    • 由于上述文件执行的shell脚本的名称为go,所以在系统路径下创建go的shell脚本文件,内容如下
      #!/bin/bash
      
      set -e
      ENV=$SPRING_PROFILES_ACTIVE
      CI_COMMIT_SHA=${GIT_COMMIT:=$(git log -n 1 --pretty=format:'%h')}
      IMAGE_TAG="$CI_COMMIT_SHA"
      DOCKER_REGISTRY_SERVER=harbour服务器名称
      DOCKER_REGISTRY_NAME=$(echo $DOCKER_REGISTRY_SERVER | sed 's~http[s]*://~~g')
      DOCKER_USER=$(kubectl get secret regcred --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode | jq .[] | jq .[].username | sed -e 's/^"//' -e 's/"$//')
      DOCKER_PASSWORD=$(kubectl get secret regcred --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode 	| jq .[] | jq .[].password | sed -e 's/^"//' -e 's/"$//')
      HARBOUR_ITEM_NAME="harbour命名空间"
      APP_NAME="app名称"
      DOCKER_IMAGE_URL=$DOCKER_REGISTRY_NAME/$HARBOUR_ITEM_NAME/$APP_NAME:$IMAGE_TAG
      
      test() {
      	 branch=$BRANCH_NAME
       	./mvnw clean install
      	./mvnw sonar:sonar \
      	-Dsonar.projectKey=backend-$branch \
      	-Dsonar.projectName=backend-$branch \
      	-Dsonar.java.binaries=target/sonar \
      	-Dsonar.core.codeCoveragePlugin=jacoco
      }
      
      # 构建和上传私有仓库
      build() {
      	# packaging project with mvnw
      	chmod +x mvnw
      	./mvnw clean package -Dmaven.test.skip=true -U
      
      	# building image with docker
      	docker build -t $DOCKER_IMAGE_URL .
      	docker login --username=$DOCKER_USER --password=$DOCKER_PASSWORD $DOCKER_REGISTRY_SERVER
      	docker push $DOCKER_IMAGE_URL
      	docker rmi $DOCKER_IMAGE_URL
      }
      # 部署给测试人员使用
      deploy() {
      
      	# 使用k8s拉取镜像并部署
      	cat k8s/deploy.yaml.tmpl | \
      	sed 's/\$NAMESPACE'"/$NAMESPACE/g" | \
      	sed 's/\$ENV'"/$ENV/g" | \
      	sed 's/\$APP_NAME'"/$APP_NAME/g" | \
      	sed 's/\$DOCKER_REGISTRY_NAME'"/$DOCKER_REGISTRY_NAME/g" | \
      	sed 's/\$HARBOUR_ITEM_NAME'"/$HARBOUR_ITEM_NAME/g" | \
      	sed 's/\$IMAGE_TAG'"/$IMAGE_TAG/g" | \
      	sed 's/\$SPRING_PROFILES_ACTIVE'"/$SPRING_PROFILES_ACTIVE/g" | \
      	kubectl apply -n $NAMESPACE -f - || true
      
      	cat k8s/service.yaml.tmpl | \
      	sed 's/\$NAMESPACE'"/$NAMESPACE/g" | \
      	sed 's/\$ENV'"/$ENV/g" | \
      	sed 's/\$APP_NAME'"/$APP_NAME/g" | \
      	sed 's/\$NODE_PORT'"/$NODE_PORT/g" | \
      	kubectl apply -n $NAMESPACE -f - || true
      }
      
      
      case $1 in
      build | deploy | test)
      $1
      ;;
      *)
      echo "not support!!! example: go <build|deploy|test>"
      exit 1
      ;;
      esac
      
    • Dockerfile对应的内容为

      FROM openjdk:8u181-jre-slim
      
      COPY /target/*.jar /app.jar
      
      ENV LANG C.UTF-8
      ENV SERVER_PORT 8080
      RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
      RUN echo 'Asia/Shanghai' >/etc/timezone
      
      ENTRYPOINT ["java","-jar","/app.jar"]
      
    • k8s对应的内容为

      apiVersion: v1
      kind: Service
      metadata:
        namespace: $NAMESPACE
        name: $APP_NAME
      labels:
        app: $APP_NAME
        env: $ENV
      spec:
        ports:
        - name: $APP_NAME
          port: 8080
          protocol: TCP
          targetPort: 8080
          nodePort: $NODE_PORT
        selector:
          app: $APP_NAME
          env: $ENV
        type: NodePort
      --- 
      apiVersion: extensions/v1beta1
      kind: Deployment
      metadata:
        namespace: $NAMESPACE
        annotations:
          deployment.kubernetes.io/revision: "1"
        labels:
          app: $APP_NAME
        name: $APP_NAME
      spec:
        progressDeadlineSeconds: 600
        replicas: 3
        revisionHistoryLimit: 0
        selector:
          matchLabels:
            app: $APP_NAME
           env: $ENV
        strategy:
          type: RollingUpdate
          rollingUpdate:
           maxSurge: 1
            maxUnavailable: 2
        template:
          metadata:
           labels:
              app: $APP_NAME
              env: $ENV
          spec:
            imagePullSecrets:
           - name: regcred
      
          containers:
           - image: $DOCKER_REGISTRY_NAME/$HARBOUR_ITEM_NAME/$APP_NAME:$IMAGE_TAG
            ports:
             - containerPort: 8080
              name: web
            env:
                - name: SPRING_PROFILES_ACTIVE
                  value: $SPRING_PROFILES_ACTIVE
              imagePullPolicy: Always
              resources:
                limits:
                  cpu: 2
                  memory: 4Gi
                requests:
                  cpu: 1
                  memory: 4Gi
              name: $APP_NAME
              readinessProbe:
                httpGet:
                  path: /doc.html
                  port: 8080
                initialDelaySeconds: 60
                periodSeconds: 2
                failureThreshold: 5
      

END 转载请标明来源

  • 19
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: CI/CD是指持续集成和持续交付/部署的缩写。持续集成是指开发人员将代码频繁地合并到共享存储库中,并通过自动化构建和测试来验证代码的质量。持续交付/部署是指将经过验证的代码自动部署到生产环境中,以实现快速、可靠的软件交付。\[1\]\[2\] 为什么要使用CI/CD呢?使用CI/CD可以提高开发效率,减少人为错误,加快软件交付速度。通过自动化构建、测试和部署流程,可以减少手动操作的时间和错误,提高软件质量和稳定性。此外,CI/CD还可以帮助团队更好地协作,减少开发、测试和运维之间的摩擦。\[2\] 关于CI/CD的完整实战流程,可以按照以下步骤进行: 1. 环境搭建:搭建开发、测试、预发和生产环境,并配置相应的工具和服务。 2. 项目准备:准备项目代码,并将其上传到版本控制系统中。 3. 触发构建:通过WebHook等方式触发自动化构建过程,例如使用Maven进行打包。 4. 代码质量检查:使用工具如SonarQube进行代码质量检查和Code Review。 5. 构建镜像:根据构建的结果,生成容器镜像,以便后续部署使用。 6. 部署到测试环境:将构建好的镜像部署到测试环境,并进行自动化测试,如使用Selenium进行自动化测试。 7. 验证版本更新:模拟版本更新,在测试环境中验证新版本的功能和性能。 8. 部署到生产环境:经过测试验证的代码,自动部署到生产环境中。 9. 流水线部署:建立流水线,实现自动化的构建、测试和部署过程,以实现持续交付和部署。\[2\]\[3\] 这是一个简单的CI/CD实战流程,具体的实施方式可能因组织和项目的不同而有所差异。但总体来说,CI/CD的目标是通过自动化和持续集成来提高软件交付的效率和质量。 #### 引用[.reference_title] - *1* *2* *3* [浅谈CICD与项目实战](https://blog.csdn.net/anqixiang/article/details/105078179)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值