在GitHub Action中安全配置CockroachDB容器以支持SSL测试
在GitHub Actions中配置带SSL的CockroachDB服务用于全模式测试
CockroachDB官方容器确实没提供太多环境变量,但可以通过自定义启动命令和初始化脚本来配置用户、证书,满足不同SSL模式的测试需求。以下是完整的实现方案:
1. 完整的GitHub Actions配置示例
test-backend: runs-on: ubuntu-latest steps: - name: 拉取代码 uses: actions/checkout@v4 # 生成自定义SSL证书(如果用CRDB自动生成的可跳过此步骤) - name: 生成SSL证书 run: | mkdir -p ./certs ./ca-key # 下载CRDB二进制用于生成证书 curl -O https://binaries.cockroachdb.com/cockroach-v23.1.10.linux-amd64.tgz tar xfz cockroach-v23.1.10.linux-amd64.tgz cp cockroach-v23.1.10.linux-amd64/cockroach ./cockroach chmod +x ./cockroach # 生成CA、节点、客户端证书 ./cockroach cert create-ca --certs-dir=./certs --ca-key=./ca-key/ca.key ./cockroach cert create-node localhost 127.0.0.1 cockroachdb --certs-dir=./certs --ca-key=./ca-key/ca.key ./cockroach cert create-client root --certs-dir=./certs --ca-key=./ca-key/ca.key ./cockroach cert create-client testuser --certs-dir=./certs --ca-key=./ca-key/ca.key # 创建初始化脚本(用于添加用户和数据库) - name: 编写初始化SQL run: | cat > init.sql <<EOF CREATE USER testuser WITH PASSWORD 'testpass123'; CREATE DATABASE testdb; GRANT ALL PRIVILEGES ON DATABASE testdb TO testuser; EOF # 执行自动化测试(示例) - name: 运行测试 run: | # 示例:用不同SSL模式连接测试 # 1. 验证完整SSL模式(最安全) ./cockroach sql --certs-dir=./certs --host=localhost:26257 --user=testuser --database=testdb --sslmode=verify-full -e "SELECT 'SSL verify-full works'" # 2. 仅验证CA模式 ./cockroach sql --certs-dir=./certs --host=localhost:26257 --user=testuser --database=testdb --sslmode=verify-ca -e "SELECT 'SSL verify-ca works'" # 3. 强制SSL但不验证证书 ./cockroach sql --certs-dir=./certs --host=localhost:26257 --user=testuser --database=testdb --sslmode=require -e "SELECT 'SSL require works'" # 4. 禁用SSL(仅用于对比测试) ./cockroach sql --host=localhost:26257 --user=testuser --database=testdb --sslmode=disable --insecure -e "SELECT 'SSL disable works'" services: cockroachdb: image: cockroachdb/cockroach:v23.1.10 ports: - 26257:26257 # 带SSL启动单节点,指定证书目录 command: start-single-node --certs-dir=/certs --listen-addr=0.0.0.0:26257 --init # 挂载证书和初始化脚本 volumes: - ./certs:/certs - ./init.sql:/docker-entrypoint-initdb.d/init.sql # 健康检查:确保服务就绪后再执行测试 options: >- --health-cmd "cockroach sql --certs-dir=/certs --host=cockroachdb -e 'SELECT 1'" --health-interval 10s --health-timeout 5s --health-retries 5
2. 关键配置说明
- 启动命令:通过
command字段传入start-single-node --certs-dir=/certs --init,--init会让CRDB首次启动时自动执行/docker-entrypoint-initdb.d/下的SQL脚本,完成用户和数据库创建。 - 证书处理:既可以自己生成证书(如上示例),也可以直接使用CRDB自动生成的证书(挂载
/cockroach/cockroach-data/certs目录即可)。 - 健康检查:必须使用带证书的连接命令,避免因服务未就绪导致测试失败。
- SSL模式覆盖:测试时通过
sslmode参数指定不同模式,覆盖所有场景。
3. 简化方案(用CRDB自动生成的证书)
如果不需要自定义证书,可直接用CRDB自动生成的证书,省去证书生成步骤:
services: cockroachdb: image: cockroachdb/cockroach:v23.1.10 ports: - 26257:26257 command: start-single-node --listen-addr=0.0.0.0:26257 --init volumes: - crdb-certs:/cockroach/cockroach-data/certs - ./init.sql:/docker-entrypoint-initdb.d/init.sql options: >- --health-cmd "cockroach sql --certs-dir=/cockroach/cockroach-data/certs --host=cockroachdb -e 'SELECT 1'" --health-interval 10s --health-timeout 5s --health-retries 5 volumes: crdb-certs:
测试时连接命令改为--certs-dir=/path/to/mounted/certs(在Actions步骤中需要先复制容器内的证书到本地)。
内容的提问来源于stack exchange,提问作者Moe
相关产品推荐
相关产品推荐

