• 飞天使-学以致用-devops知识点4-SpringBoot项目CICD实现(实验失败,了解大概流程)


    代码准备

    推送代码到gitlab
    代码去叩叮狼教育找 k8sk8s

    创建jenkins 任务

    创建一个k8s-cicd-demo 流水线任务

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    将jenkins 里面构建时候的地址还有token, 给到gitlab里面的webhooks 粘贴好
    http://108.1.1.1:31861/project/k8s-cicd-demo
    3b2976e09fb121a1d949c15289a87727
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    测试推送

    在这里插入图片描述
    在这里插入图片描述

    使用项目里面的jenkinsfile 进行升级操作

    任务构建里面选择git 的http地址
    在这里插入图片描述
    在这里插入图片描述

    创建harbor 凭据
    在这里插入图片描述

    配置kubeconfig
    管理Jenkins-> Managed files->Add->Custom file ->Content字段内容是kubeconfig(默认路径在master节点/root/.kube/config–> cat /root/.kube/config)获取内容

    在这里插入图片描述

    文字版本流程

    在这里插入图片描述

    配置流水线节点标签
    系统管理 > 节点管理 > 列表中 master 节点最右侧的齿轮按钮

    修改标签的值与项目中 Jenkinsfile 中 agent > kubernetes > label 的值相匹配

    在首页点击 Create a Job 创建一个流水线风格的项目

    ----------- Jenkins 流水线项目 Webhook 配置 -----------
    在 Jenkins 项目配置下找到构建触发器栏目

    勾选 Build when a change is pushed to GitLab. GitLab webhook URL: http://192.168.113.121:31216/project/k8s-cicd-demo

    上方的 URL 就是用于配置到 gitlab 项目 webhook 的地址
    生成的token也复制到gitlab 的webhook地址中去

    启用 Gitlab 构建触发器:
    Push Events:勾选,表示有任意推送到 git 仓库的操作都会触发构建
    Opend Merge Request Events:勾选,表示有请求合并时触发构建

    点击高级 > Secret Token > Generate 按钮,生成 token

    保存以上配置

    ----------- GitLab 项目 Webhook 配置 -----------
    进入 GitLab 项目设置界面 > Webhooks

    将上方 Jenkins 中的 URL 配置到 URL 处

    将上方生成的 Secret Token 配置到 Secret 令牌

    按照需求勾选触发来源,这里我依然勾选 推送事件、合并请求事件

    取消 SSL 验证

    点击添加 webhook 按钮,添加后可以点击测试确认链接是否可以访问

    流水线:选择定义为 Pipeline script from SCM 从远程仓库拉取 Jenkinsfile 配置
    配置 SCM 为 Git
    Repositories:
    Repository URL:仓库地址
    Credentials:仓库访问的账号密码
    Branches to build:选择拉取哪个分支下的代码
    脚本路径:Jenkinsfile 脚本文件名称以及所在路径

    通过系统管理 > Manage Credentials > 凭据 > System > 全局凭证 > Add Credentials 添加 Username with password 类型凭证

    填写好用户名密码后,需要注意凭证 id 要与 Jenkinsfile 中的 DOCKER_CREDENTIAL_ID 一致

    通过系统管理 > Manage Credentials > 凭据 > System > 全局凭证 > Add Credentials 添加 Username with password 类型凭证

    填写好用户名密码后,需要注意凭证 id 要与 Jenkinsfile 中的 GIT_CREDENTIAL_ID 一致

    # 1. 事先安装 Config File Provider 插件
    # 2. 进入系统管理 > Mapped files > Add a new Config 添加配置文件
    # 2.1 Type 选择 Custom file 点击 next
    # 2.2 在 k8s master 节点执行 cat ~/.kube/config 查看文件内容,并将所有内容复制
    # 2.3 将复制的内容贴到 Config file 的 Content 中后点击 Submit 保存并提交
    # 3. 复制保存后文件 id 到 Jenkinsfile 中的 KUBECONFIG_CREDENTIAL_ID 处
    
    # 1. 进入 SonarQube 系统,点击右上角用户头像 > 我的账号 进入设置页面
    # 2. 点击 安全 > 填写令牌名称 > 点击生成按钮生成 token > 复制生成后的 token
    # 3. 进入 jenkins 添加凭证管理页面,添加 Secret Text 类型的凭证,将 token 贴入其中
    # 4. 保证凭证 id 与 Jenkinsfile 文件中的 SONAR_CREDENTIAL_ID 一致
    
    
    # 1. 进入 SonarQube 管理页面,点击顶部菜单栏的配置 > 配置(小三角) > 网络调用
    # 2. 点击右侧创建按钮创建新的 Webhook,并填写名称与地址
    # 名称:jenkins
    # 地址:http://jenkins访问ip:端口/sonarqube-webhook/
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    项目构建

    方式一:在 Jenkins 管理后台,进入项目中点击立即构建进行项目构建

    方式二:在开发工具中修改代码,并将代码提交到远程仓库自动触发构建

    在这里插入图片描述

    jenkinsfile代码参考逻辑

    pipeline {
      agent {
        node {
          label 'maven'
        }
    
      }
      stages {
        stage('clone code') {
          steps {
            container('maven') {
              git(url: 'http://108.1.1.1:28080/gitlab-instance-1a76a240/k8s-cicd-demo.git', credentialsId: 'git-user-pass', branch: '$BRANCH_NAME', changelog: true, poll: false)
            }
    
          }
        }
    
        stage('unit test') {
          steps {
            container('maven') {
              sh 'mvn clean test'
            }
    
          }
        }
    
        stage('sonarqube analysis') {
          agent none
          steps {
            withCredentials([string(credentialsId : 'sonarqube' ,variable : 'SONAR_TOKEN' ,)]) {
              withSonarQubeEnv('sonar') {
                container('maven') {
                  sh '''mvn sonar:sonar -Dsonar.projectKey=$APP_NAME
    echo "mvn sonar:sonar -Dsonar.projectKey=$APP_NAME"'''
                }
    
              }
    
              timeout(unit: 'MINUTES', activity: true, time: 5) {
                waitForQualityGate 'true'
              }
    
            }
    
          }
        }
    
        stage('build & push') {
          steps {
            container('maven') {
              sh 'mvn clean package -DskipTests'
              sh 'docker build -f Dockerfile -t $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BUILD_NUMBER .'
              withCredentials([usernamePassword(credentialsId : 'harbor-user-pass' ,passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,)]) {
                sh '''echo "$DOCKER_PASSWORD" | docker login $REGISTRY -u "$DOCKER_USERNAME" --password-stdin
    docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BUILD_NUMBER'''
              }
    
            }
    
          }
        }
    
        stage('push latest') {
          when {
            branch 'master'
          }
          steps {
            container('maven') {
              sh 'docker tag $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BUILD_NUMBER $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:latest'
              sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:latest'
            }
    
          }
        }
    
        stage('deploy to dev') {
          steps {
            container('maven') {
              input(id: 'deploy-to-dev', message: 'deploy to dev?')
              withCredentials([kubeconfigContent(credentialsId : 'kubeconfig-id' ,variable : 'ADMIN_KUBECONFIG' ,)]) {
                sh 'mkdir -p ~/.kube/'
                sh 'echo "$ADMIN_KUBECONFIG" > ~/.kube/config'
                sh '''sed -i\'\' "s#REGISTRY#$REGISTRY#" deploy/cicd-demo-dev.yaml
    sed -i\'\' "s#DOCKERHUB_NAMESPACE#$DOCKERHUB_NAMESPACE#" deploy/cicd-demo-dev.yaml
    sed -i\'\' "s#APP_NAME#$APP_NAME#" deploy/cicd-demo-dev.yaml
    sed -i\'\' "s#BUILD_NUMBER#$BUILD_NUMBER#" deploy/cicd-demo-dev.yaml
    kubectl apply -f deploy/cicd-demo-dev.yaml'''
              }
    
            }
    
          }
        }
    
        stage('push with tag') {
          agent none
          when {
            expression {
              params.TAG_NAME =~ /v.*/
            }
    
          }
          steps {
            input(message: 'release image with tag?', submitter: '')
            withCredentials([usernamePassword(credentialsId : 'gitlab-user-pass' ,passwordVariable : 'GIT_PASSWORD' ,usernameVariable : 'GIT_USERNAME' ,)]) {
              sh 'git config --global user.email "liugang@wolfcode.cn" '
              sh 'git config --global user.name "xiaoliu" '
              sh 'git tag -a $TAG_NAME -m "$TAG_NAME" '
              sh 'git push http://$GIT_USERNAME:$GIT_PASSWORD@$GIT_REPO_URL/$GIT_ACCOUNT/k8s-cicd-demo.git --tags --ipv4'
            }
    
            container('maven') {
              sh 'docker tag $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BUILD_NUMBER $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:$TAG_NAME'
              sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:$TAG_NAME'
            }
    
          }
        }
    
        stage('deploy to production') {
          agent none
          when {
            expression {
              params.TAG_NAME =~ /v.*/
            }
    
          }
          steps {
            input(message: 'deploy to production?', submitter: '')
            container('maven') {
              sh '''sed -i\'\' "s#REGISTRY#$REGISTRY#" deploy/cicd-demo.yaml
    sed -i\'\' "s#DOCKERHUB_NAMESPACE#$DOCKERHUB_NAMESPACE#" deploy/cicd-demo.yaml
    sed -i\'\' "s#APP_NAME#$APP_NAME#" deploy/cicd-demo.yaml
    sed -i\'\' "s#TAG_NAME#$TAG_NAME#" deploy/cicd-demo.yaml
    
    kubectl apply -f deploy/cicd-demo.yaml'''
            }
    
          }
        }
    
      }
      environment {
        REGISTRY = '108.1.1.1:8858'
        DOCKER_CREDENTIAL_ID = 'harbor-user-pass'
        GIT_REPO_URL = '108.1.1.1:28080'
        GIT_CREDENTIAL_ID = 'git-user-pass'
        KUBECONFIG_CREDENTIAL_ID = '804095f0-4bf5-4aed-b920-3f45a586bf52'
        DOCKERHUB_NAMESPACE = 'wolfcode'
        GITHUB_ACCOUNT = 'root'
        APP_NAME = 'k8s-cicd-demo'
      }
      parameters {
        string(name: 'BRANCH_NAME', defaultValue: 'master', description: '请选择要发布的分支')
        string(name: 'TAG_NAME', defaultValue: 'snapshot', description: '标签名称,必须以 v 开头,例如:v1、v1.0.0')
      }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158

    参考资料:叩叮狼教育

  • 相关阅读:
    交错攻击 | 平行会话攻击 | 反射攻击 | 类型错误攻击
    芯片学习记录MP2144
    【洛谷 P2678】[NOIP2015 提高组] 跳石头 题解(二分答案+循环)
    修改huggingface的缓存路径
    多线程【thread】【queue储存、锁】【2】
    volatile底层原理的再次理解
    Spring Cloud Config、Apollo、Nacos和Archaius对比
    测试开发——禅道
    如何看待时间序列与机器学习?
    猿创征文|【Typescript】搭建TS的编译环境
  • 原文地址:https://blog.csdn.net/startfefesfe/article/details/136356780