使用 Jenkins 作业将 Helm 图表部署到 Kubernetes

2024-04-29

我想创建一个 Jenkins 作业,将 Helm Chart 部署到 Kubernetes 集群中。 Helm 图表存储在 Bitbucket 存储库中。

    pipeline {
        agent any
        stages {
            stage('Download Helm Charts') {
                steps {
                    sh "echo 'Downloading Helm Charts from Bitbucket repository...'"
                    git checkout http://192.168.1.30:7990/scm/jen/helm.git
                    // not sure do I need ot point the root folder of the Helm repository or only the single chart
                }
            }
            stage('Test Kubernetes version') {
                steps {
                    sh "echo 'Checking Kubernetes version..'"
                    // How to do remote test of kubernetes version
                }
            }
            stage('Push Helm Charts to Kubernetes') {
                steps {
                    sh "echo 'building..'"
                    // push here helm chart from Jenkins server to Kubernetes cluster
                }
            }     
            stage('Build Image') {
                steps {
                    sh "echo 'building..'"
                    git checkout http://192.168.1.30:7990/scm/jen/spring-boot-microservice.git
                    // execute Java -jar ... and build docker image
                }
            }
            stage('Push Image into Nexus registry') {
                steps {
                    sh "echo 'building..'"
                    // push compiled docker image into Nexus repository
                }
            }
            stage('Deploy Image from Nexus registry into Kubernetes') {
                steps {
                    sh "echo 'building..'"
                }
            }
            stage('Test'){
                steps {
                    sh "echo 'Testing...'"
                    // implement a check here is it deployed sucessfully
                }
            }
        }
    }

我需要在这个 Jenkins 文件中添加什么配置才能从 bitbucket 下载 Heml 图表存储库并将配置应用到 Kubernetes 集群中? 你能给我一个这样的 Jenkins 文件的例子吗?


假设您的 Pipeline 已位于 Helm 图表所在的 Bitbucket 存储库中。以下是存储库的示例结构。

jenkins
├── app1-charts
│   ├── Chart.yaml
│   ├── templates
│   │   ├── app1.yml
│   │   └── _helpers.tpl
│   └── values.yaml
└── Jenkinsfile

The Jenkinsfile在根目录中会有一个简单的管道,如下所示。

pipeline {
    agent any
    stages {
        stage('Build1') {
            steps { 
                echo "Doing some build here if you need"
            }
        }
        
        stage('Applying helm charts') {
            steps {
                echo "Running Helm"
                sh "helm upgrade --wait --timeout 60 --set image.tag=${SOME_INPUT} app1-name ./app1-charts"
            }
        }
    }
}

上述管道假设您在 Jenkins 代理中设置了 Helm。现在在 Jenkins 中,您可以创建一个新的管道作业并选择该选项Pipeline Script from SCM,然后提供 Bitbucket 配置。

确保Script Path设置为指向您的Jenkinsfile。另外,请确保Lightweight checkout未选中。

添加配置后,这将克隆带有 Helm 图表的存储库,并在存储库中运行管道,该管道将执行 Helm 图表。

更新:检查 bitbucket 存储库的管道

检查以下管道示例。如果存储库是私有的,您可能必须生成具有必要权限的访问令牌才能签出存储库。

pipeline {
    agent any

    stages {
        stage('checkout') {
            steps {
                echo 'Checking out code from bitbucket'
                git(url: 'https://x-token-auth:[email protected] /cdn-cgi/l/email-protection/ORG_NAME/your-repo.git', branch: 'master')
                sh """
                cd your-helm-directory
                helm install .............. Or whatever command you need
                """
            }
        }
    }
}

Update

pipeline {
    agent any
    stages {
        stage('Download Helm Charts') {
            steps {
                sh "echo 'Downloading Helm Charts from Bitbucket repository...'"
                git(url: 'http://192.168.1.30:7990/scm/jen/helm.git', branch: 'master')
                
            }
        }
        stage('Test Kubernetes version') {
            steps {
                sh "echo 'Checking Kubernetes version..'"
                sh'''
                  kubectl version -o json // After getting the verson do whatever validations. 
                '''
            }
        }
        stage('Push Helm Charts to Kubernetes') {
            steps {
                sh "echo 'building..'"
                sh """
                  cd your-helm-directory
                  helm install .............. Or whatever command you need
                """
            }
        }     
        stage('Build Image') {
            steps {
                sh "echo 'building..'"
                git checkout http://192.168.1.30:7990/scm/jen/spring-boot-microservice.git
                // execute Java -jar ... and build docker image
                sh'''
                 git clone http://192.168.1.30:7990/scm/jen/spring-boot-microservice.git
                  cd TO_JAR_LOCATION 
                  Java -jar some.jsr
                  #Assuming you have a docker file defined
                  docker build -t nexusurl/Imagename:5.0 .
                '''
            }
        }
        stage('Push Image into Nexus registry') {
            steps {
                sh "echo 'building..'"
                sh'''
                  docker push nexusurl/Imagename:1.0
                '''
                // push compiled docker image into Nexus repository
            }
        }
        stage('Deploy Image from Nexus registry into Kubernetes') {
            steps {
                sh "echo 'building..'"
                # This again depends on how you plan to update. Assuming you are using the same helm charts then you can override what ever imagetag in your values file and run. Or else update the values file and then run. 
                sh'''
                    helm install --set image.tag=5.0
                '''
            }
        }
        stage('Test'){
            steps {
                sh "echo 'Testing...'"
                // This depends on how you have written your tests. 
            }
        }
    }
}

Update

这是如何列出图像的完整工作示例。

pipeline {
    agent any

    stages {
        stage('Hello') {
            steps {
                echo 'Hello World'
                script {
                    INPUT_IMAGE_TO_DEPLOY = input message: 'Please Select Docker Image to deploy', ok: 'Next',
                                                          parameters: [
                                                          choice(name: 'IMAGE_NAME', choices: getDockerImages(), description: 'Select Docker Image to delete')]
                }
            }
        }
    }
}

def getDockerImages() {
    REPOSITORY = 'YOUR_REPO_NAME'
    output = sh(returnStdout: true, script: "aws ecr list-images --repository-name $REPOSITORY --output json").trim()
    json = readJSON text: output
    println json
    return json.imageIds.imageTag
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Jenkins 作业将 Helm 图表部署到 Kubernetes 的相关文章

随机推荐

  • git Cherry-pick 和 git show 有什么区别?补丁-p1?

    我遇到了一种情况git cherry pick X会产生一些冲突 但也会创建额外的插入 当使用git diff 然后我重新跑了git show X gt my patch 然后做了patch p1 lt my patch在我的树上 我得到了
  • 如何使用 QWebElement 设置 input(type="file") 的值?

    我正在尝试将照片上传到vk com https vk com using QtWebKit https qt project org doc qt 4 8 qtwebkit html模块 我面临的问题是无法正确填写input type fi
  • 在 SQL Server 中以编程方式创建数据库

    如何以编程方式创建数据库以及执行此操作所需的最少信息是什么 Please没有 SQL Server 管理对象 API 建议 您可以使用SQL Server 管理对象 API http msdn microsoft com en us lib
  • jQuery UI:DatePicker,仅选择今天到过去的日期

    我在 jQuery UI 核心中使用 datePicker 我需要一个只能选择从过去一直到今天的日期的日期选择器 是否有捷径可寻 请注意 我使用的是 UI 核心 而不是 DatePicker 插件 我的 jQuery 调用 function
  • Java线程的等待和通知方法

    我正在学习 OCJP 现在我在 线程 章节 我有一些关于等待和通知方法的问题 我想我明白这里发生了什么 但我只是想确保我走在正确的道路上 我编写了这段代码作为示例 package threads public class Main stat
  • SQL Server 2008:在没有任何锁的情况下出现死锁

    我目前正在 SQL Server 2008 数据库上进行一些实验 更具体地说 我有一个 JDBC 应用程序 它使用数百个并发线程来执行数千个任务 每个任务都在数据库上运行以下查询 UPDATE from Table A where rowI
  • MVC3 BeginForm 不渲染
    标签

    我的视图存在问题 未呈现开始和结束 FORM 标签 下面是我的控制器的代码 HttpGet Authorize public ActionResult Edit long id Position position positionRepos
  • C++中while(x--)是什么意思

    我刚刚开始竞争性编程 并一直使用如下循环来定义大多数练习问题中的测试用例数量 for int i 1 i lt t i 然而 我见过人们使用 while 循环 它只有条件 t 运行起来也完全没问题 有人可以向我解释这种情况实际上是如何运作的
  • 无法解析 Android 资源字符串

    我正在学习 Android 我遇到了一个我认为很奇怪的问题 在 res values strings xml 我有
  • mariadb: jdbc: setTimestamp 截断毫秒

    在我看来 如果我使用准备好的语句将它们插入到我的 mariadb 中 毫秒就会被截断 谷歌搜索并不成功 我发现了很多类似的问题 这些问题要么已解决 要么不适用 但很难相信我是唯一一个遇到这个问题的人 所以我想在向 mariadb 提交错误之
  • 分析 Cortex-M7 (stm32f7) 上的 memcpy 性能

    简洁版本 从 GNU ARM 工具链中提取的 memcpy 的性能指标在 ARM Cortex M7 上对于不同的副本大小似乎差异很大 即使复制数据的代码始终保持不变 这可能是什么原因造成的 长版 我是使用 GNU Arm 工具链 11 2
  • 重写 openshift maven 脚本 (jenkins gear)

    我在 Openshift 上有 Jenkins 实例 我已启用 Jenkins 构建我的 Openshift 应用程序 这里是 Jenkins shell 脚本的一部分并记录它们生成的内容 Sync any libraries rsync
  • 如何将文本放置在 Font Awesome 图标上?

    有没有办法垂直对齐堆叠在 Font Awesome 图标顶部的文本 我想将这个堆栈中的 1 向上移动 以便它位于奖杯图标的杯子中央 我尝试在封装 1 的范围中添加底部边距和底部填充 但都没有成功 有没有一种简单的方法可以完成我想要完成的任务
  • 循环中的 Google 地图地理编码和标记

    我在这里完全困惑了 我有一个对象列表 每个对象都包含一个位置 我使用 google maps geocoder 查找这个位置 然后在地图上为该位置放置一个标记 但由于某种原因 只出现一个标记 我想这与我在其他线程中看到的闭包问题有关 但我似
  • 如何清除 asyncfileupload 的文本框值..?

    有一个按钮 MyButton 单击此按钮时 会出现一个 modalpopup MyPopup 其中包含一个 asyncfileupload ajax 控件 确定 按钮和 取消 按钮 asyncfileupload 功能的浏览功能工作正常 没
  • 从已知视频 ID 中获取 YouTube 视频标题

    我想在视频 ID 已知时仅使用 JavaScript 获取 YouTube 视频标题 是否可以 是的 可以使用 Javascript 和 JSON https developers google com youtube 2 0 develo
  • 如何在 uiview 中添加边框?

    我有一个 uiview 我想在这个 UIVIew 旁边添加一个边框 大约占 UIView 的 75 任何人都可以帮忙解决这个问题吗 我可以找到将边界绘制到外面的解决方案 好吧 不只是可以设置一个小属性来将边框与外部对齐 它向内部对齐绘制 因
  • d3.js v4 中的 d3.locale(),本地化

    我正在使用 d3 js 制作图表 现在想将其更新到 v4 结果发现d3 locale 由于所有日期格式的翻译都采用不同的语言 因此不再起作用 我该如何解决这个问题 我正在挖掘论坛 但对于 v4 我并没有真正找到它 你必须使用d3 timeF
  • Fortran 函数:指针作为实际参数,目标作为形式

    我正在尝试破译 Fortran 代码 它将指向函数的指针作为实际参数传递 而形式参数则是目标 它在主程序中定义并分配一个 globalDATA 类型的指针 然后调用一个传递该指针的函数 module dataGLOBAL type glob
  • 使用 Jenkins 作业将 Helm 图表部署到 Kubernetes

    我想创建一个 Jenkins 作业 将 Helm Chart 部署到 Kubernetes 集群中 Helm 图表存储在 Bitbucket 存储库中 pipeline agent any stages stage Download Hel