Spec File Update Workflow #22
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: "Spec File Update Workflow" | |
on: | |
workflow_dispatch: | |
inputs: | |
file: | |
description: "Which spec file to update" | |
type: choice | |
required: false | |
options: | |
- core | |
- grounding | |
- orchestration | |
default: orchestration | |
file-ref: | |
description: "Branch or tag to checkout the spec file from" | |
required: false | |
default: main | |
type: string | |
create-pr: | |
description: "Create a pull request after updating the spec file" | |
required: false | |
default: true | |
type: boolean | |
env: | |
MVN_MULTI_THREADED_ARGS: --batch-mode --no-transfer-progress --fail-at-end --show-version --threads 1C | |
JAVA_VERSION: 17 | |
jobs: | |
generate: | |
name: "Download, Generate, Compile and Push" | |
runs-on: [ubuntu-latest] | |
permissions: | |
pull-requests: write | |
contents: write | |
outputs: | |
spec_diff: ${{ steps.spec_diff.outputs.spec_diff }} | |
branch: ${{ steps.push.outputs.branch }} | |
pr_url: ${{ steps.create-pr.outputs.pr_url }} | |
compilation_result: ${{ steps.compile.outputs.compilation_result }} | |
test_result: ${{ steps.compile.outputs.test_result }} | |
env: | |
API_BASE_URL: "https://github.tools.sap/api/v3/repos" | |
CHOICE: ${{ github.event.inputs.file }} | |
REF: ${{ github.event.inputs.file-ref }} | |
CREATE_PR: ${{ github.event.inputs.create-pr }} | |
steps: | |
- name: "Checkout repository" | |
uses: actions/checkout@v4 | |
with: | |
token: ${{ secrets.BOT_SDK_JS_FOR_DOCS_REPO_PR }} | |
- name: "Checkout or Create Branch" | |
id: branch | |
# Checkout branch if it exists, otherwise create it | |
run: | | |
BRANCH="spec-update/$CHOICE/$REF" | |
git fetch origin $BRANCH || true | |
git checkout -B $BRANCH origin/$BRANCH || git checkout -b $BRANCH | |
echo "branch=$BRANCH" >> "$GITHUB_OUTPUT" | |
- name: "Download specification file" | |
id: download | |
env: | |
GH_ENTERPRISE_TOKEN: ${{ secrets.GH_TOOLS_TOKEN }} | |
run: | | |
case $CHOICE in | |
core) | |
API_URL="$API_BASE_URL/cloudsdk/cloud-sdk-java-tests/contents/aicore.yaml?ref=$REF" | |
FILE_PATH='core/src/main/resources/spec/aicore.yaml' | |
;; | |
grounding) | |
# TODO | |
exit 1 | |
;; | |
orchestration) | |
API_URL="$API_BASE_URL/AI/llm-orchestration/contents/src/spec/api.yaml?ref=$REF" | |
FILE_PATH='orchestration/src/main/resources/spec/orchestration.yaml' | |
;; | |
esac | |
echo "Downloading $CHOICE specification file from $API_URL ..." | |
gh api $API_URL -H "Accept: application/vnd.github.raw" > $FILE_PATH | |
- name: "Exit if there are no changes" | |
id: spec_diff | |
run: | | |
if [[ `git status --porcelain` ]]; then | |
echo "spec_diff=true" >> "$GITHUB_OUTPUT" | |
else | |
echo "spec_diff=false" >> "$GITHUB_OUTPUT" | |
fi | |
- name: "Setup java" | |
uses: actions/setup-java@v4 | |
if: steps.spec_diff.outputs.spec_diff == 'true' | |
with: | |
distribution: "temurin" | |
java-version: ${{ env.JAVA_VERSION }} | |
cache: 'maven' | |
- name: "Generate" | |
id: generate | |
if: steps.spec_diff.outputs.spec_diff == 'true' | |
run: | | |
mvn process-sources -Dgenerate ${{ env.MVN_MULTI_THREADED_ARGS }} | |
- name: "Compile and Test" | |
id: compile | |
if: steps.spec_diff.outputs.spec_diff == 'true' | |
# Compilation can easily fail e.g. from re-namings and has to be fixed manually. | |
# Thus, this action raises the PR anyway and only reports success or failure of compilation and testing. | |
run: | | |
if mvn test-compile ${{ env.MVN_MULTI_THREADED_ARGS }} ; then | |
echo "compilation_result=success" >> "$GITHUB_OUTPUT" | |
if mvn test ${{ env.MVN_MULTI_THREADED_ARGS }} ; then | |
echo "test_result=success" >> "$GITHUB_OUTPUT" | |
else | |
echo "test_result=failure" >> "$GITHUB_OUTPUT" | |
fi | |
else | |
echo "compilation_result=failure" >> "$GITHUB_OUTPUT" | |
echo "test_result=skipped" >> "$GITHUB_OUTPUT" | |
fi | |
- name: "Push changes" | |
id: push | |
if: steps.spec_diff.outputs.spec_diff == 'true' | |
run: | | |
git config --global user.email "[email protected]" | |
git config --global user.name "SAP Cloud SDK Bot" | |
git add --all | |
git status | |
git commit -m "Update $CHOICE based on $REF" | |
git push --set-upstream origin ${{ steps.branch.outputs.branch }} | |
- name: "Create PR" | |
id: create-pr | |
if: ${{ env.CREATE_PR == 'true' && steps.spec_diff.outputs.spec_diff == 'true'}} | |
env: | |
GH_TOKEN: ${{ secrets.BOT_SDK_JS_FOR_DOCS_REPO_PR }} | |
BRANCH: ${{ steps.branch.outputs.branch }} | |
run: | | |
if gh pr list --head $BRANCH --json number -q '.[].number' | grep -q .; then | |
echo "An open PR already exists for this branch. Skipping PR creation." | |
exit 0 | |
fi | |
PR_URL=$(gh pr create --base main --head $BRANCH --title "feat: [DevOps] Update $CHOICE specification" --body " | |
## Context | |
Update $CHOICE specification file based on $REF. | |
This PR was created automatically by the [spec-update workflow](https://github.com/SAP/ai-sdk-java/actions/workflows/spec-update.yaml). | |
You can commit on top of this branch, but as long as this PR is open the action can't be re-run. | |
- Compilation outcome: ${{ steps.compile.outputs.compilation_result }} | |
- Test run outcome: ${{ steps.compile.outputs.test_result }} | |
Before merging, make sure to update tests and release notes, if necessary. | |
## Definition of Done | |
- [ ] Unit tests cover new classes | |
- [ ] Release notes updated | |
") && echo "pr_url=$PR_URL" >> "$GITHUB_OUTPUT" | |
- name: Generate Job Summary | |
if: ${{ always() }} | |
env: | |
BRANCH: ${{ steps.branch.outputs.branch }} | |
PR_URL: ${{ steps.create-pr.outputs.pr_url }} | |
run: | | |
DIFF_URL="https://github.com/SAP/ai-sdk-java/compare/main...$BRANCH" | |
echo "## Workflow Execution Summary" >> $GITHUB_STEP_SUMMARY | |
echo "" >> $GITHUB_STEP_SUMMARY | |
echo "| Step | Status |" >> $GITHUB_STEP_SUMMARY | |
echo "|------|--------|" >> $GITHUB_STEP_SUMMARY | |
echo "| File Download | ${{ steps.download.outcome == 'success' && '✅' || '❌' }} ${{ steps.download.outcome }}" >> $GITHUB_STEP_SUMMARY | |
echo "| Spec File Changes | ${{ steps.spec_diff.outputs.spec_diff == 'true' && '🔄 Changes Detected' || '⏹️ No Changes' }}" >> $GITHUB_STEP_SUMMARY | |
if ${{ steps.spec_diff.outputs.spec_diff == 'true' }}; then | |
echo "| Client Generation | ${{ steps.generate.outcome == 'success' && '✅' || '❌' }} ${{ steps.generate.outcome }}" >> $GITHUB_STEP_SUMMARY | |
echo "| Client Compilation | ${{ steps.compile.outputs.compilation_result == 'success' && '✅' || '❌' }} ${{ steps.compile.outputs.compilation_result }}" >> $GITHUB_STEP_SUMMARY | |
echo "| Client Testing | ${{ steps.compile.outputs.test_result == 'success' && '✅' || steps.compile.outputs.test_result == 'skipped' && '⏩' || '❌' }} ${{ steps.compile.outputs.test_result }}" >> $GITHUB_STEP_SUMMARY | |
echo "| Branch Creation | ${{ steps.push.outcome == 'success' && '✅ [Branch Link]($DIFF_URL)' || '❌ failure' }}" >> $GITHUB_STEP_SUMMARY | |
echo "| Pull Request Creation | ${{env.CREATE_PR == 'false' && '⏩ skipped' }}${{ env.CREATE_PR == 'true' && steps.push.outcome == 'success' && '✅ [PR Link]($PR_URL)' }}" >> $GITHUB_STEP_SUMMARY | |
fi |