将Kubernetes集群凭据存储在Jenkins中并在声明性管道中使用

ev7lccsx  于 2022-11-28  发布在  Jenkins
关注(0)|答案(2)|浏览(165)

我正在尝试使用Helm 3和jenkins部署k8s集群。Jenkins和k8s运行在不同的服务器上。我合并了kubeconfig文件,所有信息都在一个配置文件./kube目录中。我想根据GIT_分支值将我的应用程序部署到相关的环境和命名空间。我对以下脚本有两个问题。
1.什么是最好的方式应该我存储k8s集群凭证,并将在管道中使用。我看到一些插件,如Kubernetes CLI,但我不能肯定它是否会满足我的要求。如果我使用这个插件,我应该存储k8s文件到Jenkins机器手动或这个插件已经处理这个上传配置文件。
2.我是否应该更改以下脚本中的任何内容以遵循最佳实践?

stage('Deploy to dev'){
         script{
             steps{
                 if(env.GIT_BRANCH.contains("dev")){

                        def namespace="dev"
                        def ENV="development"

                        withCredentials([file(credentialsId: ...)]) {
                        // change context with related namespace
                        sh "kubectl config set-context $(kubectl config current-context) --namespace=${namespace}"

                        //Deploy with Helm
                        echo "Deploying"
                        sh "helm upgrade --install road-dashboard -f values.${ENV}.yaml --set tag=$TAG --namespace ${namespace}"    
                 }
             }
         }
     }

    stage('Deploy to Test'){
        script{
            steps{
                 if(env.GIT_BRANCH.contains("test")){

                        def namespace="test"
                        def ENV="test"

                        withCredentials([file(credentialsId: ...)]) {
                        // change context with related namespace
                        sh "kubectl config set-context $(kubectl config current-context) --namespace=${namespace}"

                        //Deploy with Helm
                        echo "Deploying"
                        sh "helm upgrade --install road-dashboard -f values.${ENV}.yaml --set tag=$TAG --namespace ${namespace}"
                    }
                }
            }
        }
    }

    stage ('Deploy to Production'){

        when {
            anyOf{
                environment name: 'DEPLOY_TO_PROD' , value: 'true'
            }
        }

        steps{
            script{
                DEPLOY_PROD = false
                def namespace = "production"

                withCredentials([file(credentialsId: 'kube-config', variable: 'kubecfg')]){
                    //Change context with related namespace
                    sh "kubectl config set-context $(kubectl config current-context) --namespace=${namespace}"

                    //Deploy with Helm
                    echo "Deploying to production"
                    sh "helm upgrade --install road-dashboard -f values.${ENV}.yaml --set tag=$TAG --namespace ${namespace}"
                }
            }
        }
    }
xmjla07d

xmjla07d1#

我从来没有尝试过这种方法,但是理论上credentials变量可以作为环境变量使用。

withCredentials([file(credentialsId: 'secret', variable: 'KUBECONFIG')]) {

  // change context with related namespace
  sh "kubectl config set-context $(kubectl config current-context) --namespace=${namespace}"

  //Deploy with Helm
  echo "Deploying"
  sh "helm upgrade --install road-dashboard -f values.${ENV}.yaml --set tag=$TAG --namespace ${namespace}"
}
kr98yfug

kr98yfug2#

对我有效的解决方法:

withCredentials([file(credentialsId: 'k8s-dk-staging', variable: 'KUBECRED')]) {
   sh 'cat $KUBECRED > ~/.kube/config'
   sh './deploy-app.sh'
}

我不喜欢这样做,理想情况下我会使用 KUBECONFIG,但目前这是为我工作。

相关问题