Extension CI Tools for DuckDB
September 14, 2026 ยท View on GitHub
This repository contains reusable components for building, testing and deploying DuckDB extensions.
DuckDB's Extension Template and various DuckDB extensions use this repository to share build configuration and CI workflows.
Usage examples
Add this repository to an extension as the extension-ci-tools submodule. After cloning the extension, initialize its submodules:
git submodule update --init --recursive
When the extension has a duckdb submodule, omit duckdb_version from the distribution and deployment workflows. CI uses the commit pinned by the submodule.
C++
duckdb-httpfs includes the standard extension and vcpkg makefiles:
PROJ_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
EXT_NAME=httpfs
EXT_CONFIG=${PROJ_DIR}extension_config.cmake
include extension-ci-tools/makefiles/duckdb_extension.Makefile
include extension-ci-tools/makefiles/vcpkg.Makefile
It calls the reusable distribution workflow to build and test the extension on supported platforms:
jobs:
duckdb-stable-build:
uses: duckdb/extension-ci-tools/.github/workflows/_extension_distribution.yml@main
with:
extension_name: httpfs
ci_tools_version: main
Rust
duckdb-delta uses the standard extension makefile and enables the Rust toolchain in CI:
PROJ_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
EXT_NAME=delta
EXT_CONFIG=${PROJ_DIR}extension_config.cmake
include extension-ci-tools/makefiles/duckdb_extension.Makefile
jobs:
duckdb-stable-build:
uses: duckdb/extension-ci-tools/.github/workflows/_extension_distribution.yml@main
with:
extension_name: delta
ci_tools_version: main
enable_rust: true
C API
odbc-scanner does not have a duckdb submodule, so it sets the DuckDB version explicitly. It uses the C API makefiles. Set USE_UNSTABLE_C_API to 1 only when the extension needs DuckDB's unstable C API.
PROJ_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
EXTENSION_NAME := odbc_scanner
USE_UNSTABLE_C_API := 0
TARGET_DUCKDB_VERSION := <duckdb-version>
include extension-ci-tools/makefiles/c_api_extensions/base.Makefile
include extension-ci-tools/makefiles/c_api_extensions/c_cpp.Makefile
Its CI adds the tools needed by the extension:
jobs:
duckdb-build:
uses: duckdb/extension-ci-tools/.github/workflows/_extension_distribution.yml@main
with:
extension_name: odbc_scanner
duckdb_version: <duckdb-version>
ci_tools_version: main
extra_toolchains: python3;unixodbc;
build_duckdb_shell: false
The shared makefiles provide common targets such as make debug, make test_debug and make release.