You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何借助GitLab CI/CD自动化Oracle云关系型数据库PL/SQL脚本部署

实现GitLab CI/CD自动部署PL/SQL到Oracle云数据库(从Vault取凭据)

前置条件

  • Oracle云已创建Vault,并存储了数据库的用户名和密码两个秘密(建议命名为DB_USER、DB_PASSWORD)
  • GitLab项目中已存放PL/SQL脚本(示例路径:./plsql-scripts/)
  • 拥有Oracle云IAM权限,可配置Vault访问策略及生成认证密钥

步骤1:配置Oracle云Vault访问权限

  1. 创建动态组(或使用现有服务账号),将GitLab CI/CD的运行实体纳入组中(若用资源主体,可关联GitLab的OCI资源)
  2. 编写IAM策略,授权动态组读取指定Vault秘密:
    Allow dynamic-group <你的动态组名> to read secret-bundles in compartment <你的 compartment ID> where target.secret.id = '<你的秘密OCID>'
    
  3. 生成OCI认证密钥对(私钥+公钥),将公钥上传到Oracle云用户的API密钥列表,保存好私钥供后续GitLab配置使用

步骤2:配置GitLab CI/CD变量

在GitLab项目的Settings > CI/CD > Variables中添加以下变量(全部设为Protected和Masked):

  • OCI_TENANCY_ID:Oracle云租户ID
  • OCI_USER_ID:授权访问Vault的用户ID
  • OCI_REGION:Vault所在区域(如us-east-1)
  • OCI_PRIVATE_KEY:之前生成的OCI私钥完整内容(保留换行格式)
  • VAULT_SECRET_USER_OCID:存储数据库用户名的秘密OCID
  • VAULT_SECRET_PWD_OCID:存储数据库密码的秘密OCID
  • DB_CONN_STRING:Oracle数据库连接字符串(如(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xxx.oraclecloud.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=xxx_high.adb.oraclecloud.com))))

步骤3:编写GitLab CI/CD流水线配置(.gitlab-ci.yml)

stages:
  - fetch-secrets
  - deploy-plsql

fetch-secrets:
  stage: fetch-secrets
  image: oraclelinux:8
  before_script:
    - yum install -y oraclelinux-release-el8
    - yum install -y oracle-cloud-cli
    # 配置OCI CLI认证
    - mkdir -p ~/.oci
    - echo "$OCI_PRIVATE_KEY" > ~/.oci/oci_api_key.pem
    - chmod 600 ~/.oci/oci_api_key.pem
    - cat > ~/.oci/config <<EOF
[DEFAULT]
user=$OCI_USER_ID
tenancy=$OCI_TENANCY_ID
region=$OCI_REGION
fingerprint=$(openssl rsa -pubin -in ~/.oci/oci_api_key.pem -pubout -outform DER | openssl md5 -c | cut -d' ' -f2)
key_file=~/.oci/oci_api_key.pem
EOF
  script:
    # 从Vault拉取数据库用户名并转码
    - export DB_USER=$(oci vault secret-bundle get --secret-id $VAULT_SECRET_USER_OCID --raw-output --query 'data.secret-bundle-content.content' | base64 -d)
    # 从Vault拉取数据库密码并转码
    - export DB_PASSWORD=$(oci vault secret-bundle get --secret-id $VAULT_SECRET_PWD_OCID --raw-output --query 'data.secret-bundle-content.content' | base64 -d)
    # 将凭据传递至下一阶段
    - echo "DB_USER=$DB_USER" > deploy.env
    - echo "DB_PASSWORD=$DB_PASSWORD" >> deploy.env
  artifacts:
    reports:
      dotenv: deploy.env

deploy-plsql:
  stage: deploy-plsql
  image: oraclelinux:8
  needs: [fetch-secrets]
  before_script:
    # 安装Oracle Instant Client及sqlplus
    - yum install -y oracle-release-el8
    - yum install -y oracle-instantclient-basic oracle-instantclient-sqlplus
    - export LD_LIBRARY_PATH=/usr/lib/oracle/21/client64/lib:$LD_LIBRARY_PATH
  script:
    # 遍历执行所有PL/SQL脚本,出错即终止流水线
    - for script in ./plsql-scripts/*.sql; do
        echo "Executing script: $script";
        sqlplus -s "$DB_USER/$DB_PASSWORD@$DB_CONN_STRING" @$script;
        if [ $? -ne 0 ]; then
          echo "Script $script execution failed";
          exit 1;
        fi
      done
  only:
    - main # 可根据需求修改触发分支

关键注意事项

  • 最小权限原则:确保GitLab使用的OCI账号仅拥有读取指定Vault秘密的权限,避免过度授权
  • 凭据安全:所有敏感变量必须设为Masked和Protected,防止泄露
  • 错误处理:流水线中加入脚本执行失败判断,确保编译/执行出错时立即终止,避免无效部署
  • 镜像优化:可预先构建包含OCI CLI和Oracle Instant Client的自定义镜像,减少流水线执行时间

内容的提问来源于stack exchange,提问作者caffeinated_programmer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 18:48:24