繁体   English   中英

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

[英]How to run sidecar container in jenkins pipeline running inside kubernetes

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

我使用google自己的教程在我的kubernetes集群中使用helm安装了jenkins。 我可以启动简单的“hello world”管道,它将从一个新的pod开始。

接下来,我尝试使用Jenkin的文档来运行mysql实例作为边车。

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新手

最终我发现了这种方法 它依赖于kubernetes管道插件,并允许在共享资源的同时在代理窗格中运行多个容器。

请注意, 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'
          }
      }
  }
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM