mirror of
https://github.com/graphql-hive/console
synced 2026-04-21 14:37:17 +00:00
169 lines
6.5 KiB
YAML
169 lines
6.5 KiB
YAML
name: apollo-router-release
|
|
on:
|
|
# For PRs, this pipeline will use the commit ID as Docker image tag and R2 artifact prefix.
|
|
pull_request:
|
|
branches:
|
|
- main
|
|
paths:
|
|
- 'packages/libraries/router/**'
|
|
- 'packages/libraries/sdk-rs/**'
|
|
- 'docker/router.dockerfile'
|
|
- 'scripts/compress/**'
|
|
- 'configs/cargo/Cargo.lock'
|
|
- 'Cargo.lock'
|
|
- 'Cargo.toml'
|
|
# For `main` changes, this pipeline will look for changes in Rust crates or plugin versioning, and
|
|
# publish them only if changes are found and image does not exists in GH Packages.
|
|
push:
|
|
paths:
|
|
- 'packages/libraries/router/**'
|
|
- 'packages/libraries/sdk-rs/**'
|
|
- 'docker/router.dockerfile'
|
|
- 'scripts/compress/**'
|
|
- 'configs/cargo/Cargo.lock'
|
|
- 'Cargo.lock'
|
|
- 'Cargo.toml'
|
|
branches:
|
|
- main
|
|
|
|
jobs:
|
|
# This script is doing the following:
|
|
# 1. Get the version of the apollo-router and the plugin from the Cargo.toml and package.json files
|
|
# 2. Check if there are changes in the Cargo.toml and package.json files in the current commit
|
|
# 3. If there are changes, check if the image tag exists in the GitHub Container Registry
|
|
find-changes:
|
|
runs-on: ubuntu-22.04
|
|
if: ${{ !github.event.pull_request.head.repo.fork }}
|
|
outputs:
|
|
should_release: ${{ steps.find_changes.outputs.should_release }}
|
|
release_version: ${{ steps.find_changes.outputs.release_version }}
|
|
release_latest: ${{ steps.find_changes.outputs.release_latest }}
|
|
steps:
|
|
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
|
with:
|
|
fetch-depth: 2
|
|
|
|
- name: find changes in versions
|
|
id: find_changes
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
run: |
|
|
if [ "$GITHUB_EVENT_NAME" == "pull_request" ]; then
|
|
echo "Running in a PR, using commit ID as tag"
|
|
echo "should_release=true" >> $GITHUB_OUTPUT
|
|
echo "release_latest=false" >> $GITHUB_OUTPUT
|
|
echo "release_version=$GITHUB_SHA" >> $GITHUB_OUTPUT
|
|
exit 0
|
|
fi
|
|
|
|
echo "Running on push event, looking for changes in Rust crates or plugin versioning"
|
|
|
|
image_name="apollo-router"
|
|
github_org="graphql-hive"
|
|
router_version=$(cargo tree -i apollo-router --quiet | head -n 1 | awk -F" v" '{print $2}')
|
|
plugin_version=$(jq -r '.version' packages/libraries/router/package.json)
|
|
has_changes=$(git diff HEAD~ HEAD --name-only -- 'packages/libraries/router/Cargo.toml' 'packages/libraries/router/package.json' 'packages/libraries/sdk-rs/Cargo.toml' 'packages/libraries/sdk-rs/package.json' 'Cargo.lock' 'configs/cargo/Cargo.lock')
|
|
|
|
if [ "$has_changes" ]; then
|
|
image_tag_version="router${router_version}-plugin${plugin_version}"
|
|
|
|
response=$(curl -L \
|
|
-H "Accept: application/vnd.github+json" \
|
|
-H "Authorization: Bearer ${GITHUB_TOKEN}" \
|
|
-H "X-GitHub-Api-Version: 2022-11-28" \
|
|
-s \
|
|
https://api.github.com/orgs/${github_org}/packages/container/${image_name}/versions)
|
|
tag_exists=$(echo "$response" | jq -r ".[] | .metadata.container.tags[] | select(. | contains(\"${image_tag_version}\"))")
|
|
|
|
if [ ! "$tag_exists" ]; then
|
|
echo "Found changes in version $version_to_publish"
|
|
echo "release_version=$image_tag_version" >> $GITHUB_OUTPUT
|
|
echo "should_release=true" >> $GITHUB_OUTPUT
|
|
echo "release_latest=true" >> $GITHUB_OUTPUT
|
|
else
|
|
echo "No changes found in version $image_tag_version"
|
|
fi
|
|
fi
|
|
|
|
# Builds Rust crates, and creates Docker images
|
|
dockerize:
|
|
uses: ./.github/workflows/build-and-dockerize.yaml
|
|
name: image-build
|
|
needs:
|
|
- find-changes
|
|
if: ${{ needs.find-changes.outputs.should_release == 'true' }}
|
|
with:
|
|
imageTag: ${{ needs.find-changes.outputs.release_version }}
|
|
publishLatest: ${{ needs.find-changes.outputs.release_latest == 'true' }}
|
|
targets: apollo-router-hive-build
|
|
build: false
|
|
publishPrComment: true
|
|
secrets: inherit
|
|
|
|
# Test the Docker image, if it was published
|
|
test-image:
|
|
name: test apollo-router docker image
|
|
needs:
|
|
- dockerize
|
|
- find-changes
|
|
runs-on: ubuntu-22.04
|
|
env:
|
|
HIVE_TOKEN: ${{ secrets.HIVE_TOKEN }}
|
|
steps:
|
|
- name: Run Docker image
|
|
run: |
|
|
# Create router.yaml
|
|
cat << EOF > router.yaml
|
|
supergraph:
|
|
listen: 0.0.0.0:4000
|
|
health_check:
|
|
listen: 0.0.0.0:8088
|
|
enabled: true
|
|
path: /health
|
|
plugins:
|
|
hive.usage:
|
|
enabled: false
|
|
EOF
|
|
|
|
# Download supergraph
|
|
curl -sSL https://supergraph.demo.starstuff.dev/ > ./supergraph.graphql
|
|
|
|
# Run Docker image
|
|
docker run -p 4000:4000 -p 8088:8088 --name apollo_router_test -d \
|
|
--env HIVE_TOKEN="fake" \
|
|
--mount "type=bind,source=/$(pwd)/router.yaml,target=/dist/config/router.yaml" \
|
|
--mount "type=bind,source=/$(pwd)/supergraph.graphql,target=/dist/config/supergraph.graphql" \
|
|
ghcr.io/graphql-hive/apollo-router:${{ needs.find-changes.outputs.release_version }} \
|
|
--log debug \
|
|
--supergraph /dist/config/supergraph.graphql \
|
|
--config /dist/config/router.yaml
|
|
|
|
# Wait for the container to be ready
|
|
echo "Waiting for the container to be ready..."
|
|
sleep 20
|
|
HTTP_RESPONSE=$(curl --retry 5 --retry-delay 5 --max-time 30 --write-out "%{http_code}" --silent --output /dev/null "http://127.0.0.1:8088/health")
|
|
|
|
# Check if the HTTP response code is 200 (OK)
|
|
if [ $HTTP_RESPONSE -eq 200 ]; then
|
|
echo "Health check successful."
|
|
docker stop apollo_router_test
|
|
docker rm apollo_router_test
|
|
exit 0
|
|
else
|
|
echo "Health check failed with HTTP status code $HTTP_RESPONSE."
|
|
docker stop apollo_router_test
|
|
docker rm apollo_router_test
|
|
exit 1
|
|
fi
|
|
|
|
# Build and publish Rust crates and binaries
|
|
binary:
|
|
uses: ./.github/workflows/publish-rust.yaml
|
|
secrets: inherit
|
|
needs:
|
|
- find-changes
|
|
if: ${{ needs.find-changes.outputs.should_release == 'true' }}
|
|
with:
|
|
publish: true
|
|
latest: ${{ needs.find-changes.outputs.release_latest == 'true' }}
|
|
version: ${{ needs.find-changes.outputs.release_version }}
|