私有化部署gitlab,webhooks代码提交和mereged自动触发kubesphere的deveops流水线

一、kubesphere的develops流水线创建

必须使用“使用 Jenkinsfile 创建流水线”,看官方文档:使用 Jenkinsfile 创建流水线

也就是说,Jenkinsfile文件必须git仓库里,我们一般将Jenkinsfile文件放在源码一起同的git仓库,习惯我们放在git仓库的一级目录。

1、创建流水线,点击“代码仓库”---"git",我们在内网搭建的gitlab私有仓库,所以这里选择"git",填写git地址和凭证,点击对钩,“下一步”。

 

2、设置Jenkinsfile路径和查看WebHook地址,如下图

 记住这里的WebHook地址。

“正则过滤”可以过滤分支,比如我们只创建develop分支,正则里填写“develop”;注意,若有多个分支,最好创建2个流水线,不然会同时触发多分支。(若有好的方法再补充)

 kubesphere的流水线配置就这样结束了。Jenkinsfile脚本代码内容:

pipeline {
  agent {
    node {
      label 'base'
    }

  }
  stages {
    stage('拉取代码') {
      agent none
      steps {
        container('base') { 
         // echo "--printenv --" 
         // sh 'printenv'


          checkout(scm)

          script {
             
            gitbranch=env.GIT_BRANCH

            if(env.GIT_BRANCH=="develop"){
               env_name="test"
               env_name_big="Test"
              }
            else if(env.GIT_BRANCH=="master"){ 
               env_name="prod"
               env_name_big="Production" 
            }
            
            
          }
        //  echo "env_name=${env_name}"
        //  echo "env_name_big=${env_name_big}"
        //  echo "gitbranch=${gitbranch}"
        //  echo "GIT_COMMIT=${GIT_COMMIT}" 
         
          sh '''pwd
                ls'''
        }

      }
    }

    stage('构建镜像') {
      agent none
      steps {
        container('base') {

         // echo "env_name=${env_name}"
         // echo "env_name_big=${env_name_big}"
         //  echo "gitbranch=${gitbranch}"
         //  echo "GIT_COMMIT=${GIT_COMMIT}" 

           script { 
             docker_image_url="${REGISTRY}/${DOCKERHUB_NAMESPACE}/${APP_NAME}:${env_name}${timestr}_${BUILD_NUMBER}"
           }
           // echo "docker_image_url=${docker_image_url}"
           //sh "echo ${docker_image_url}"
          
          sh 'mv ${web_dictionary_name}/Dockerfile .'
          sh  " docker build --build-arg ASPNETCORE_ENVIRONMENT=${env_name_big} -t    ${docker_image_url}   .  "
          echo '镜像打tag完成了'

        }

      }
    }

    stage('推送镜像到Harbor仓库') {
      agent none
      steps {
        container('base') {

         // echo "env_name=${env_name}"
         // echo "env_name_big=${env_name_big}"
        //  echo "gitbranch=${gitbranch}"
        //  echo "GIT_COMMIT=${GIT_COMMIT}" 
        //  echo "docker_image_url=${docker_image_url}"

          withCredentials([usernamePassword(credentialsId : 'harbor-auth' ,passwordVariable : 'password_var' ,usernameVariable : 'username_var' ,)]) {
            //echo '本地镜像上传到harbor---start'

            sh " docker login -u ${username_var}  -p ${password_var} ${REGISTRY}"
            sh  " docker push $docker_image_url "
            //echo '本地镜像上传到harbor-ok'
          }

        }

      }
    }

    stage('部署') {
      agent none
       environment {
          env_name_big = "${env_name_big}"
          env_name = "${env_name}"
        }
      steps {
        container('base') {
             
          echo "env_name=${env_name}"
          echo "env_name_big=${env_name_big}"
          echo "gitbranch=${gitbranch}"
          echo "GIT_COMMIT=${GIT_COMMIT}" 
          echo "docker_image_url=${docker_image_url}"

          withCredentials([kubeconfigFile(credentialsId: env.KUBECONFIG_CREDENTIAL_ID, variable: 'KUBECONFIG')]) {
             sh 'envsubst    < ${web_dictionary_name}/deploy/svc.yml | kubectl apply -f -'   
          }
          
          script {

            if(env_name=="prod")
            {              
               // echo "http请求更改版本号"  
               // echo docker_image_url
                sh """ curl -X 'POST'  '${version_update_posturi}' -H 'accept: text/plain'  -H 'Content-Type: application/json-patch+json' -H 'request-from: swagger' -d '{ "appCode": "${APP_NAME}",  "appVersionInfo": "${GIT_COMMIT}",  "dockerImageUrl": "${docker_image_url}" }'"""

                 echo "http请求更改版本号成功!"  
              }
          }

          echo "自动构建成功!"  
        }

      }
    }

  }
  
  environment {
    APP_NAME = 'test-api'
    web_dictionary_name = 'Test.WebAPI' 

    version_update_posturi='http://10.120.34.5/api/version/BuildNum'
    DOCKER_CREDENTIAL_ID = 'dockerhub-id'
    GITHUB_CREDENTIAL_ID = 'github-id'
    KUBECONFIG_CREDENTIAL_ID = 'kubeconfig'
    REGISTRY = '150.10.1.26'
    DOCKERHUB_NAMESPACE = 'default'
    GITHUB_ACCOUNT = 'kubesphere'
    timestr=new Date().format("yyyyMMdd") 
    gitbranch=''
    env_name=''
    docker_image_url=''
  } 
}

还有个坑,我们的kubesphere的版本是3.2.1,更高版本我不清楚。我们部署的是2个集群,一个kubephere主集群和一个成员集群(所有webapi开发的站点都部署在这个集群)。 创建流水线页面上显示的webhooks地址显示的是主集群地址,其实是错误的,应该是成员集群的master的地址。所有gitlab的webhooks的地址一定要是 成员集群master的地址。当然若是“All-In-One”模式就不会有这个问题。

二、gitlab的Webhooks配置

打开刚刚指定的git地址,“Settings”--"Webhooks", URL填写 kubesphere中刚刚看到的webhooks地址。

记住,这里只勾选“Push events”,填写"develop"分支名。

不要勾选“Merge request events”,不要勾选“Merge request events”,不要勾选“Merge request events”。  因为Merge代码请求同意的时候,是推Push事件,所以只要勾选第一个就行了。

为了支持多分支,gitlab里创建多个webhooks。

三、Jenkinsfile脚本编写

需要获取一些git的参数,比如分支名,git commit id等数据。可以先打印下环境变量,若里面有相关的值就可以直接使用。 

sh 'printenv'

就可以发现有几个环境变量可以直接使用。

env.BRANCH_NAME   //分支名
env.GIT_BRANCH    //分支名
env.GIT_COMMIT   //git commit id

猜你喜欢

转载自blog.csdn.net/puzi0315/article/details/126996831