maven 如何从云构建网络到我的fabric8 docker compose服务?

c9qzyr3d  于 2022-12-22  发布在  Maven
关注(0)|答案(1)|浏览(182)

我的maven构建文件运行一个集成测试,我使用io.fabric8:docker-maven-plugin来启动一个测试运行环境,在生成的环境中运行了几个东西,但为了简短起见,主要是一个REST服务器,我正在测试的代码需要与之通信。
它在本地运行得非常好,我使用mvn verify,运行集成测试,启动环境,然后关闭环境的任何一端,没有问题。
然而,我也希望这个构建在GCP Cloud Build中运行。几乎是这样。环境成功启动,包括REST服务器以及REST服务器与之对话的postgres示例,并且连接正常。但当我的测试代码尝试与REST服务器对话时,连接失败。
我有REST服务器的端口声明为8080:8080,即8080端口暴露在本地机器上。这在我自己的机器上工作。它不工作的云构建虽然。我看到某处云构建喜欢使用自己的网络cloudbuild,我需要定义该网络在一个docker-compose文件,如下所示:

networks:
  default:
    external:
      name: cloudbuild

但是我没有使用docker-compose文件,我在pom.xml文件中io.fabric8:docker-maven-plugin项下定义了要运行的图像等,fabric 8文档中没有明确说明如何指定它,我也不清楚在此情况下,是否需要将localhost引用更改为其他内容,尽管我尝试将它们改为cloudbuild,但没有帮助。

gopyfrb3

gopyfrb31#

我找到了答案here,我放弃了maven插件的方法,在cloudbuild.yaml文件中启动docker compose,如下所示:

- name: 'docker/compose'
    args:  [ '-f', 'liontamer-web/docker/docker-compose.yml', '-f', 'liontamer-web/docker/docker-compose-ci.yml', 'up', '-d']
    id: docker-compose

(yes,我的项目名为liontamer,docker文件在一个名为liontamer-web的模块中)。注意,这里有两个docker合成文件,第二个包含以下内容:

version: '3.2'
networks:
  default:
    external:
      name: cloudbuild

这意味着它在Cloud Build下运行时使用正确的网络名称。
cloudbuild.yaml文件的其余部分如下所示:

- name: 'maven:3.8-openjdk-17'
    args:
      - 'mvn'
      - '-Dmaven.test.skip=false'
      - '-Dmaven.repo.local=/workspace/.m2/repository'
      - '--settings'
      - custom-settings.xml
      - clean
      - install
      - '-B'
      - '-DVERSION_ID=$TAG_NAME'
      - '-DBRANCH_ID=master'
      - '-DPROJECT_ID=$PROJECT_ID'
      - '-DCONTAINER_REPO=${_CONTAINER_REPO}'
      - '-DMAVEN_REPO=${_MAVEN_REPO}'
      - '-DDOCKER_CONFIG=/builder/home/.docker'
      - '-P'
      - release
    id: build
    waitFor: [docker-compose]
  - name: 'docker/compose'
    args:  [ '-f', 'liontamer-web/docker/docker-compose.yml', '-f', 'liontamer-web/docker/docker-compose-ci.yml', 'down']
    id: docker-compose-down

注意构建中的waitFor是很重要的,因为我认为如果没有找到waitFor,它会在运行之前清理docker compose的内容。我不确定最后一步有多重要,这一步将docker compose关闭,但清理似乎是有礼貌的。
还有一件事我不得不改变,我的集成测试代码必须通过服务名称引用Docker服务。当在本地运行时,我在localhost上公开了端口,所以我可以使用正确端口号的localhost。在Cloud Build下不是这样。所以对于我需要从IT访问的一个REST服务器,我改变了它。的主机引用从localhost到Docker合成文件中的服务名称。
当然,这意味着我不能在本地运行它,除非我做一些编辑。但这已经足够好了。

相关问题