diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 80370d41..c6f7df53 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -65,3 +65,169 @@ jobs: - name: Deploy 🚀 run: nix run .#publish-docker-image ${{ github.ref }} + + connector-definition: + # For now, only run on tagged releases because main builds generate a Docker image tag name that + # is not easily accessible here + if: ${{ startsWith(github.ref, 'refs/tags/v') }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Build connector definition + run: | + set -e pipefail + export DOCKER_IMAGE="ghcr.io/hasura/ndc-mongodb:$GITHUB_REF_NAME" + export CLI_VERSION=$GITHUB_REF_NAME + make build + working-directory: ./connector-definition + + - uses: actions/upload-artifact@v4 + with: + name: connector-definition.tgz + path: ./connector-definition/dist/connector-definition.tgz + compression-level: 0 # Already compressed + + build-cli-binaries: + name: build the CLI binaries + strategy: + matrix: + include: + - runner: ubuntu-latest + target: x86_64-unknown-linux-musl + rustflags: -C target-feature=+crt-static + linux-packages: musl-tools + - runner: ubuntu-latest + target: aarch64-unknown-linux-musl + rustflags: -C target-feature=+crt-static + linux-packages: gcc-aarch64-linux-gnu musl-tools + linker: /usr/bin/aarch64-linux-gnu-gcc + - runner: macos-latest + target: x86_64-apple-darwin + - runner: macos-latest + target: aarch64-apple-darwin + - runner: windows-latest + target: x86_64-pc-windows-msvc + rustflags: -C target-feature=+crt-static + extension: .exe + runs-on: ${{ matrix.runner }} + env: + CARGO_BUILD_TARGET: ${{ matrix.target }} + CARGO_NET_GIT_FETCH_WITH_CLI: "true" + RUSTFLAGS: "-D warnings ${{ matrix.rustflags }}" + defaults: + run: + shell: bash + steps: + - uses: actions/checkout@v4 + + - name: install protoc + uses: arduino/setup-protoc@v3 + with: + version: "25.x" + repo-token: ${{ secrets.GITHUB_TOKEN }} + + - name: install tools + run: | + rustup show + rustup target add ${{ matrix.target }} + + - name: install other packages required + if: matrix.linux-packages + run: | + sudo apt-get update + sudo apt-get install -y ${{ matrix.linux-packages }} + + - uses: Swatinem/rust-cache@v2 + with: + shared-key: "build" # share the cache across jobs + + - name: build the CLI + run: | + # If we're on a tag, use the tag name as the release version. + if [[ "$GITHUB_REF_TYPE" == 'tag' ]]; then + # Ensure that the version specified in Cargo.toml is the same as the tag (with a 'v' prefix). + CARGO_VERSION="$(cargo metadata --format-version=1 | jq -r '.packages | .[] | select(.name == "ndc-postgres") | .version')" + echo "Git tag: ${GITHUB_REF_NAME}" + echo "Cargo version: ${CARGO_VERSION}" + + if [[ "${GITHUB_REF_NAME}" != "v${CARGO_VERSION}" ]]; then + echo >&2 "The Git tag is \"${GITHUB_REF_NAME}\", but the version in Cargo.toml is \"${CARGO_VERSION}\"." + echo >&2 'These must be the same, with a "v" prefix for the tag. Aborting.' + exit 1 + fi + export RELEASE_VERSION="$GITHUB_REF_NAME" + echo "RELEASE_VERSION = ${RELEASE_VERSION}" + fi + + if [[ -n '${{ matrix.linker }}' ]]; then + TARGET_SCREAMING="$(echo '${{ matrix.target }}' | tr '[:lower:]' '[:upper:]' | tr '-' '_')" + echo "CARGO_TARGET_${TARGET_SCREAMING}_LINKER"='${{ matrix.linker }}' + declare "CARGO_TARGET_${TARGET_SCREAMING}_LINKER"='${{ matrix.linker }}' + export "CARGO_TARGET_${TARGET_SCREAMING}_LINKER" + fi + + echo "Building for target: ${CARGO_BUILD_TARGET}" + cargo build --release --package=mongodb-cli-plugin + + mkdir -p release + mv -v target/${{ matrix.target }}/release/mongodb-cli-plugin release/mongodb-cli-plugin-${{ matrix.target }}${{ matrix.extension }} + + - uses: actions/upload-artifact@v4 + with: + name: mongodb-cli-plugin-${{ matrix.target }}${{ matrix.extension }} + path: release + if-no-files-found: error + + release: + name: release to GitHub + needs: + - docker + - connector-definition + - build-cli-binaries + runs-on: ubuntu-latest + if: ${{ startsWith(github.ref, 'refs/tags/v') }} + steps: + - uses: actions/checkout@v4 + + - uses: actions/download-artifact@v4 + with: + path: release/artifacts + merge-multiple: true + + - name: generate SHA-256 checksums + run: | + cd release/artifacts + sha256sum * > ./sha256sum + cat ./sha256sum + + - name: generate CLI manifest + run: | + export VERSION="$GITHUB_REF_NAME" + ./scripts/generate-manifest.sh + + - uses: actions/upload-artifact@v4 + with: + name: manifest.yaml + path: release/manifest.yaml + if-no-files-found: error + + - name: Get version from tag + id: get-version + run: | + echo "tagged_version=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT + shell: bash + + - uses: mindsers/changelog-reader-action@v2 + id: changelog-reader + with: + version: ${{ steps.get-version.outputs.tagged_version }} + path: ./CHANGELOG.md + + - name: create a draft release + uses: ncipollo/release-action@v1 + with: + draft: true + tag: v${{ steps.get-version.outputs.tagged_version }} + body: ${{ steps.changelog-reader.outputs.changes }} + artifacts: release/artifacts/* \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..0847cc0f --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,8 @@ +# MongoDB Connector Changelog +This changelog documents the changes between release versions. + +## [Unreleased] +Changes to be included in the next upcoming release + +## [0.1.0] - 2024-03-14 +TBD \ No newline at end of file diff --git a/connector-definition/Makefile b/connector-definition/Makefile index d6744a88..e33e46f9 100644 --- a/connector-definition/Makefile +++ b/connector-definition/Makefile @@ -13,9 +13,11 @@ dist dist/.hasura-connector: mkdir dist/.hasura-connector dist/.hasura-connector/connector-metadata.yaml: DOCKER_IMAGE ?= $(error The DOCKER_IMAGE variable must be defined) +dist/.hasura-connector/connector-metadata.yaml: CLI_VERSION ?= $(error The CLI_VERSION variable must be defined) dist/.hasura-connector/connector-metadata.yaml: connector-metadata.yaml dist/.hasura-connector cp -f connector-metadata.yaml dist/.hasura-connector/ yq -i '.packagingDefinition.dockerImage = "$(DOCKER_IMAGE)"' dist/.hasura-connector/connector-metadata.yaml + yq -i '.cliPlugin.version = "$(CLI_VERSION)"' dist/.hasura-connector/connector-metadata.yaml dist/connector-definition.tgz: dist/.hasura-connector/connector-metadata.yaml shopt -s dotglob && cd dist && tar -czvf connector-definition.tgz * \ No newline at end of file diff --git a/connector-definition/connector-metadata.yaml b/connector-definition/connector-metadata.yaml index 833db913..2227543f 100644 --- a/connector-definition/connector-metadata.yaml +++ b/connector-definition/connector-metadata.yaml @@ -7,8 +7,8 @@ supportedEnvironmentVariables: commands: update: hasura-mongodb update cliPlugin: - name: hasura-mongodb - version: "0.0.1" + name: mongodb + version: dockerComposeWatch: - path: ./ target: /etc/connector diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index a4564c46..092ba2db 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -3,10 +3,6 @@ name = "mongodb-cli-plugin" edition = "2021" version.workspace = true -[[bin]] -name = "hasura-mongodb" -path = "./src/main.rs" - [dependencies] configuration = { path = "../configuration" } mongodb-agent-common = { path = "../mongodb-agent-common" } diff --git a/deploy.sh b/deploy.sh index f49063fa..98b7004d 100755 --- a/deploy.sh +++ b/deploy.sh @@ -6,7 +6,7 @@ # set -euo pipefail -IMAGE_PATH=ghcr.io/hasura/ndc-mongo +IMAGE_PATH=ghcr.io/hasura/ndc-mongodb if [ -z "${1+x}" ]; then echo "Expected argument of the form refs/heads/ or refs/tags/." diff --git a/nix/docker-cli-plugin.nix b/nix/docker-cli-plugin.nix index e28ae550..5d523776 100644 --- a/nix/docker-cli-plugin.nix +++ b/nix/docker-cli-plugin.nix @@ -7,6 +7,6 @@ dockerTools.buildLayeredImage { inherit name; created = "now"; config = { - Entrypoint = [ "${mongodb-cli-plugin}/bin/hasura-mongodb" ]; + Entrypoint = [ "${mongodb-cli-plugin}/bin/mongodb-cli-plugin" ]; }; } diff --git a/nix/docker.nix b/nix/docker.nix index 7f3b7d5f..d4639d61 100644 --- a/nix/docker.nix +++ b/nix/docker.nix @@ -3,7 +3,7 @@ , dockerTools , lib , architecture ? null -, name ? "ghcr.io/hasura/mongodb-connector" +, name ? "ghcr.io/hasura/ndc-mongodb" # See config options at https://github.com/moby/docker-image-spec/blob/main/spec.md , extraConfig ? { } diff --git a/scripts/generate-manifest.sh b/scripts/generate-manifest.sh new file mode 100755 index 00000000..c48239dd --- /dev/null +++ b/scripts/generate-manifest.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +set -evo pipefail +ROOT="$(pwd)" + +export LINUX_AMD64_SHA256=$(cat ${ROOT}/release/artifacts/sha256sum | grep mongodb-cli-plugin-x86_64-unknown-linux-musl | cut -f1 -d' ') +export MACOS_AMD64_SHA256=$(cat ${ROOT}/release/artifacts/sha256sum | grep mongodb-cli-plugin-x86_64-apple-darwin | cut -f1 -d' ') +export WINDOWS_AMD64_SHA256=$(cat ${ROOT}/release/artifacts/sha256sum | grep mongodb-cli-plugin-x86_64-pc-windows-msvc.exe | cut -f1 -d' ') +export LINUX_ARM64_SHA256=$(cat ${ROOT}/release/artifacts/sha256sum | grep mongodb-cli-plugin-aarch64-unknown-linux-musl | cut -f1 -d' ') +export MACOS_ARM64_SHA256=$(cat ${ROOT}/release/artifacts/sha256sum | grep mongodb-cli-plugin-aarch64-apple-darwin | cut -f1 -d' ') + +(echo "cat <${ROOT}/release/manifest.yaml"; +cat ${ROOT}/scripts/manifest.yaml; echo; echo EOF; +)>${ROOT}/release/manifest-tmp.yaml +. ${ROOT}/release/manifest-tmp.yaml \ No newline at end of file diff --git a/scripts/manifest.yaml b/scripts/manifest.yaml new file mode 100644 index 00000000..a5e5b8e1 --- /dev/null +++ b/scripts/manifest.yaml @@ -0,0 +1,40 @@ +name: mongodb +version: "${VERSION}" +shortDescription: "CLI plugin for Hasura ndc-mongodb" +homepage: https://hasura.io/connectors/mongodb +platforms: + - selector: darwin-arm64 + uri: "https://github.com/hasura/ndc-mongodb/releases/download/${VERSION}/mongodb-cli-plugin-aarch64-apple-darwin" + sha256: "${MACOS_ARM64_SHA256}" + bin: "hasura-mongodb" + files: + - from: "./mongodb-cli-plugin-aarch64-apple-darwin" + to: "hasura-mongodb" + - selector: linux-arm64 + uri: "https://github.com/hasura/ndc-mongodb/releases/download/${VERSION}/mongodb-cli-plugin-aarch64-unknown-linux-musl" + sha256: "${LINUX_ARM64_SHA256}" + bin: "hasura-mongodb" + files: + - from: "./mongodb-cli-plugin-aarch64-unknown-linux-musl" + to: "hasura-mongodb" + - selector: darwin-amd64 + uri: "https://github.com/hasura/ndc-mongodb/releases/download/${VERSION}/mongodb-cli-plugin-x86_64-apple-darwin" + sha256: "${MACOS_AMD64_SHA256}" + bin: "hasura-mongodb" + files: + - from: "./mongodb-cli-plugin-x86_64-apple-darwin" + to: "hasura-mongodb" + - selector: windows-amd64 + uri: "https://github.com/hasura/ndc-mongodb/releases/download/${VERSION}/mongodb-cli-plugin-x86_64-pc-windows-msvc.exe" + sha256: "${WINDOWS_AMD64_SHA256}" + bin: "hasura-mongodb.exe" + files: + - from: "./mongodb-cli-plugin-x86_64-pc-windows-msvc.exe" + to: "hasura-mongodb.exe" + - selector: linux-amd64 + uri: "https://github.com/hasura/ndc-mongodb/releases/download/${VERSION}/mongodb-cli-plugin-x86_64-unknown-linux-musl" + sha256: "${LINUX_AMD64_SHA256}" + bin: "hasura-mongodb" + files: + - from: "./mongodb-cli-plugin-x86_64-unknown-linux-musl" + to: "hasura-mongodb" \ No newline at end of file