-
Notifications
You must be signed in to change notification settings - Fork 7
ci: auto-generate skills on toolbox version updates #164
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,121 @@ | ||||||||||||||||||||||||||||
| #!/bin/bash | ||||||||||||||||||||||||||||
| set -e | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| # Ensure VERSION is passed from the environment | ||||||||||||||||||||||||||||
| if [ -z "$VERSION" ]; then | ||||||||||||||||||||||||||||
| echo "Error: VERSION environment variable is not set." | ||||||||||||||||||||||||||||
| exit 1 | ||||||||||||||||||||||||||||
| fi | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| # SKILL CONFIGURATION | ||||||||||||||||||||||||||||
| # Format: "toolset" "description" | ||||||||||||||||||||||||||||
| # The skill name is automatically generated as "alloydb-postgres-<toolset>" | ||||||||||||||||||||||||||||
| SKILLS=( | ||||||||||||||||||||||||||||
| "admin" | ||||||||||||||||||||||||||||
| "Use these skills when you need to provision new AlloyDB clusters and instances, monitor their creation status, and retrieve high-level configuration or health data for the environment." | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| "access-management" | ||||||||||||||||||||||||||||
| "Use these skills when you need to manage database users, inspect permissions and roles, and verify global configuration parameters related to security and access control." | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| "data" | ||||||||||||||||||||||||||||
| "Use these skills when you need to explore the database schema, identify objects like views and triggers, and execute custom SQL queries to interact with your data." | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| "monitor" | ||||||||||||||||||||||||||||
| "Use these skills when you need to troubleshoot slow performance, analyze query execution plans, identify resource-heavy processes, and monitor system-level PromQL metrics." | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| "health" | ||||||||||||||||||||||||||||
| "Use these skills when you need to optimize storage, identify index issues, analyze table statistics, or manage autovacuum and tablespace configurations to maintain peak database health." | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| "optimize" | ||||||||||||||||||||||||||||
| "Use these skills when you need to discover and manage PostgreSQL extensions or fine-tune engine-level settings such as memory allocation and server configuration parameters." | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| "replication" | ||||||||||||||||||||||||||||
| "Use these skills when you need to monitor replication health, manage sync states between nodes, and ensure the high availability and data distribution of your AlloyDB cluster." | ||||||||||||||||||||||||||||
| ) | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| echo "VALIDATING TOOLSETS BEFORE GENERATION" | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| # Dynamically build the SUPPORTED_TOOLSETS array from the SKILLS array. | ||||||||||||||||||||||||||||
| # We use 'set --' to process the array in chunks without index arithmetic. | ||||||||||||||||||||||||||||
| SUPPORTED_TOOLSETS=() | ||||||||||||||||||||||||||||
| set -- "${SKILLS[@]}" | ||||||||||||||||||||||||||||
| while [ $# -gt 0 ]; do | ||||||||||||||||||||||||||||
| SUPPORTED_TOOLSETS+=("$1") | ||||||||||||||||||||||||||||
| shift 2 | ||||||||||||||||||||||||||||
| done | ||||||||||||||||||||||||||||
|
Comment on lines
+38
to
+45
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Instead of using
Suggested change
|
||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| echo "Currently Supported Toolsets: ${SUPPORTED_TOOLSETS[*]}" | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| # Fetch the upstream source of truth YAML for this specific version | ||||||||||||||||||||||||||||
| RAW_URL="https://raw.githubusercontent.com/googleapis/mcp-toolbox/v${VERSION}/internal/prebuiltconfigs/tools/alloydb-postgres.yaml" | ||||||||||||||||||||||||||||
| echo "Fetching upstream config from: $RAW_URL" | ||||||||||||||||||||||||||||
| UPSTREAM_YAML=$(curl -sL --fail "$RAW_URL" || { echo "Error: Could not fetch upstream YAML for v$VERSION"; exit 1; }) | ||||||||||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Because this
Suggested change
|
||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| # Extract the list of toolsets. Each toolset is its own YAML document: | ||||||||||||||||||||||||||||
| # kind: toolset | ||||||||||||||||||||||||||||
| # name: <toolset> | ||||||||||||||||||||||||||||
| UPSTREAM_TOOLSETS=$(echo "$UPSTREAM_YAML" | awk '$1=="kind:" && $2=="toolset"{f=1; next} f && $1=="name:"{print $2; f=0}') | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| # Compare upstream toolsets against our supported list | ||||||||||||||||||||||||||||
| MISSING_TOOLSETS=false | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| for upstream_tool in $UPSTREAM_TOOLSETS; do | ||||||||||||||||||||||||||||
| if [ -z "$upstream_tool" ] || [ "$upstream_tool" == "-" ]; then continue; fi | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| if [[ ! " ${SUPPORTED_TOOLSETS[*]} " =~ " ${upstream_tool} " ]]; then | ||||||||||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Using the regular expression operator
Suggested change
|
||||||||||||||||||||||||||||
| echo "ERROR: Upstream configuration contains a new toolset: '$upstream_tool'" | ||||||||||||||||||||||||||||
| MISSING_TOOLSETS=true | ||||||||||||||||||||||||||||
| fi | ||||||||||||||||||||||||||||
| done | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| if [ "$MISSING_TOOLSETS" = true ]; then | ||||||||||||||||||||||||||||
| echo "PIPELINE FAILED: Missing Toolset Generators" | ||||||||||||||||||||||||||||
| echo "The source of truth file has toolsets that your script does not support." | ||||||||||||||||||||||||||||
| echo "Please update the SKILLS array in generate_skills.sh to include generators" | ||||||||||||||||||||||||||||
| echo "for the missing toolsets above, then commit your changes to unblock this PR." | ||||||||||||||||||||||||||||
| exit 1 | ||||||||||||||||||||||||||||
| fi | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| echo "Validation passed. All upstream toolsets are supported." | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| echo "BEGINNING SKILL GENERATION" | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| LICENSE_HEADER="// Copyright 2026 Google LLC | ||||||||||||||||||||||||||||
| // | ||||||||||||||||||||||||||||
| // Licensed under the Apache License, Version 2.0 (the \"License\"); | ||||||||||||||||||||||||||||
| // you may not use this file except in compliance with the License. | ||||||||||||||||||||||||||||
| // You may obtain a copy of the License at | ||||||||||||||||||||||||||||
| // | ||||||||||||||||||||||||||||
| // http://www.apache.org/licenses/LICENSE-2.0 | ||||||||||||||||||||||||||||
| // | ||||||||||||||||||||||||||||
| // Unless required by applicable law or agreed to in writing, software | ||||||||||||||||||||||||||||
| // distributed under the License is distributed on an \"AS IS\" BASIS, | ||||||||||||||||||||||||||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||||||||||||||||||||||||
| // See the License for the specific language governing permissions and | ||||||||||||||||||||||||||||
| // limitations under the License." | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| ADDITIONAL_NOTES="Note: The scripts automatically load the environment variables from various .env files. Do not ask the user to set vars unless skill executions fails due to env var absence." | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| # Base Command Function | ||||||||||||||||||||||||||||
| generate_skill() { | ||||||||||||||||||||||||||||
| local TOOLSET="$1" | ||||||||||||||||||||||||||||
| local SKILL_DESC="$2" | ||||||||||||||||||||||||||||
| local SKILL_NAME="alloydb-postgres-$TOOLSET" | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| echo "Generating skill: $SKILL_NAME..." | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| npx "@toolbox-sdk/server@${VERSION}" --prebuilt alloydb-postgres skills-generate \ | ||||||||||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. In non-interactive environments like CI/CD pipelines,
Suggested change
|
||||||||||||||||||||||||||||
| --name "$SKILL_NAME" \ | ||||||||||||||||||||||||||||
| --description "$SKILL_DESC" \ | ||||||||||||||||||||||||||||
| --toolset="$TOOLSET" \ | ||||||||||||||||||||||||||||
| --license-header "$LICENSE_HEADER" \ | ||||||||||||||||||||||||||||
| --additional-notes="$ADDITIONAL_NOTES" | ||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| set -- "${SKILLS[@]}" | ||||||||||||||||||||||||||||
| while [ $# -gt 0 ]; do | ||||||||||||||||||||||||||||
| generate_skill "$1" "$2" | ||||||||||||||||||||||||||||
| shift 2 | ||||||||||||||||||||||||||||
| done | ||||||||||||||||||||||||||||
|
Comment on lines
+115
to
+119
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Similar to the validation loop, using a standard
Suggested change
|
||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| echo "All skills generated successfully!" | ||||||||||||||||||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,57 @@ | ||
| # Copyright 2026 Google LLC | ||
| # | ||
| # Licensed under the Apache License, Version 2.0 (the "License"); | ||
| # you may not use this file except in compliance with the License. | ||
| # You may obtain a copy of the License at | ||
| # | ||
| # http://www.apache.org/licenses/LICENSE-2.0 | ||
| # | ||
| # Unless required by applicable law or agreed to in writing, software | ||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| # See the License for the specific language governing permissions and | ||
| # limitations under the License. | ||
|
|
||
| name: Generate Skills | ||
|
|
||
| on: | ||
| pull_request: | ||
| paths: | ||
| - "toolbox_version.txt" | ||
|
|
||
| jobs: | ||
| generate-skills: | ||
| # Only run for same-repo PRs (e.g. renovate's toolbox bump), where the | ||
| # built-in GITHUB_TOKEN can push back to the PR branch. | ||
| if: github.event.pull_request.head.repo.full_name == github.repository | ||
| runs-on: ubuntu-latest | ||
| permissions: | ||
| contents: write | ||
| steps: | ||
| - name: Check out PR branch | ||
| uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 | ||
| with: | ||
| ref: ${{ github.head_ref }} | ||
|
|
||
| - name: Generate skills | ||
| run: | | ||
| VERSION="$(tr -d '\n' < toolbox_version.txt)" | ||
| echo "Detected toolbox version: $VERSION" | ||
| export VERSION | ||
| chmod +x ./.github/scripts/generate_skills.sh | ||
| ./.github/scripts/generate_skills.sh | ||
|
|
||
| - name: Commit and push regenerated skills | ||
| run: | | ||
| if [ -z "$(git status --porcelain)" ]; then | ||
| echo "No skill changes generated. Nothing to commit." | ||
| exit 0 | ||
| fi | ||
|
|
||
| echo "Changes detected. Committing regenerated skills..." | ||
| git config user.name "release-please[bot]" | ||
| git config user.email "55107282+release-please[bot]@users.noreply.github.com" | ||
|
|
||
| git add . | ||
| git commit -m "chore: auto-generate skills for toolbox v$(tr -d '\n' < toolbox_version.txt)" | ||
| git push |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It is highly recommended to use
set -euo pipefailfor robust error handling in Bash scripts. Additionally, whenset -uis active, referencing$VERSIONdirectly when it is not set will cause the script to exit immediately with an unbound variable error. Using${VERSION:-}prevents this and allows the custom error message to be printed. Also, redirecting the error message to>&2ensures it is printed to stderr.