簡體   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