diff --git a/.github/workflows/reusable-ci.yml b/.github/workflows/reusable-ci.yml new file mode 100644 index 000000000000..7c25f5c71d55 --- /dev/null +++ b/.github/workflows/reusable-ci.yml @@ -0,0 +1,91 @@ +name: Reusable Complete CI Workflow + +on: + workflow_call: + inputs: + target-branch: + description: 'Branch to checkout and test (defaults to the calling branch)' + required: false + type: string + default: '' + node-versions: + description: 'JSON array of Node.js versions to test against' + required: false + type: string + default: '["16", "18"]' + platforms: + description: 'JSON array of platforms to run tests on' + required: false + type: string + default: '["ubuntu-latest"]' + test-script: + description: 'Test script to execute' + required: false + type: string + default: './run-tests.sh' + examples-script: + description: 'Examples script to execute' + required: false + type: string + default: './check-examples.sh' + node-version: + description: 'Node.js version to use' + required: false + type: string + default: '16' + + secrets: + PIPELINE_GITHUB_APP_ID: + required: false + PIPELINE_GITHUB_APP_PRIVATE_KEY: + required: false + # Integration test secrets + DD_API_KEY: + required: false + DD_CLIENT_API_KEY: + required: false + DD_CLIENT_APP_KEY: + required: false + SLEEP_AFTER_REQUEST: + required: false + +jobs: + pre-commit: + uses: ./.github/workflows/reusable-pre-commit.yml + with: + target-branch: ${{ inputs.target-branch }} + enable-commit-changes: false # Don't auto-commit in external CI + secrets: + PIPELINE_GITHUB_APP_ID: ${{ secrets.PIPELINE_GITHUB_APP_ID }} + PIPELINE_GITHUB_APP_PRIVATE_KEY: ${{ secrets.PIPELINE_GITHUB_APP_PRIVATE_KEY }} + + test: + uses: ./.github/workflows/reusable-typescript-test.yml + with: + target-branch: ${{ inputs.target-branch }} + node-versions: ${{ inputs.node-versions }} + platforms: ${{ inputs.platforms }} + test-script: ${{ inputs.test-script }} + secrets: + PIPELINE_GITHUB_APP_ID: ${{ secrets.PIPELINE_GITHUB_APP_ID }} + PIPELINE_GITHUB_APP_PRIVATE_KEY: ${{ secrets.PIPELINE_GITHUB_APP_PRIVATE_KEY }} + + examples: + uses: ./.github/workflows/reusable-examples.yml + with: + target-branch: ${{ inputs.target-branch }} + examples-script: ${{ inputs.examples-script }} + node-version: ${{ inputs.node-version }} + + integration: + uses: ./.github/workflows/reusable-integration-test.yml + with: + target-branch: ${{ inputs.target-branch }} + secrets: + PIPELINE_GITHUB_APP_ID: ${{ secrets.PIPELINE_GITHUB_APP_ID }} + PIPELINE_GITHUB_APP_PRIVATE_KEY: ${{ secrets.PIPELINE_GITHUB_APP_PRIVATE_KEY }} + DD_API_KEY: ${{ secrets.DD_API_KEY }} + DD_CLIENT_API_KEY: ${{ secrets.DD_CLIENT_API_KEY }} + DD_CLIENT_APP_KEY: ${{ secrets.DD_CLIENT_APP_KEY }} + SLEEP_AFTER_REQUEST: ${{ secrets.SLEEP_AFTER_REQUEST }} + diff --git a/.github/workflows/reusable-examples.yml b/.github/workflows/reusable-examples.yml new file mode 100644 index 000000000000..7730e9d7945c --- /dev/null +++ b/.github/workflows/reusable-examples.yml @@ -0,0 +1,43 @@ +name: Reusable Examples Workflow + +on: + workflow_call: + inputs: + target-branch: + description: 'Branch to checkout and test (defaults to the calling branch)' + required: false + type: string + default: '' + examples-script: + description: 'Examples script to execute' + required: false + type: string + default: './check-examples.sh' + node-version: + description: 'Node.js version to use for examples' + required: false + type: string + default: '16' + secrets: + PIPELINE_GITHUB_APP_ID: + required: false + PIPELINE_GITHUB_APP_PRIVATE_KEY: + required: false + +jobs: + examples: + runs-on: ubuntu-latest + if: (github.event.pull_request.draft == false && !contains(github.event.pull_request.labels.*.name, 'ci/skip') && !contains(github.event.pull_request.head.ref, 'datadog-api-spec/test/')) || github.event_name == 'schedule' + steps: + - uses: actions/checkout@v3 + with: + repository: DataDog/datadog-api-client-typescript + ref: ${{ inputs.target-branch || github.ref }} + - name: Set up Node ${{ inputs.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ inputs.node-version }} + cache: 'yarn' + - name: Check examples + run: ${{ inputs.examples-script }} + shell: bash \ No newline at end of file diff --git a/.github/workflows/test_integration.yml b/.github/workflows/reusable-integration-test.yml similarity index 58% rename from .github/workflows/test_integration.yml rename to .github/workflows/reusable-integration-test.yml index f5601193de4d..c07c551ccd05 100644 --- a/.github/workflows/test_integration.yml +++ b/.github/workflows/reusable-integration-test.yml @@ -1,4 +1,4 @@ -name: Run Integration Tests +name: Reusable Integration Test Workflow permissions: contents: read @@ -16,6 +16,41 @@ on: - master schedule: - cron: "0 4 * * *" + workflow_call: + inputs: + target-branch: + description: 'Branch to checkout and test (defaults to the calling branch)' + required: false + type: string + default: '' + enable-status-reporting: + description: 'Whether to post status checks to datadog-api-spec repo' + required: false + type: boolean + default: false + status-context: + description: 'Context for status checks' + required: false + type: string + default: 'integration' + target-repo: + description: 'Repository to post status to' + required: false + type: string + default: 'datadog-api-spec' + secrets: + PIPELINE_GITHUB_APP_ID: + required: false + PIPELINE_GITHUB_APP_PRIVATE_KEY: + required: false + DD_API_KEY: + required: true + DD_CLIENT_API_KEY: + required: true + DD_CLIENT_APP_KEY: + required: true + SLEEP_AFTER_REQUEST: + required: false concurrency: group: integration-${{ github.head_ref }} @@ -48,17 +83,20 @@ jobs: with: app-id: ${{ secrets.PIPELINE_GITHUB_APP_ID }} private-key: ${{ secrets.PIPELINE_GITHUB_APP_PRIVATE_KEY }} - repositories: datadog-api-spec + repositories: ${{ inputs.target-repo || 'datadog-api-spec' }} - name: Checkout code uses: actions/checkout@v3 + with: + repository: DataDog/datadog-api-client-typescript + ref: ${{ inputs.target-branch || github.ref }} - name: Post pending status check - if: github.event_name == 'pull_request' && contains(github.event.pull_request.head.ref, 'datadog-api-spec/generated/') + if: github.event_name == 'pull_request' && contains(github.event.pull_request.head.ref, 'datadog-api-spec/generated/') && (inputs.enable-status-reporting || github.event_name != 'workflow_call') uses: DataDog/github-actions/post-status-check@v2 with: github-token: ${{ steps.get_token.outputs.token }} - repo: datadog-api-spec + repo: ${{ inputs.target-repo || 'datadog-api-spec' }} status: pending - context: integration + context: ${{ inputs.status-context || 'integration' }} - name: Set up Node 16 uses: actions/setup-node@v3 with: @@ -77,20 +115,20 @@ jobs: DD_TEST_CLIENT_API_KEY: ${{ secrets.DD_CLIENT_API_KEY }} DD_TEST_CLIENT_APP_KEY: ${{ secrets.DD_CLIENT_APP_KEY }} RECORD: "none" - SLEEP_AFTER_REQUEST: "${{ vars.SLEEP_AFTER_REQUEST }}" + SLEEP_AFTER_REQUEST: ${{ secrets.SLEEP_AFTER_REQUEST || vars.SLEEP_AFTER_REQUEST }} - name: Post failure status check - if: failure() && github.event_name == 'pull_request' && contains(github.event.pull_request.head.ref, 'datadog-api-spec/generated/') + if: failure() && github.event_name == 'pull_request' && contains(github.event.pull_request.head.ref, 'datadog-api-spec/generated/') && (inputs.enable-status-reporting || github.event_name != 'workflow_call') uses: DataDog/github-actions/post-status-check@v2 with: github-token: ${{ steps.get_token.outputs.token }} - repo: datadog-api-spec + repo: ${{ inputs.target-repo || 'datadog-api-spec' }} status: failure - context: integration + context: ${{ inputs.status-context || 'integration' }} - name: Post success status check - if: "!failure() && github.event_name == 'pull_request' && contains(github.event.pull_request.head.ref, 'datadog-api-spec/generated/')" + if: "!failure() && github.event_name == 'pull_request' && contains(github.event.pull_request.head.ref, 'datadog-api-spec/generated/') && (inputs.enable-status-reporting || github.event_name != 'workflow_call')" uses: DataDog/github-actions/post-status-check@v2 with: github-token: ${{ steps.get_token.outputs.token }} - repo: datadog-api-spec + repo: ${{ inputs.target-repo || 'datadog-api-spec' }} status: success - context: integration + context: ${{ inputs.status-context || 'integration' }} diff --git a/.github/workflows/reusable-pre-commit.yml b/.github/workflows/reusable-pre-commit.yml new file mode 100644 index 000000000000..42368bef9a28 --- /dev/null +++ b/.github/workflows/reusable-pre-commit.yml @@ -0,0 +1,86 @@ +name: Reusable Pre-commit Workflow + +on: + workflow_call: + inputs: + target-branch: + description: 'Branch to checkout and test (defaults to the calling branch)' + required: false + type: string + default: '' + enable-commit-changes: + description: 'Whether to commit and push pre-commit fixes' + required: false + type: boolean + default: true + secrets: + PIPELINE_GITHUB_APP_ID: + required: false + PIPELINE_GITHUB_APP_PRIVATE_KEY: + required: false + +jobs: + pre-commit: + runs-on: ubuntu-latest + if: > + (github.event.pull_request.draft == false && + !contains(github.event.pull_request.labels.*.name, 'ci/skip') && + !contains(github.event.pull_request.head.ref, 'datadog-api-spec/test/')) || + github.event_name == 'schedule' + steps: + - name: Get GitHub App token + if: inputs.enable-commit-changes && github.event.pull_request.head.repo.full_name == github.repository + id: get_token + uses: actions/create-github-app-token@v1 + with: + app-id: ${{ secrets.PIPELINE_GITHUB_APP_ID }} + private-key: ${{ secrets.PIPELINE_GITHUB_APP_PRIVATE_KEY }} + - uses: actions/checkout@v3 + if: github.event.pull_request.head.repo.full_name == github.repository + with: + fetch-depth: 0 + repository: DataDog/datadog-api-client-typescript + ref: ${{ inputs.target-branch || github.event.pull_request.head.sha || github.ref }} + token: ${{ inputs.enable-commit-changes && steps.get_token.outputs.token || github.token }} + - uses: actions/checkout@v3 + if: github.event.pull_request.head.repo.full_name != github.repository + with: + repository: DataDog/datadog-api-client-typescript + ref: ${{ inputs.target-branch || github.ref }} + - uses: actions/setup-python@v4 + with: + python-version: '3.11' + - name: Install pre-commit + run: python -m pip install pre-commit + - name: set PY + run: echo "PY=$(python -c 'import hashlib, sys, platform;print(hashlib.sha256(platform.python_version().encode()+sys.executable.encode()).hexdigest())')" >> $GITHUB_ENV + - uses: actions/cache@v3 + with: + path: ~/.cache/pre-commit + key: pre-commit|${{ env.PY }}|${{ hashFiles('.pre-commit-config.yaml') }} + - id: pre_commit + name: Run pre-commit + if: github.event.action != 'closed' && github.event.pull_request.merged != true + run: | + pre-commit run --from-ref "${FROM_REF}" --to-ref "${TO_REF}" --show-diff-on-failure --color=always + env: + FROM_REF: ${{ github.event.pull_request.base.sha }} + TO_REF: ${{ github.event.pull_request.head.sha }} + - name: Commit changes + if: failure() && inputs.enable-commit-changes && github.event.pull_request.head.repo.full_name == github.repository + run: |- + git add -A + git config user.name "${GIT_AUTHOR_NAME}" + git config user.email "${GIT_AUTHOR_EMAIL}" + git commit -m "pre-commit fixes" + git push origin "HEAD:${HEAD_REF}" + exit 1 + env: + HEAD_REF: ${{ github.event.pull_request.head.ref }} + GIT_AUTHOR_EMAIL: "packages@datadoghq.com" + GIT_AUTHOR_NAME: "ci.datadog-api-spec" + - id: pre_commit_schedule + name: Run pre-commit in schedule + if: github.event_name == 'schedule' + run: | + pre-commit run --all-files --show-diff-on-failure --color=always \ No newline at end of file diff --git a/.github/workflows/reusable-typescript-test.yml b/.github/workflows/reusable-typescript-test.yml new file mode 100644 index 000000000000..ee77c7f5ee03 --- /dev/null +++ b/.github/workflows/reusable-typescript-test.yml @@ -0,0 +1,52 @@ +name: Reusable TypeScript Testing Workflow + +on: + workflow_call: + inputs: + target-branch: + description: 'Branch to checkout and test (defaults to the calling branch)' + required: false + type: string + default: '' + node-versions: + description: 'JSON array of Node.js versions to test against' + required: false + type: string + default: '["16", "18"]' + platforms: + description: 'JSON array of platforms to run tests on' + required: false + type: string + default: '["ubuntu-latest"]' + test-script: + description: 'Test script to execute' + required: false + type: string + default: './run-tests.sh' + secrets: + PIPELINE_GITHUB_APP_ID: + required: false + PIPELINE_GITHUB_APP_PRIVATE_KEY: + required: false + +jobs: + test: + strategy: + matrix: + node-version: ${{ fromJSON(inputs.node-versions) }} + platform: ${{ fromJSON(inputs.platforms) }} + runs-on: ${{ matrix.platform }} + if: (github.event.pull_request.draft == false && !contains(github.event.pull_request.labels.*.name, 'ci/skip') && !contains(github.event.pull_request.head.ref, 'datadog-api-spec/test/')) || github.event_name == 'schedule' + steps: + - uses: actions/checkout@v3 + with: + repository: DataDog/datadog-api-client-typescript + ref: ${{ inputs.target-branch || github.ref }} + - name: Set up Node ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + cache: 'yarn' + - name: Test + run: ${{ inputs.test-script }} + shell: bash \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a0a79553f05f..63bc61da7188 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,100 +20,43 @@ concurrency: jobs: pre-commit: - runs-on: ubuntu-latest if: > (github.event.pull_request.draft == false && !contains(github.event.pull_request.labels.*.name, 'ci/skip') && !contains(github.event.pull_request.head.ref, 'datadog-api-spec/test/')) || github.event_name == 'schedule' - steps: - # Run only in this repository - - name: Get GitHub App token - id: get_token - if: github.event.pull_request.head.repo.full_name == github.repository - uses: actions/create-github-app-token@v1 - with: - app-id: ${{ secrets.PIPELINE_GITHUB_APP_ID }} - private-key: ${{ secrets.PIPELINE_GITHUB_APP_PRIVATE_KEY }} - - uses: actions/checkout@v3 - if: github.event.pull_request.head.repo.full_name == github.repository - with: - fetch-depth: 0 - ref: ${{ github.event.pull_request.head.sha }} - token: ${{ steps.get_token.outputs.token }} - - uses: actions/setup-python@v4 - with: - python-version: '3.11' - # Fetch a fork of the repo - - uses: actions/checkout@v3 - if: github.event.pull_request.head.repo.full_name != github.repository - with: - fetch-depth: 0 - ref: ${{ github.event.pull_request.head.sha }} - - name: Install pre-commit - run: python -m pip install pre-commit - - name: set PY - run: echo "PY=$(python -c 'import hashlib, sys, platform;print(hashlib.sha256(platform.python_version().encode()+sys.executable.encode()).hexdigest())')" >> $GITHUB_ENV - - uses: actions/cache@v3 - with: - path: ~/.cache/pre-commit - key: pre-commit|${{ env.PY }}|${{ hashFiles('.pre-commit-config.yaml') }} - - id: pre_commit - name: Run pre-commit - if: github.event.action != 'closed' && github.event.pull_request.merged != true - run: | - pre-commit run --from-ref "${FROM_REF}" --to-ref "${TO_REF}" --show-diff-on-failure --color=always - env: - FROM_REF: ${{ github.event.pull_request.base.sha }} - TO_REF: ${{ github.event.pull_request.head.sha }} - - name: Commit changes - if: github.event.pull_request.head.repo.full_name == github.repository && failure() - run: |- - git add -A - git config user.name "${GIT_AUTHOR_NAME}" - git config user.email "${GIT_AUTHOR_EMAIL}" - git commit -m "pre-commit fixes" - git push origin "HEAD:${HEAD_REF}" - exit 1 - env: - HEAD_REF: ${{ github.event.pull_request.head.ref }} - - id: pre_commit_schedule - name: Run pre-commit in schedule - if: github.event_name == 'schedule' - run: | - pre-commit run --all-files --show-diff-on-failure --color=always + uses: ./.github/workflows/reusable-pre-commit.yml + with: + enable-commit-changes: true + secrets: + PIPELINE_GITHUB_APP_ID: ${{ secrets.PIPELINE_GITHUB_APP_ID }} + PIPELINE_GITHUB_APP_PRIVATE_KEY: ${{ secrets.PIPELINE_GITHUB_APP_PRIVATE_KEY }} test: - strategy: - matrix: - node-version: ["16", "18"] - platform: [ubuntu-latest] - runs-on: ${{ matrix.platform }} - if: (github.event.pull_request.draft == false && !contains(github.event.pull_request.labels.*.name, 'ci/skip') && !contains(github.event.pull_request.head.ref, 'datadog-api-spec/test/')) || github.event_name == 'schedule' - steps: - - uses: actions/checkout@v3 - - name: Set up Node ${{ matrix.node-version }} - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }} - cache: 'yarn' - - name: Test - run: ./run-tests.sh - shell: bash + if: > + (github.event.pull_request.draft == false && + !contains(github.event.pull_request.labels.*.name, 'ci/skip') && + !contains(github.event.pull_request.head.ref, 'datadog-api-spec/test/')) || + github.event_name == 'schedule' + uses: ./.github/workflows/reusable-typescript-test.yml + with: + node-versions: '["16", "18"]' + platforms: '["ubuntu-latest"]' + test-script: './run-tests.sh' + secrets: + PIPELINE_GITHUB_APP_ID: ${{ secrets.PIPELINE_GITHUB_APP_ID }} + PIPELINE_GITHUB_APP_PRIVATE_KEY: ${{ secrets.PIPELINE_GITHUB_APP_PRIVATE_KEY }} examples: - runs-on: ubuntu-latest - if: (github.event.pull_request.draft == false && !contains(github.event.pull_request.labels.*.name, 'ci/skip') && !contains(github.event.pull_request.head.ref, 'datadog-api-spec/test/')) || github.event_name == 'schedule' - steps: - - uses: actions/checkout@v3 - - name: Set up Node 16 - uses: actions/setup-node@v3 - with: - node-version: 16 - cache: 'yarn' - - name: Check examples - run: ./check-examples.sh - shell: bash + if: > + (github.event.pull_request.draft == false && + !contains(github.event.pull_request.labels.*.name, 'ci/skip') && + !contains(github.event.pull_request.head.ref, 'datadog-api-spec/test/')) || + github.event_name == 'schedule' + uses: ./.github/workflows/reusable-examples.yml + with: + examples-script: './check-examples.sh' + node-version: '16' report: runs-on: ubuntu-latest