pgxn/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测试文件

来自真实用户的反馈,见证轩辕镜像的优质服务
免费版仅支持 Docker Hub 加速,不承诺可用性和速度;专业版支持更多镜像源,保证可用性和稳定速度,提供优先客服响应。
免费版仅支持 docker.io;专业版支持 docker.io、gcr.io、ghcr.io、registry.k8s.io、nvcr.io、quay.io、mcr.microsoft.com、docker.elastic.co 等。
当返回 402 Payment Required 错误时,表示流量已耗尽,需要充值流量包以恢复服务。
通常由 Docker 版本过低导致,需要升级到 20.x 或更高版本以支持 V2 协议。
先检查 Docker 版本,版本过低则升级;版本正常则验证镜像信息是否正确。
使用 docker tag 命令为镜像打上新标签,去掉域名前缀,使镜像名称更简洁。
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
在 Linux 系统配置镜像加速服务
在 Docker Desktop 配置镜像加速
Docker Compose 项目配置加速
Kubernetes 集群配置 Containerd
在宝塔面板一键配置镜像加速
Synology 群晖 NAS 配置加速
飞牛 fnOS 系统配置镜像加速
极空间 NAS 系统配置加速服务
爱快 iKuai 路由系统配置加速
绿联 NAS 系统配置镜像加速
QNAP 威联通 NAS 配置加速
Podman 容器引擎配置加速
HPC 科学计算容器配置加速
ghcr、Quay、nvcr 等镜像仓库
无需登录使用专属域名加速
需要其他帮助?请查看我们的 常见问题 或 官方QQ群: 13763429