Google Container Registry和Jenkins

时间:2016-11-29 08:53:45

标签: jenkins-plugins kubernetes google-container-registry

我一直在尝试设置Jenkins以在教程中使用Kubernetes。我一切都工作得很好,但我一直在尝试使用Kubernetes Jenkins插件添加一些自定义图像。似乎任何公共图像都可以正常工作,但是当我创建一个图像并将其放入我的私有容器注册表中时,Jenkins奴隶就失败了。

我想知道如何最好地利用Jenkins内容器注册表中的图像。我找到了这个教程(https://cloud.google.com/solutions/jenkins-on-container-engine#customizing_the_docker_image)。当我通过构建jenkins-slave图像并将其推送到我的仓库来尝试这些步骤时,它不起作用。每当它抱怨奴隶离线并且无法联系时。

2 个答案:

答案 0 :(得分:1)

从未尝试过google容器注册表,但据我所知,您可以使用完整的repo +图像名称。就像是: gcr.io/my_project/image:tag

确保您的图片/回购邮件与Google云端的kubernetes和jenkins位于同一服务帐户下!

答案 1 :(得分:0)

当容器构建代理(旧术语为 slave)在 Jenkins 中显示为 Offline 时,这通常意味着如果使用 Pipeline,则 Jenkinsfile 中存在错误,或者存在问题拉取代理镜像容器。

如果您使用的是 Kubernetes 插件,您将在 Kubernetes pod 上以及该插件的较新版本的构建日志中看到错误。对于 docker 插件容器,错误可能在构建日志中不可见,但会在 docker 日志中。

这通常是从注册表中提取映像的身份验证或访问问题。

如果您使用 Jenkins Kubernetes plugin,则 Pod YAML 或 Pod 模板必须包含您希望从中提取容器映像的 Container Registry 的 imagePullSecrets .

Jenkins 脚本管道:

node {
  podTemplate(cloud: 'kubernetes', containers: [
    containerTemplate(
      name: 'mine',
      image: 'my-image:v1.2',
      ttyEnabled: true,
    ),
  ], 
  imagePullSecrets: [ 'my-credentials-id' ]) {
    sh 'run command'
  }
}

Jenkins 声明式管道:

pipeline {
  agent {
    kubernetes {
      cloud 'kubernetes'
      defaultContainer 'mine'
      yaml '''
apiVersion: v1
kind: Pod
metadata:
  labels:
    build: my-app
spec:
  containers:
    - name: mine
      image: my-image:v1.2
      command:
        - cat
      tty: true
  imagePullSecrets:
    - name: my-image-pull-cred
    '''
    }
  }

  stages {
    stage('Run Build') {
      steps {
        sh 'mvn -version'
      }
    }
  }
}

如果您使用的是 Docker plugin,则需要定义 docker 代理 withRegistry,它允许您为从中传递注册中心的 Jenkins 凭据希望从中提取容器映像。

Jenkins 脚本管道:

node {
  docker.withRegistry('https://my-registry.gcr.io', 'my-credentials-id') {
    docker.image('my-image:v1.2').inside {
      sh 'run command'
    }
  }
}

Jenkins 声明式管道:

pipeline {
  agent {
    docker {
      image 'my-image:v1.0'
      registryUrl 'https://my-registry.gcr.io'
      registryCredentialsId 'my-credentials-id'
    }
  }

  stages {
    stage('Build') {
      steps {
        sh 'run command'
      }
    }
  }
}