【问题标题】:Jenkins CI/CD for Helm Package and cm-push用于 Helm 包和 cm-push 的 Jenkins CI/CD
【发布时间】:2022-11-11 08:43:35
【问题描述】:

目前,我在一个 GitLab 存储库中有 20 多个 Helm 图表,当我更改 Helm 图表中的任何资源文件并将其推送到 git 时,我想做 Jenkins ci/cd。应该为该特定文件夹运行一项作业,并对该文件夹名称执行 helm package 和 helm cm-push。

我想创建一个 Jenkins 管道,它应该获取从提交更改文件的文件夹名称,并将文件夹名称用作 Helm 包和 helm cm-push cmd 中的变量

注意:多个文件夹或单个“提交”中的 2 或 3 个文件夹中会有更改,因此 Jobs 应该获取文件夹的名称并连续运行 Job 一个一个 将文件夹名称一个一个地设置为变量。 (循环内)

我找到了这个脚本,但是这个脚本在从 Git 提交中获取文件名时我尝试在我的 CI/CD 中设置这个脚本,但它不能根据我的需要工作。而且,此脚本获取文件名的另一件事,如果单个文件夹包含 2 个文件更改,它将显示 2 像这样

 [node-app/Chart.yaml, node-app-backend/configmap.yaml, node-app-backend/deployment.yaml]

但在我们的例子中,它应该是获取文件夹名称并计为一个文件夹,并为通用或同名文件夹运行一次作业

pipeline {
agent any
stages { 
    stage('clone') {
            steps {
                  git branch: 'main', url: 'https://github.com/xxx/sample.git'
            }
    }
    stage('build') {
            steps {
                script {
                      println(getFilesChanged())
                      // Do your cleanup here and then execute the SH block
                }
            }
    }
 }
}

def getFilesChanged() {
  def filesList = []
  def changeLogSets = currentBuild.changeSets
                  for (int i = 0; i < changeLogSets.size(); i++) {
                      def entries = changeLogSets[i].items
                      for (int j = 0; j < entries.length; j++) {
                          def entry = entries[j]
                          def files = new ArrayList(entry.affectedFiles)
                              for (int k = 0; k < files.size(); k++) {
                              def file = files[k]
                              filesList.add(file.path)
              } 
          }
      }
  return filesList
}

【问题讨论】:

    标签: jenkins groovy continuous-integration jenkins-pipeline jenkins-groovy


    【解决方案1】:

    您可以过滤 fileList 以仅具有唯一文件夹。像下面的东西。

    fileList.collect {entry -> return entry.split('/')[0]}.unique()
    

    全功能

    def getFilesChanged() {
      def filesList = []
      def changeLogSets = currentBuild.changeSets
                      for (int i = 0; i < changeLogSets.size(); i++) {
                          def entries = changeLogSets[i].items
                          for (int j = 0; j < entries.length; j++) {
                              def entry = entries[j]
                              def files = new ArrayList(entry.affectedFiles)
                                  for (int k = 0; k < files.size(); k++) {
                                  def file = files[k]
                                  filesList.add(file.path)
                  } 
              }
          }
      return filesList.collect {entry -> return entry.split('/')[0]}.unique()
    }
    

    笔记:上面的代码假设您在根目录中没有任何文件,如果没有,则不会对这些文件进行更改。否则,您可能也必须处理这种情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-06
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多