Update specs and client libraries #661
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: update-specs-and-client-libraries | |
run-name: Update specs and client libraries | |
on: | |
push: | |
branches: | |
- master | |
paths-ignore: | |
- "generated/artifacts/**" | |
pull_request: | |
branches: | |
- master | |
workflow_dispatch: | |
inputs: | |
update-onfido-java: | |
description: "Refresh onfido-java?" | |
required: true | |
default: false | |
type: boolean | |
update-onfido-node: | |
description: "Refresh onfido-node?" | |
required: true | |
default: false | |
type: boolean | |
update-onfido-php: | |
description: "Refresh onfido-php?" | |
required: true | |
default: false | |
type: boolean | |
update-onfido-python: | |
description: "Refresh onfido-python?" | |
required: true | |
default: false | |
type: boolean | |
update-onfido-ruby: | |
description: "Refresh onfido-ruby?" | |
required: true | |
default: false | |
type: boolean | |
type-of-change: | |
description: "Type of change?" | |
required: true | |
default: No change | |
type: choice | |
options: | |
- Major | |
- Minor | |
- Patch | |
- No change | |
lib-version-suffix: | |
description: "Add a suffix to version? (e.g `-pre`)" | |
type: string | |
override-spec-version: | |
description: "Override onfido-spec version? (e.g `v2.8.0-beta`)" | |
type: string | |
override-lib-version: | |
description: "Override client library version? (e.g `3.0.1-alpha`)" | |
type: string | |
jobs: | |
validate_input_specs: | |
name: Validate multi file specification | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Validate OpenAPI Specification YAML | |
run: ./shell/run-prettier.sh check | |
generate_specs_and_libraries: | |
name: Build single-file OpenAPI specifications and client libraries | |
runs-on: ubuntu-latest | |
outputs: | |
last_commit_long_sha: ${{ steps.retriever.outputs.last_commit_long_sha }} | |
last_commit_short_sha: ${{ steps.retriever.outputs.last_commit_short_sha }} | |
last_commit_tag: ${{ steps.retriever.outputs.last_commit_tag }} | |
java_version: ${{ steps.generator.outputs.java_okhttp_gson_version }} | |
typescript_axios_version: ${{ steps.generator.outputs.typescript_axios_version }} | |
php_version: ${{ steps.generator.outputs.php_version }} | |
python_version: ${{ steps.generator.outputs.python_urllib3_version }} | |
ruby_version: ${{ steps.generator.outputs.ruby_faraday_version }} | |
container: | |
image: openapitools/openapi-generator-cli:v7.6.0 | |
env: | |
OPENAPI_GENERATOR_COMMAND: docker-entrypoint.sh | |
BUMP_CLIENT_LIBRARY_VERSION: ${{ inputs.type-of-change }} | |
CLIENT_LIBRARY_VERSION_SUFFIX: ${{ inputs.lib-version-suffix }} | |
OVERRIDE_CLIENT_LIBRARY_VERSION: ${{ inputs.override-lib-version }} | |
steps: | |
- name: Install pre-requisites | |
run: | | |
apt-get update | |
apt-get install -yqq \ | |
gettext-base \ | |
git \ | |
jq | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 10 | |
fetch-tags: true | |
- name: Retrieve information about last commit not authored by GitHub Actions Bot and release (if any) | |
id: retriever | |
run: | | |
git config --global --add safe.directory $(pwd) | |
LAST_COMMIT_LONG_SHA=$(git rev-list --perl-regexp --author='^((?!GitHub Actions Bot).*)$' HEAD | head -n 1) | |
echo "last_commit_long_sha=$LAST_COMMIT_LONG_SHA" >> $GITHUB_OUTPUT | |
echo "last_commit_short_sha=$(git rev-parse --short $LAST_COMMIT_LONG_SHA)" >> $GITHUB_OUTPUT | |
echo "last_commit_tag=$(git tag --contains HEAD | grep ^v | sort | tail -n 1 || true)" >> $GITHUB_OUTPUT | |
- name: Validate multi-file OpenAPI specification | |
run: | | |
$OPENAPI_GENERATOR_COMMAND validate -i openapi.yaml | |
- name: Generate specifications and client libraries | |
id: generator | |
run: | | |
./shell/generate.sh | |
- name: Store generated artifacts and finalization scripts | |
uses: actions/upload-artifact@v4 | |
with: | |
name: artifacts-${{ github.workflow }}-${{ github.run_id }}-${{ github.run_number }} | |
include-hidden-files: true | |
path: | | |
shell/sync-lib.sh | |
generated/artifacts | |
generators/**/exclusions.txt | |
update_specs: | |
name: Update and commit single-file OpenAPI specifications | |
runs-on: ubuntu-latest | |
needs: generate_specs_and_libraries | |
if: github.event_name == 'push' | |
environment: generation | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
token: ${{ secrets.GH_ACTION_ACCESS_TOKEN }} | |
ref: ${{ github.ref_name }} | |
- uses: actions/download-artifact@v4 | |
with: | |
name: artifacts-${{ github.workflow }}-${{ github.run_id }}-${{ github.run_number }} | |
- name: Create reference OpenAPI Specification and refresh Postman Collection | |
run: | | |
npm install prettier openapi-to-postmanv2 | |
mkdir -p generated/artifacts/{openapi-reference,postman} | |
./shell/patch-openapi-definition.py \ | |
generated/artifacts/openapi/openapi.json \ | |
generated/artifacts/openapi-reference/openapi.json | |
npx prettier --write \ | |
generated/artifacts/openapi-reference/openapi.json | |
npx openapi2postmanv2 \ | |
-s generated/artifacts/openapi-reference/openapi.json \ | |
-o generated/artifacts/postman/collection.json \ | |
-p -O folderStrategy=Tags,parametersResolution=Example | |
./shell/publish-postman-collection.py \ | |
generated/artifacts/postman/collection.json \ | |
38453665-3be48048-00b8-43bf-8c91-82953801b7aa | |
env: | |
POSTMAN_API_KEY: ${{ secrets.POSTMAN_API_KEY }} | |
- name: Commit and push single-file OpenAPI specifications | |
run: | | |
if [ -z "$(git status --porcelain=v1 generated/artifacts/openapi*)" ]; | |
then | |
echo "no change detected" | |
else | |
echo "changes detected" | |
git config user.name "GitHub Actions Bot" | |
git config user.email "<>" | |
git add generated/artifacts/openapi* && git status | |
git commit -m "Single file specifications refresh (${{ needs.generate_specs_and_libraries.outputs.last_commit_short_sha }})" generated/artifacts/openapi* | |
git push | |
fi | |
update_client_libraries: | |
name: "Create PR to ${{ matrix.git_repo_id }} repository using ${{ matrix.generator }} generator (${{matrix.version}})" | |
runs-on: ubuntu-latest | |
container: | |
image: ${{ matrix.image }} | |
needs: generate_specs_and_libraries | |
strategy: | |
max-parallel: 1 | |
matrix: | |
include: | |
- generator: java/okhttp-gson | |
git_repo_id: onfido-java | |
version: ${{ needs.generate_specs_and_libraries.outputs.java_version }} | |
update: ${{ inputs.update-onfido-java }} | |
- generator: typescript-axios | |
git_repo_id: onfido-node | |
version: ${{ needs.generate_specs_and_libraries.outputs.typescript_axios_version }} | |
update: ${{ inputs.update-onfido-node }} | |
- generator: php | |
git_repo_id: onfido-php | |
image: composer:2.7 | |
version: ${{ needs.generate_specs_and_libraries.outputs.php_version }} | |
update: ${{ inputs.update-onfido-php }} | |
- generator: python/urllib3 | |
git_repo_id: onfido-python | |
image: python:3.11 | |
extra: pipx | |
version: ${{ needs.generate_specs_and_libraries.outputs.python_version }} | |
update: ${{ inputs.update-onfido-python }} | |
- generator: ruby/faraday | |
git_repo_id: onfido-ruby | |
image: ruby:3.2 | |
version: ${{ needs.generate_specs_and_libraries.outputs.ruby_version }} | |
update: ${{ inputs.update-onfido-ruby }} | |
if: github.event_name == 'workflow_dispatch' | |
environment: generation | |
steps: | |
- name: Install pre-requisites | |
if: ${{ matrix.update }} | |
run: | | |
if [ "$(command -v rsync)" = "" ]; | |
then | |
if [ "$(command -v apt-get)" != "" ]; | |
then | |
apt-get update | |
UPDATE_COMMAND="apt-get install -yqq" | |
else | |
UPDATE_COMMAND="apk add" | |
fi | |
${UPDATE_COMMAND} \ | |
rsync \ | |
npm \ | |
jq \ | |
pipx \ | |
${{ matrix.extra }} | |
fi | |
- uses: actions/checkout@v4 | |
if: ${{ matrix.update }} | |
with: | |
repository: onfido/${{ matrix.git_repo_id }} | |
- uses: actions/download-artifact@v4 | |
if: ${{ matrix.update }} | |
with: | |
name: artifacts-${{ github.workflow }}-${{ github.run_id }}-${{ github.run_number }} | |
- name: Integrate generated code (${{ matrix.version }}) | |
if: ${{ matrix.update }} | |
env: | |
ONFIDO_OPENAPI_SPEC_FOLDER: . | |
run: | | |
chmod +x shell/sync-lib.sh | |
shell/sync-lib.sh $(echo ${{ matrix.git_repo_id }} | sed 's/^onfido-//') ${{ matrix.generator }} | |
- name: Update release file and lint .md files as needed | |
if: ${{ matrix.update }} | |
run: | | |
TMP_FILE=$(mktemp) | |
RELEASE_FILE=.release.json | |
if [ ! -f $RELEASE_FILE ] | |
then | |
echo "{}" > $RELEASE_FILE | |
fi | |
SOURCE_REPO_URL=https://github.com/${{ github.repository_owner }}/onfido-openapi-spec | |
SOURCE_SHORT_SHA=${{ needs.generate_specs_and_libraries.outputs.last_commit_short_sha }} | |
SOURCE_LONG_SHA=${{ needs.generate_specs_and_libraries.outputs.last_commit_long_sha }} | |
SOURCE_VERSION=${{ inputs.override-spec-version }} | |
SOURCE_VERSION=${SOURCE_VERSION:-${{ needs.generate_specs_and_libraries.outputs.last_commit_tag }}} | |
jq --arg source_repo_url "$SOURCE_REPO_URL" --arg source_short_sha "$SOURCE_SHORT_SHA" \ | |
--arg source_long_sha "$SOURCE_LONG_SHA" --arg source_version "$SOURCE_VERSION" \ | |
'. += {"source": {"repo_url": $source_repo_url, "short_sha": $source_short_sha, | |
"long_sha": $source_long_sha, "version": $source_version}, | |
"release": "v${{ matrix.version }}"}' $RELEASE_FILE >| $TMP_FILE | |
mv $TMP_FILE $RELEASE_FILE | |
npx prettier --write *.md | |
- name: Create Pull Request with changes after library update | |
uses: peter-evans/create-pull-request@v6 | |
if: ${{ matrix.update }} | |
with: | |
token: ${{ secrets.GH_ACTION_ACCESS_TOKEN }} | |
commit-message: Upgrade after onfido-openapi-spec change ${{ needs.generate_specs_and_libraries.outputs.last_commit_short_sha }} | |
title: Refresh ${{ matrix.git_repo_id }} after onfido-openapi-spec update (${{ needs.generate_specs_and_libraries.outputs.last_commit_short_sha }}) | |
body: | | |
Auto-generated PR with changes till commit ${{ github.repository_owner }}/onfido-openapi-spec@${{ needs.generate_specs_and_libraries.outputs.last_commit_long_sha }} (included) | |
Additional changes: | |
- None | |
labels: | | |
automated pr | |
branch: release-upgrade |