Skip to content

Add workflow to determine API changes and comment on PRs #6

Add workflow to determine API changes and comment on PRs

Add workflow to determine API changes and comment on PRs #6

name: Analyze PR Changes
on: [pull_request]
jobs:
analyze:
runs-on: ubuntu-latest
steps:
- name: Checkout Repo
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Environment Variables
shell: bash -eo pipefail {0}
run: |
BEFORE_SHA=$(git merge-base "$BASE_SHA" "$HEAD_SHA")
AFTER_SHA=${HEAD_SHA}
CLUSTER_SPEC=/tmp/opensearch-openapi-CLUSTER.yaml
BEFORE_SPEC=/tmp/opensearch-openapi-${BEFORE_SHA}.yaml
AFTER_SPEC=/tmp/opensearch-openapi-${AFTER_SHA}.yaml
{
for var in BEFORE_SHA AFTER_SHA CLUSTER_SPEC BEFORE_SPEC AFTER_SPEC ; do
echo "${var}=${!var}"
done
} | tee "$GITHUB_ENV"
env:
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
BASE_SHA: ${{ github.event.pull_request.base.sha }}
- name: Dump OpenSearch Cluster's API
shell: bash -eo pipefail {0}
run: |
docker build coverage --tag opensearch-with-api-plugin
docker run \
--name opensearch \
--rm -d \
-p 9200:9200 -p 9600:9600 \
-e "discovery.type=single-node" \
-e OPENSEARCH_INITIAL_ADMIN_PASSWORD="$OPENSEARCH_PASSWORD" \
opensearch-with-api-plugin
npm install
npm run dump-cluster-spec -- --insecure --output $CLUSTER_SPEC
docker stop opensearch
env:
OPENSEARCH_PASSWORD: BobgG7YrtsdKf9M
- name: Checkout BEFORE Spec
shell: bash -eo pipefail {0}
run: git checkout $BEFORE_SHA
- name: Build BEFORE Spec
shell: bash -eo pipefail {0}
run: |
npm install
npm run merge -- --source ./spec --output $BEFORE_SPEC
- name: Checkout AFTER Spec
shell: bash -eo pipefail {0}
run: git checkout $AFTER_SHA
- name: Build AFTER Spec
shell: bash -eo pipefail {0}
run: |
npm install
npm run merge -- --source ./spec --output $AFTER_SPEC
- name: Calculate Coverage
shell: bash -eo pipefail {0}
run: |
for sha in ${BEFORE_SHA} ${AFTER_SHA} ; do
echo "Calculating coverage of ${sha}"
npm run coverage:spec -- \
--cluster $CLUSTER_SPEC \
--specification /tmp/opensearch-openapi-${sha}.yaml \
--output /tmp/coverage-api-${sha}.json
done
jq . /tmp/coverage-api-${AFTER_SHA}.json
jq --slurp '
[ .[].counts ]
| {
"covered_before": (.[0].covered),
"covered_before_pct": (.[0].covered_pct),
"covered_after": (.[1].covered),
"covered_after_pct": (.[1].covered_pct),
"total_to_cover": (.[1].covered + .[1].uncovered),
"covered_delta": (.[1].covered - .[0].covered),
"covered_pct_delta": ((.[1].covered_pct - .[0].covered_pct) * 100 | round / 100)
}
' \
/tmp/coverage-api-${BEFORE_SHA}.json \
/tmp/coverage-api-${AFTER_SHA}.json \
| tee ./coverage-api-${BEFORE_SHA}-${AFTER_SHA}-DIFF.json
- name: Upload Coverage Data
id: upload-coverage
uses: actions/upload-artifact@v4
with:
name: coverage-api
path: |
/tmp/coverage-api-*.json
- name: Install openapi-changes
shell: bash -eo pipefail {0}
run: npm install --global @pb33f/openapi-changes
- name: Generate API Changes HTML Report
shell: bash -eo pipefail {0}
run: openapi-changes html-report --no-logo --no-color $BEFORE_SPEC $AFTER_SPEC
- name: Upload API Changes HTML Report
id: upload-report
uses: actions/upload-artifact@v4
with:
name: api-changes-report
path: |
report.html
/tmp/opensearch-openapi-*.yaml
- name: Generate API Changes Summary
shell: bash -eo pipefail {0}
run: |
if ! openapi-changes summary --no-logo --no-color --markdown $BEFORE_SPEC $AFTER_SPEC >output.md ; then
if ! grep -q 'breaking changes discovered' output.md ; then
cat output.md >/dev/stderr
exit 1
fi
fi
gawk '
BEGIN {
RS = "(\r|\n|\r\n)"
WAS_BLANK = 0
HAD_CHANGES = 0
}
/^starting work/ || /^Building original model/ || /^Date:/ || /^SPEC:/ || /^ERROR:/ || /^DONE:/ {
next
}
/^[[:space:]]*$/ {
WAS_BLANK = 1
next
}
WAS_BLANK {
WAS_BLANK = 0
print ""
}
{
HAD_CHANGES = 1
print
}
END {
if (!HAD_CHANGES) {
print "**NO CHANGES**\n"
}
}
' output.md | tee changes-summary.md
- name: Upload Summary
uses: actions/upload-artifact@v4
with:
name: changes-summary
path: changes-summary.md