
emeraldsquad/cf-flyway-resourcecf-flyway-resource是基于ubuntu:22.04构建的Concourse-CI资源镜像,用于通过Flyway在Cloud Foundry数据库服务上执行数据库迁移。它提供了与Cloud Foundry数据库服务的无缝连接,支持版本控制和自动化迁移流程,适用于CI/CD环境中的数据库 schema 管理。
适用于需要通过Concourse-CI自动化管理Cloud Foundry数据库服务迁移的场景,尤其适合:
在Concourse pipeline中定义资源类型:
yml- name: cf-flyway-resource type: docker-image source: repository: emeraldsquad/cf-flyway-resource tag: 5.0.0
定义具体资源实例:
yml- name: cf-flyway type: cf-flyway-resource source: api: ((pcf-api)) username: ((product-name))-ciuser password: ((pcf-ciuser-passwd)) organization: ((product-name))-org space: ((pcf-space)) service: ((database-service-name))
| 参数 | 要求 | 说明 |
|---|---|---|
| api | 必填 | Cloud Foundry Cloud Controller的API端点 |
| username | 必填 | 用于认证的用户名 |
| password | 必填 | 用于认证的密码 |
| organization | 必填 | 目标组织名称 |
| space | 必填 | 目标空间名称 |
| service | 必填 | 数据库服务实例名称 |
示例配置:
yml- name: cf-flyway type: cf-flyway-resource source: api: cf-api-endpoint username: cf-user password: cf-user-password organization: organization-name space: space-name service: service-instance-name
check脚本始终返回当前版本号(UTC时间戳),若未收到版本则生成初始版本。
in脚本始终返回当前版本号,因此该资源不能用作输入触发器。
从Cloud Foundry API读取服务信息生成元数据,示例:
ymlcf_api : [***] cf_org : organization-name cf_space : space-name dashboard_url : https://{hostname}/service-instances/53rv1c30-1n5t-aNc3-Gu1d-000000000000/ metadata_url : /v2/service_instances/53rv1c30-1n5t-aNc3-Gu1d-000000000000 service_instance : cf-db-service-instance-name service_label : cf-db-service-name service_plan : cf-db-service-plan
将数据库schema迁移到Cloud Foundry数据库服务。out脚本会:
flyway.confflyway info → flyway migrate → flyway info)生成的flyway.conf默认设置flyway.cleanDisabled=true,用户提供的其他配置会被追加,但以下配置会被覆盖:
confflyway.url={service-key jdbc:driver//url/database} # 由Cloud Foundry service-key凭据覆盖 flyway.user={service-key username} # 由Cloud Foundry service-key凭据覆盖 flyway.password={service-key password} # 由Cloud Foundry service-key凭据覆盖 flyway.locations={params.locations} # 由locations参数覆盖(必填) flyway.cleanDisabled=true # 由clean_disabled参数覆盖(可选,默认true)
可通过设置delete_service_key: true自动删除service-key。
当Concourse实例无法直接访问数据库服务时,可使用run_task: true(默认):
run-task命令执行Flyway命令delete_application: true自动解绑并删除应用推送的应用清单示例:
ymlapplications: - name: {service-instance-name}-flyway buildpacks: [binary_buildpack] health-check-type: process no-route: true instances: 0 # 加快部署速度 disk_quota: 256M memory: 256M command: sleep 3600 # 确保应用1小时后自动停止
SSH访问应用容器:
bashcf scale {service-instance-name}-flyway -i 1 # 扩展实例数 cf start {service-instance-name}-flyway # 启动应用 cf ssh {service-instance-name}-flyway # SSH连接
容器内已配置Flyway CLI:
bashvcap@xxxxxxxx-xxxx-xxxx-xxxx-xxxx:~$ cd app vcap@xxxxxxxx-xxxx-xxxx-xxxx-xxxx:~/app$ ./flyway info
使用完毕后停止应用:
bashcf stop {service-instance-name}-flyway
| 参数 | 要求 | 说明 |
|---|---|---|
| locations | 必填 | 迁移文件位置,可为逗号分隔字符串或YAML列表。前缀说明:classpath:(类路径,支持SQL和Java迁移),filesystem:(文件系统路径,仅SQL迁移) |
| commands | 可选 | 执行的Flyway命令列表,默认[info, migrate, info]。支持命令:migrate、clean、info、validate、undo(专业版)、baseline、repair |
| clean_disabled | 可选 | 是否禁用clean操作,默认true |
| delete_service_key | 可选 | 迁移完成后是否删除service-key,默认false |
| flyway_conf | 可选 | Flyway配置,可为文件路径或内联配置。以下配置会被覆盖:url、user、password、locations、cleanDisabled |
| jdbc_builder | 可选 | 用于连接未识别数据库服务的shell脚本,接收service-key JSON作为参数,输出JDBC URL |
| run_task | 可选 | 是否通过Cloud Foundry run-task执行迁移,默认true |
| delete_application | 可选 | 使用run_task时是否删除应用,默认false |
| memory | 可选 | run_task时任务内存限制,默认1024M,需带单位(B/K/KB/M/MB/G/GB/T/TB) |
| disk_quota | 可选 | run_task时任务磁盘限制,默认1024M,需带单位 |
| cf_logs_wait_time | 可选 | run_task时获取日志前的延迟(秒),默认15 |
| cf_logs_max_retry_count | 可选 | run_task时获取日志的最大重试次数,默认3 |
1. 仅使用必填locations参数
ymljobs: - name: deploy plan: - get: my-app-package - put: cf-flyway params: locations: filesystem:my-app-package/DB/Schema
2. 添加Flyway配置文件
ymljobs: - name: deploy plan: - get: my-app-package - put: cf-flyway params: locations: filesystem:my-app-package/DB/Schema flyway_conf: my-app-package/DB/flyway.config
3. 内联Flyway配置
ymljobs: - name: deploy plan: - get: my-app-package - put: cf-flyway params: locations: filesystem:my-app-package/DB/Schema flyway_conf: | flyway.schemas=dbo flyway.connectRetries=2
4. 自定义命令序列
ymljobs: - name: deploy plan: - get: my-app-package - put: cf-flyway params: locations: filesystem:my-app-package/DB/Schema commands: [info, validate]
5. 使用Flyway专业版功能
ymljobs: - name: deploy plan: - get: my-app-package - put: cf-flyway params: locations: filesystem:my-app-package/DB/Schema commands: [info, undo, info] flyway_conf: | flyway.licenseKey=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
6. 使用jdbc_builder
ymljobs: - name: deploy plan: - get: my-app-package - put: cf-flyway params: locations: filesystem:my-app-package/DB/Schema jdbc_builder: | echo jdbc:postgresql://$(echo $1 | jq -r '.uri' | grep -Poh '(?<=@).*')
7. 使用run_task并自动删除应用
ymljobs: - name: deploy plan: - get: my-app-package - put: cf-flyway params: run_task: true delete_application: true locations: filesystem:my-app-package/DB/Schema
8. 自定义内存和磁盘配额
ymljobs: - name: deploy plan: - get: my-app-package - put: cf-flyway params: run_task: true locations: filesystem:my-app-package/DB/Schema memory: 256M disk_quota: 256M
out脚本始终返回新的版本号(UTC时间戳)。
与in脚本生成的元数据格式相同,包含Cloud Foundry服务详细信息。
manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务