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

时间:2019-02-08 09:53:13

标签: docker jenkins kubernetes continuous-integration continuous-deployment

我需要使用一个新的数据库来构建和运行一些测试。我虽然使用了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从映像。

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

免责声明:jenkins / docker / kubernetes的新手

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

最终我找到了this method。 它依赖kubernetes管道插件,并允许在共享资源的同时在代理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'
          }
      }
  }
}

相关问题