簡體   English   中英

如何在 Jenkins 容器化 docker 環境中運行 liquibase docker 鏡像

[英]How to run the liquibase docker image in Jenkins containerized docker environment

我正在用 liquibase docker 鏡像做 POC,

我想使用 Jenkins kubernetes POD 模板在liquibase運行liquibase鏡像。 不幸的是無法做到。

我還附上了 Jenkins 文件和我的觀察。

詹金斯文件

def workspace_dir = "/home/jenkins/agent/workspace/${env.JOB_BASE_NAME}"
def project_name = "master-chart"
def isDeployerJob = (env.JOB_BASE_NAME).contains("deploy") ? "true" : "false"

// These variables come from the build parameters in the Jenkins job
def git_branch = git_branch
def release_version


if (isDeployerJob == "true") {
    // Extracting the release version from the branch
    def temp = git_branch.split("/")
    release_version = temp[temp.length - 1]

    switch(environment) {
      case "dev":
        hs_jdbc_url="jdbc:postgresql://40.xx.xx.xx:5432/dbname"
        db_username="username"
        db_password="pwd"
        break
      default:
        break
    }
} 

pipeline {

  agent {
    kubernetes {
      cloud 'eks-tools-13'
      yaml """
apiVersion: v1
kind: Pod
spec:
  containers:
  - name: azcli-kubectl-helm
    image: internal.docker.cioxhealth.com/azcli-kubectl-helm
    command:
      - cat
    tty: true
  - name: docker
    image: docker
    command:
      - cat
    tty: true
    privileged: true
    volumeMounts:
      - name: dockersock
        mountPath: /var/run/docker.sock
  volumes:
    - name: dockersock
      hostPath:
        path: /var/run/docker.sock
"""
    }
  }

  stages {
        
    stage('Install Database Scripts') {
      when {
        expression {
          "${isDeployerJob}" == "true"
        }
      }
      steps {
        container('docker') { 
            sh """
               docker run --rm --network="host" -v ${workspace_dir}/db:/liquibase/changelog liquibase/liquibase --url=${hs_jdbc_url} --changeLogFile=db.changelog-master.yaml --driver=org.postgresql.Driver --username=${db_username} --password=${db_password} --logLevel=info  update
            """
        }
      }
    }   
  
  }
}

為了驗證文件,我已經開始運行容器

詹金斯主節點: ls -ltr /home/jenkins/agent/workspace/master-chart-deploy/db

total 4
drwxr-xr-x    3 1000     1000            21 Nov  6 04:35 sql
drwxr-xr-x    3 1000     1000            21 Nov  6 04:35 rollback
drwxr-xr-x    4 1000     1000            35 Nov  6 04:35 migration
-rw-r--r--    1 1000     1000           154 Nov  6 04:35 db-master-changelog.yaml
drwxr-xr-x    2 1000     1000            38 Nov  6 04:35 changelog

master-chart-deploy-259-qxrn5-nqq7j-hhlb8 上的 Docker 容器

ls -ltr /home/jenkins/agent/workspace/master-chart-deploy/db

total 4
drwxr-xr-x    3 1000     1000            21 Nov  6 04:35 sql
drwxr-xr-x    3 1000     1000            21 Nov  6 04:35 rollback
drwxr-xr-x    4 1000     1000            35 Nov  6 04:35 migration
-rw-r--r--    1 1000     1000           154 Nov  6 04:35 db-master-changelog.yaml
drwxr-xr-x    2 1000     1000            38 Nov  6 04:35 changelog

Liquibase 容器

docker run --rm '--network=host' -v /home/jenkins/agent/workspace/master-chart-deploy/db:/liquibase/changelog liquibase/liquibase -- ls -ltr /liquibase/changelog

共 0

liquibase運行容器中的文件不可用。 因此,發生了以下錯誤。

錯誤:

Starting Liquibase at 14:50:38 (**version 4.1.1** #10 built at 2020-10-12 19:24+0000)
[2020-11-05 14:50:38] INFO [liquibase.lockservice] Successfully acquired change log lock
[2020-11-05 14:50:38] INFO [liquibase.lockservice] Successfully released change log lock
Unexpected error running Liquibase: db-master-changelog.yaml does not exist
For more information, please use the --logLevel flag
[2020-11-05 14:50:38] SEVERE [liquibase.integration] Unexpected error running Liquibase: db-master-changelog.yaml does not exist
liquibase.exception.ChangeLogParseException: db-master-changelog.yaml does not exist
    at liquibase.parser.core.yaml.YamlChangeLogParser.parse(YamlChangeLogParser.java:27)
    at liquibase.Liquibase.getDatabaseChangeLog(Liquibase.java:337)
    at liquibase.Liquibase.lambda$update$1(Liquibase.java:229)
    at liquibase.Scope.lambda$child$0(Scope.java:160)
    at liquibase.Scope.child(Scope.java:169)
    at liquibase.Scope.child(Scope.java:159)
    at liquibase.Scope.child(Scope.java:138)
    at liquibase.Liquibase.runInScope(Liquibase.java:2277)
    at liquibase.Liquibase.update(Liquibase.java:215)
    at liquibase.Liquibase.update(Liquibase.java:201)
    at liquibase.integration.commandline.Main.doMigration(Main.java:1760)
    at liquibase.integration.commandline.Main$1.lambda$run$0(Main.java:361)
    at liquibase.Scope.lambda$child$0(Scope.java:160)
  • 我可以知道,在這種情況下我做錯了什么? 為什么liquibase運行容器中沒有文件?
  • 這是一個問題,因為在 Docker 情況下由於 Docker 的文件權限?
  • 有沒有其他方法可以實現這一目標?

預先感謝您的幫助。

我認為你在某種程度上搞亂了 docker 配置。 文檔看來,liquibase 期望您將所有內容都安裝在/liquibase/changelog目錄中。

在您的命令中,您將更改日志映射到/app/liquibase

docker run --rm --network="host" -v ${workspace_dir}/db:/app/liquibase liquibase/liquibase --url=${hs_jdbc_url} --changeLogFile=db.changelog-master.yaml --classpath=/app/liquibase --driver=org.postgresql.Driver --username=${db_username} --password=${db_password} --logLevel=info  update

所以我會用這個:

docker run --rm --network="host" -v ${workspace_dir}/db:/liquibase/changelog liquibase/liquibase --url=${hs_jdbc_url} --changeLogFile=db.changelog-master.yaml  --driver=org.postgresql.Driver --username=${db_username} --password=${db_password} --logLevel=info  update

注意:如果你依賴它,我已經刪除了--classpath=/app/liquibase ,如果你添加了一些額外的驅動程序或其他東西,你可能應該再次包含它,但首先嘗試閱讀它。 我認為文檔非常好。

在 jekins 管道中使用 docker docker run時必須指定完整路徑:

--changeLogFile=/app/liquibase/db.changelog-master.yaml 

在詹金斯管道中定義:

environment {
        HOME = '.'
    }

更改日志文件是 Liquibase 查找配置的主要點。 如果我們在 Spring Boot 中沒有定義更改日志文件路徑,它會將 db/changelog/db.changelog-master.yaml 視為 YAML 格式的默認路徑。 由於我們將使用 XML 格式,我們需要在 application.properties 文件中為更改日志文件路徑設置 spring.liquibase.change-log=classpath:/db/changelog/changelog-master.xml。 您可以通過在 logging.level.liquibase 屬性中設置日志級別來設置 liquibase 日志的日志級別。 下面給出的屬性文件中的其他屬性用於 H2 數據庫配置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM