如何 运行 在 jenkins 管道中 运行 sidecar 容器 运行 在 kubernetes 中

How to run sidecar container in jenkins pipeline running inside kubernetes

我需要使用新数据库构建和 运行 一些测试。我虽然使用 sidecar 容器来托管数据库。

我已经使用 google's own tutorial 在我的 kubernetes 集群中使用 helm 安装了 jenkins。 我可以启动简单的 'hello world' 管道,这些管道将在新的 pod 上启动。

接下来,我尝试了Jenkin's documentation 运行将 mysql 的一个实例作为 sidecar。

node {
    checkout scm
    docker.image('mysql:5').withRun('-e "MYSQL_ROOT_PASSWORD=my-secret-pw"') { c ->
        docker.image('mysql:5').inside("--link ${c.id}:db") {
            /* Wait until mysql service is up */
            sh 'while ! mysqladmin ping -hdb --silent; do sleep 1; done'
        }
        docker.image('centos:7').inside("--link ${c.id}:db") {
            /*
             * Run some tests which require MySQL, and assume that it is
             * available on the host name `db`
             */
            sh 'make check'
        }
    }
}

一开始抱怨找不到docker,网上建议使用安装了docker的自定义jenkins slave镜像。

现在,如果我 运行 管道,它只是挂在循环中等待数据库准备就绪。

免责声明:jenkins/docker/kubernetes

的新手

您应该使用 kubectl cli(使用清单 yaml 文件)来创建那些 mysql 和 centos pods、svc 和其他 k8s 对象。 运行 使用 mysql 服务 dns 在 mysql 数据库上进行测试。

这就是我们测试新数据库部署的方式

最终我找到了 this method。 它依赖于 kubernetes 管道插件,并允许 运行在共享资源的同时在代理 pod 中连接多个容器。

注意label不能是已经存在的标签,否则当你去运行时,你的podTemplate会找不到你做的容器。使用这种方法,您将在一个全新的 pod 中创建一组新的容器。

def databaseUsername = 'app'
def databasePassword = 'app'
def databaseName = 'app'
def databaseHost = '127.0.0.1'

def jdbcUrl = "jdbc:mariadb://$databaseHost/$databaseName".toString()

podTemplate(
        label: label,
        containers: [
                containerTemplate(
                        name: 'jdk',
                        image: 'openjdk:8-jdk-alpine',
                        ttyEnabled: true,
                        command: 'cat',
                        envVars: [
                                envVar(key: 'JDBC_URL', value: jdbcUrl),
                                envVar(key: 'JDBC_USERNAME', value: databaseUsername),
                                envVar(key: 'JDBC_PASSWORD', value: databasePassword),
                        ]
                ),
                containerTemplate(
                        name: "mariadb",
                        image: "mariadb",
                        envVars: [
                                envVar(key: 'MYSQL_DATABASE', value: databaseName),
                                envVar(key: 'MYSQL_USER', value: databaseUsername),
                                envVar(key: 'MYSQL_PASSWORD', value: databasePassword),
                                envVar(key: 'MYSQL_ROOT_PASSWORD', value: databasePassword)
                        ],
                )
        ]
) {
  node(label) {

      stage('Checkout'){
          checkout scm
      }

      stage('Waiting for environment to start') {
          container('mariadb') {
              sh """
while ! mysqladmin ping --user=$databaseUsername --password=$databasePassword -h$databaseHost --port=3306 --silent; do
    sleep 1
done
"""
          }

      }

      stage('Migrate database') {
          container('jdk') {
              sh './gradlew flywayMigrate -i'
          }
      }

      stage('Run Tests') {
          container('jdk') {
              sh './gradlew test'
          }
      }
  }
}