如何借助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访问权限
- 创建动态组(或使用现有服务账号),将GitLab CI/CD的运行实体纳入组中(若用资源主体,可关联GitLab的OCI资源)
- 编写IAM策略,授权动态组读取指定Vault秘密:
Allow dynamic-group <你的动态组名> to read secret-bundles in compartment <你的 compartment ID> where target.secret.id = '<你的秘密OCID>' - 生成OCI认证密钥对(私钥+公钥),将公钥上传到Oracle云用户的API密钥列表,保存好私钥供后续GitLab配置使用
步骤2:配置GitLab CI/CD变量
在GitLab项目的Settings > CI/CD > Variables中添加以下变量(全部设为Protected和Masked):
OCI_TENANCY_ID:Oracle云租户IDOCI_USER_ID:授权访问Vault的用户IDOCI_REGION:Vault所在区域(如us-east-1)OCI_PRIVATE_KEY:之前生成的OCI私钥完整内容(保留换行格式)VAULT_SECRET_USER_OCID:存储数据库用户名的秘密OCIDVAULT_SECRET_PWD_OCID:存储数据库密码的秘密OCIDDB_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
相关产品推荐
相关产品推荐

