Gitlab をプライベートにデプロイし、Webhook コードを送信し、マージして kubesphere の開発パイプラインを自動的にトリガーします

1. kubesphere の開発パイプラインの作成

「Jenkinsfile を使用してパイプラインを作成する」を使用する必要があります。公式ドキュメントを参照してください: Jenkinsfile を使用してパイプラインを作成する

つまり、Jenkinsfile ファイルは git ウェアハウスに存在する必要があります。通常、Jenkinsfile ファイルはソース コードと同じ git ウェアハウスに配置され、git ウェアハウスの第 1 レベルのディレクトリに配置されることに慣れています。

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=''
  } 
}

もう 1 つの落とし穴があります。kubesphere のバージョンは 3.2.1 ですが、それより上位のバージョンはわかりません。kubephere メイン クラスターとメンバー クラスターの 2 つのクラスターをデプロイします (webapi で開発されたすべてのサイトはこのクラスターにデプロイされます)。パイプライン作成ページに表示される Webhook アドレスにはメイン クラスターのアドレスが表示されますが、これは実際には間違っており、メンバー クラスターのマスターのアドレスである必要があります。すべての gitlab Webhook のアドレスは、メンバー クラスター マスターのアドレスである必要があります。もちろん、「All-In-One」モードであればそのような問題はありません。

2. gitlabのWebhook設定

先ほど指定した git アドレス (「設定」--「Webhooks」) を開き、kubesphere で確認した Webhook アドレスを URL に入力します。

ここでは「イベントのプッシュ」のみをチェックし、「開発」ブランチ名を入力することに注意してください。

「リクエストイベントのマージ」のチェックを外し、「リクエストイベントのマージ」のチェックを外し、「リクエストイベントのマージ」のチェックを外します。Merge コードが同意を要求すると、Push イベントがプッシュされるため、確認する必要があるのは最初のイベントだけです。

複数のブランチをサポートするには、gitlab で複数の Webhook を作成します。

3. Jenkinsfile スクリプト

ブランチ名、git コミット ID、その他のデータなど、いくつかの git パラメーターを取得する必要があります。最初に環境変数を出力し、そこに関連する値がある場合は、それらを直接使用できます。 

sh 'printenv'

直接使用できる環境変数がいくつかあることがわかります。

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

おすすめ

転載: blog.csdn.net/puzi0315/article/details/126996831