Skip to content

build

build #16397

Workflow file for this run

name: build
on:
pull_request: ~
push:
branches: ['v3-main']
tags: ['v*']
paths-ignore:
- 'docs/**'
schedule:
- cron: '0 1 * * *'
workflow_dispatch:
inputs:
canary-release:
description: 'Release canary version (skips tests and checks)'
type: boolean
required: false
default: false
jobs:
tests:
if: inputs.canary-release == false
runs-on: ubuntu-latest
timeout-minutes: 15
strategy:
fail-fast: false
matrix:
node-version: [18, 20, 22]
steps:
- uses: actions/checkout@v4
- run: git fetch --depth=1
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: 'yarn'
- run: yarn install --frozen-lockfile --ignore-engines
- run: yarn test:unit
env:
SANDBOX_TOKEN: ${{ secrets.API_HUB_SANDBOX_TOKEN }}
- run: yarn test:integration
- run: yarn test:self
- run: yarn test:build-packages
- run: yarn test:type
- if: ${{ github.event_name != 'pull_request' && (failure() || cancelled()) }}
name: Slack Notify
uses: rtCamp/[email protected]
env:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
SLACK_USERNAME: SDK Pipeline Bot
SLACK_TITLE: Build tests ${{ job.status }} (${{ matrix.version }})
SLACK_MESSAGE: 'Test failed'
MSG_MINIMAL: event,actions url
SLACK_COLOR: ${{ job.status }}
SLACK_MSG_AUTHOR: ' '
SLACK_ICON: https://sap.github.io/cloud-sdk/img/logo.png
checks:
if: inputs.canary-release == false
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: git fetch --depth=1
- uses: actions/setup-node@v4
with:
node-version: 22
cache: 'yarn'
- name: REUSE Compliance Check
uses: fsfe/reuse-action@v5
- run: yarn install --frozen-lockfile --ignore-engines
- run: yarn lint
name: Static Code Check
- run: yarn check:test-service
name: Test Service Version Check
- run: yarn check:dependencies
name: Undeclared dependency Check
- uses: ./.github/actions/check-public-api
with:
force_internal_exports: 'true'
excluded_packages: 'eslint-config, util, test-util'
name: Check public api
- run: yarn test:self
name: Self tests for tools
- run: yarn check:circular
name: Circular dependency Check
- run: yarn doc
name: API Doc Check
- uses: ./.github/actions/check-license
name: License Check
- if: ${{ github.event_name != 'pull_request' && (failure() || cancelled()) }}
name: Slack Notify
uses: rtCamp/[email protected]
env:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
SLACK_USERNAME: SDK Pipeline Bot
SLACK_TITLE: Build checks ${{ job.status }} (${{ matrix.version }})
SLACK_MESSAGE: 'Test failed'
MSG_MINIMAL: event,actions url
SLACK_COLOR: ${{ job.status }}
SLACK_MSG_AUTHOR: ' '
SLACK_ICON: https://sap.github.io/cloud-sdk/img/logo.png
e2e-tests:
if: inputs.canary-release == false
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: git fetch --depth=1
- uses: actions/setup-node@v4
with:
node-version: 22
cache: 'yarn'
- run: yarn install --frozen-lockfile --ignore-engines
- run: yarn test:e2e
dependabot:
runs-on: ubuntu-latest
if: ${{ github.actor == 'dependabot[bot]' && github.event_name == 'pull_request' }}
needs: [tests, checks, e2e-tests]
permissions:
pull-requests: write
contents: write
steps:
- name: Dependabot metadata
id: metadata
uses: dependabot/[email protected]
with:
github-token: '${{ secrets.GITHUB_TOKEN }}'
- name: Approve a PR
run: gh pr review --approve "$PR_URL"
env:
PR_URL: ${{github.event.pull_request.html_url}}
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
- name: Enable auto-merge for Dependabot PRs
run: gh pr merge --auto --squash "$PR_URL"
env:
PR_URL: ${{github.event.pull_request.html_url}}
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
canary-release-pre-check:
if: github.event_name == 'schedule'
runs-on: ubuntu-latest
outputs:
skip-release: ${{ steps.date-check.outputs.skip-release }}
needs: [tests, checks, e2e-tests]
steps:
- uses: actions/checkout@v4
- run: git fetch --depth=1
- id: date-check
name: Check if latest commit is within 24 hrs
run: |
lastCommitDate=$(git --no-pager log -n 1 ${{ github.ref_name }} --pretty=format:"%at")
curDate=$(date +%s)
dateDiff=$(expr $curDate - $lastCommitDate)
echo $lastCommitDate, $curDate, $dateDiff
if [[ $dateDiff -gt 86400 ]]
then
echo 'No new commit found on ${{ github.ref }} within the last 24 hrs.'
echo "skip-release=true" >> $GITHUB_OUTPUT
else
echo "skip-release=false" >> $GITHUB_OUTPUT
fi
canary-release:
# execute canary release if:
# either the canary-release was scheduled and the canary-pre-check step resulted in skip-release=false
# or the canary-release input is true
if: always() && (needs.canary-release-pre-check.outputs.skip-release == 'false' || inputs.canary-release == true)
runs-on: ubuntu-latest
needs: [canary-release-pre-check]
steps:
- uses: actions/checkout@v4
- run: git fetch --depth=1
- uses: actions/setup-node@v4
with:
node-version: 22
cache: 'yarn'
registry-url: 'https://registry.npmjs.org'
- run: yarn install --frozen-lockfile --ignore-engines
- name: Canary Release
run: |
date=`date +%Y%m%d%H%M%S`
rm -f .changeset/*.md
cp canary-release-changeset.md .changeset
yarn changeset pre enter ${date}
yarn changeset version
yarn changeset pre exit
yarn changeset publish --tag canary
env:
NODE_AUTH_TOKEN: ${{ secrets.NPMJS_ACCESS_TOKEN }}
draft-github-release:
if: startsWith(github.ref, 'refs/tags/v')
runs-on: ubuntu-latest
needs: [tests, checks]
steps:
- uses: actions/checkout@v4
- run: git fetch --depth=1
- uses: actions/setup-node@v4
with:
node-version: 22
cache: 'yarn'
- run: yarn install --frozen-lockfile --ignore-engines
- uses: ./.github/actions/get-changelog
name: Get Changelog
id: get-changelog
- uses: actions/create-release@latest
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.ref }}
release_name: ${{ github.ref }}
draft: true
body: ${{ steps.get-changelog.outputs.changelog }}