pgxn/pgxn-toolspgxn/pgxn-tools是一个用于自动化测试PostgreSQL扩展(针对多版本PostgreSQL)并发布到PGXN(PostgreSQL扩展网络)的Docker镜像。基于Debian Bookworm Slim构建,使用PostgreSQL Apt仓库安装PostgreSQL,支持8.2及以上版本(包括最新预发布版)。
镜像包含以下实用工具:
pgxn: PGXN命令行客户端,用于从PGXN安装扩展依赖pg_prove: 运行pgTAP测试的工具pg-start: 安装指定主版本的PostgreSQL并启动集群pg-build-test: 构建并测试当前目录中的PGXS扩展pgrx-build-test: 构建并测试当前目录中的pgrx扩展pgxn-bundle: 验证PGXN META.json文件并打包发布版本pgxn-release: 将扩展发布到PGXN使用Docker CLI运行pgxn-tools容器,基本命令格式如下:
shdocker run -it --rm -w /repo --volume "$PWD:/repo" pgxn/pgxn-tools \ sh -c 'pg-start 16 && pg-build-test'
此示例将当前目录挂载到容器的/repo目录,启动PostgreSQL 16,然后构建并测试该目录中的扩展。
注意:GitHub工作流容器作业必须以root运行,本节的非特权用户选项在此场景下不适用。
默认容器以root用户运行。如需以非特权用户运行,可通过AS_USER环境变量创建具有sudo权限的用户:
shdocker run -it --rm -w /repo -e AS_USER=worker \ --volume "$PWD:/repo" pgxn/pgxn-tools \ sh -c 'sudo pg-start 14 && pg-build-test'
创建的用户默认UID为1001,可通过LOCAL_UID指定本地UID以访问挂载卷中的文件:
shdocker run -it --rm -w /repo -e AS_USER=worker -e LOCAL_UID=$(id -u) \ --volume "$PWD:/repo" pgxn/pgxn-tools \ sh -c 'sudo pg-start 14 && pg-build-test'
容器中已包含nobody用户和pg-start创建的postgres用户,两者均具有无密码sudo权限。
以下工作流在每次推送和拉取请求时,针对多个PostgreSQL版本测试PGXS扩展:
yamlname: CI on: [push, pull_request] jobs: test: strategy: matrix: pg: [17, 16, 15, 14, 13, 12, 11, 10, 9.6, 9.5, 9.4, 9.3, 9.2, 9.1, 9.0, 8.4, 8.3, 8.2] name: 🐘 PostgreSQL ${{ matrix.pg }} runs-on: ubuntu-latest container: pgxn/pgxn-tools steps: - name: 启动PostgreSQL ${{ matrix.pg }} run: pg-start ${{ matrix.pg }} - name: 检出代码 uses: actions/checkout@v4 - name: 在PostgreSQL ${{ matrix.pg }}上测试 run: pg-build-test
以下工作流测试pgrx扩展,使用缓存加速依赖安装:
yamlname: CI on: [push, pull_request] jobs: test: strategy: matrix: pg: [16, 15, 14, 13, 12, 11] name: 🐘 PostgreSQL ${{ matrix.pg }} runs-on: ubuntu-latest container: pgxn/pgxn-tools steps: - name: 启动PostgreSQL ${{ matrix.pg }} run: pg-start ${{ matrix.pg }} - name: 检出代码 uses: actions/checkout@v4 - name: 设置Rust缓存 uses: Swatinem/rust-cache@v2 - name: 在PostgreSQL ${{ matrix.pg }}上测试 run: pgrx-build-test
以下工作流在推送匹配v*标签时,自动发布到PGXN和GitHub:
yamlname: Release on: push: tags: ['v[0-9]+.[0-9]+.[0-9]+'] jobs: release: name: 发布到GitHub和PGXN runs-on: ubuntu-latest container: pgxn/pgxn-tools env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - name: 检出代码 uses: actions/checkout@v4 - name: 打包发布版本 id: bundle run: pgxn-bundle - name: 发布到PGXN env: PGXN_USERNAME: ${{ secrets.PGXN_USERNAME }} PGXN_PASSWORD: ${{ secrets.PGXN_PASSWORD }} run: pgxn-release - name: 创建GitHub发布 id: release uses: actions/create-release@v1 with: tag_name: ${{ github.ref }} release_name: Release ${{ github.ref }} body: | 本次发布变更 - 变更1 - 变更2 - name: 上传发布资产 uses: actions/upload-release-asset@v1 with: upload_url: ${{ steps.release.outputs.upload_url }} asset_path: ./${{ steps.bundle.outputs.bundle }} asset_name: ${{ steps.bundle.outputs.bundle }} asset_content_type: application/zip
GitHub工作流需要root用户操作工作区,可通过以下方式以非特权用户执行命令:
yamlcontainer: pgxn/pgxn-tools steps: - uses: actions/checkout@v4 - run: pg-start 16 - run: chown -R postgres:postgres . - run: gosu postgres pg-build-test
或直接运行Docker镜像并指定用户:
yamlsteps: - uses: actions/checkout@v4 - run: >- docker run -w /repo --rm --volume "$(pwd):/repo" -e AS_USER=pgxn_worker -e LOCAL_UID=$(id -u) pgxn/pgxn-tools sh -c 'pg-start && pg-build-test'
pg-start安装并启动指定版本的PostgreSQL集群:
shpg-start 12 # 安装并启动PostgreSQL 12 pg-start 11 libsodium-dev # 安装PostgreSQL 11及额外依赖
PGPORT: 指定端口(默认5432)LANG: 设置集群区域(默认C.UTF-8)NO_CLUSTER: 仅安装不启动集群(需手动使用pg_createcluster)示例:修改配置文件并重启集群
sh# 获取配置文件路径 CONFIG_FILE=$(psql --no-psqlrc -U postgres -Atqc 'SHOW config_file') # 添加配置 echo "shared_preload_libraries = '$libdir/plperl'" >> $CONFIG_FILE # 重启集群 pg_ctlcluster 12 test restart
pg-build-test构建并测试当前目录的PGXS扩展:
shpg-build-test # 构建并运行测试
make && make install && make installcheckPROFILE可自定义构建参数(默认--Werror):
shexport PROFILE=--Wall && pg-build-test
pgrx-build-test构建并测试当前目录的pgrx扩展(需Cargo.toml中指定pgrx版本≥0.11.4):
shpgrx-build-test # 构建并运行测试
make installcheck(如Makefile定义该目标)pgxn-bundle验证META.json并打包发布版本:
shpgxn-bundle # 从META.json读取名称和版本并打包 # 或手动指定 PGXN_DIST_NAME=widget PGXN_DIST_VERSION=1.0.0 pgxn-bundle
GIT_ARCHIVE_CMD=archive-all: 包含Git子模块GIT_BUNDLE_OPTS: 传递给git archive的参数ZIP_BUNDLE_OPTS: 传递给zip的参数pgxn-release发布打包文件到PGXN:
shexport PGXN_USERNAME=用户名 export PGXN_PASSWORD=密码 pgxn-release # 发布当前打包文件 pgxn-release widget-1.0.0.zip # 发布指定文件
PGXN_USERNAME和PGXN_PASSWORDpgxnPGXN命令行客户端,用于安装扩展依赖:
shpgxn install semver # 安装semver扩展
pg_prove运行pgTAP测试:
shpg_prove -r --ext .sql test/ # 递归运行test目录下的.sql测试文件



manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务