diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml new file mode 100644 index 0000000000..a89d04c203 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -0,0 +1,78 @@ +name: General issue +description: Report a general issue with Video.js +labels: "needs: triage" +body: + - type: markdown + attributes: + value: | + Thank you for using Video.js and contributing by opening an issue. Before you start, please check this list: + * If you are not reporting a bug, but want to ask a general question, use [discussions](https://github.com/videojs/video.js/discussions) instead. + * Check the [FAQ](https://videojs.com/guides/faqs) and [troubleshooting guides](https://videojs.com/guides/troubleshooting). + * If there is an existing open issue for exactly the same problem, comment there instead. + * However, be careful not to comment on old and closed issues. Your new comment is unlikely to be noticed. + * Take care to make sure it is really the exact same issue. Conflating tangentially related issues is counterproductive. If in doubt, open as a new issue. + * Add useful new information, such as a new reproducible case to help narrow down the issue. + * If the issue is with a specific plugin, it's generally better to open an issue on the plugin repository instead. + * Please do take the time to give detailed information, and include a test case. A detailed issue with actionable information will get a better response than a vague anecdote. + - type: textarea + id: description + attributes: + label: Description + description: | + Please give a detailed description of the issue. + What did you expect to happen, and what happened? + validations: + required: true + - type: input + id: testcase + validations: + required: true + attributes: + label: Reduced test case + description: | + Please add a URL to a [reduced test case](https://stackoverflow.com/help/minimal-reproducible-example) where the issue can be observed. We have a [starter template](https://codepen.io/gkatsev/pen/GwZegv?editors=1000#0) on Codepen. + **Without a test case** it's unlikely your issue can be actioned. + For a playback problem, including the stream URL is _essential._ + placeholder: https:// + - type: textarea + id: str + attributes: + label: Steps to reproduce + description: Detailed steps to reproduce the issue. + value: | + 1. + 2. + 3. + validations: + required: true + - type: textarea + id: errors + attributes: + label: Errors + description: If there is an error displayed in the player or in the console, please include them here. + - type: input + id: version + attributes: + label: What version of Video.js are you using? + description: Please include all relevant versions. If not using the latest version, explain why not in the description above. + placeholder: e.g. vX.Y.Z + validations: + required: true + - type: input + id: plugins + attributes: + label: Video.js plugins used. + - type: input + id: browser + attributes: + label: What browser(s) including version(s) does this occur with? + placeholder: e.g. Chrome 100 + validations: + required: true + - type: input + id: os + attributes: + label: What OS(es) and version(s) does this occur with? + placeholder: e.g. Windows 11 + validations: + required: true diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 758fe8b8a7..a513f9e14c 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -16,4 +16,6 @@ Please list the specific changes involved in this pull request. * [ ] Unit Tests updated or fixed * [ ] Docs/guides updated * [ ] Example created ([starter template on JSBin](https://codepen.io/gkatsev/pen/GwZegv?editors=1000#0)) + * [ ] Has no DOM changes which impact accessiblilty or trigger warnings (e.g. Chrome issues tab) + * [ ] Has no changes to JSDoc which cause `npm run docs:api` to error * [ ] Reviewed by Two Core Contributors diff --git a/.github/actions/pr-titles.js b/.github/actions/pr-titles.js new file mode 100644 index 0000000000..35b76047d1 --- /dev/null +++ b/.github/actions/pr-titles.js @@ -0,0 +1,13 @@ +const core = require('@actions/core'); +const github = require('@actions/github'); + +(async function run() { + const title = github.context.payload.pull_request?.title; + const titleRegex = /^(chore|ci|docs|feat|fix|refactor|revert|test)(\(.+\))?!?: (.+)/; + + if (!!title.match(titleRegex)) { + core.info('Pull request title is OK'); + } else { + core.setFailed('Please use conventional commit style for the PR title so the merged change appears in the changelog. See https://www.conventionalcommits.org/.'); + } +})(); diff --git a/.github/config.yml b/.github/config.yml index 6e298ec548..f01798c2c0 100644 --- a/.github/config.yml +++ b/.github/config.yml @@ -30,3 +30,5 @@ newPRWelcomeComment: | firstPRMergeComment: > Congrats on merging your first pull request! 🎉🎉🎉 +# Prevent issues being created without using the template +blank_issues_enabled: false diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index db100dfc1b..c61b30ecc5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,13 +5,13 @@ on: [push, pull_request] jobs: should-skip: continue-on-error: true - runs-on: ubuntu-18.04 + runs-on: ubuntu-latest # Map a step output to a job output outputs: should-skip-job: ${{steps.skip-check.outputs.should_skip}} steps: - id: skip-check - uses: fkirc/skip-duplicate-actions@v2.1.0 + uses: fkirc/skip-duplicate-actions@v5.3.1 with: github_token: ${{github.token}} @@ -21,47 +21,36 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-18.04] + os: [ubuntu-latest] + test-type: [unit, coverage] env: BROWSER_STACK_USERNAME: ${{secrets.BROWSER_STACK_USERNAME}} BROWSER_STACK_ACCESS_KEY: ${{secrets.BROWSER_STACK_ACCESS_KEY}} + CI_TEST_TYPE: ${{matrix.test-type}} runs-on: ${{matrix.os}} steps: - name: checkout code - uses: actions/checkout@v2 - - - name: Cache dependencies - uses: actions/cache@v2 - with: - path: | - ~/.npm - **/node_modules - key: ${{runner.os}}-npm-${{hashFiles('**/package-lock.json')}} - restore-keys: | - ${{runner.os}}-npm- - ${{runner.os}}- + uses: actions/checkout@v4 - name: read node version from .nvmrc - run: echo ::set-output name=NVMRC::$(cat .nvmrc) + run: echo "NVMRC=$(cat .nvmrc)" >> $GITHUB_OUTPUT shell: bash id: nvm - name: update apt cache on linux w/o browserstack run: sudo apt-get update - if: ${{startsWith(matrix.os, 'ubuntu') && !env.BROWSER_STACK_USERNAME}} - name: install ffmpeg/pulseaudio for firefox on linux w/o browserstack run: sudo apt-get install ffmpeg pulseaudio - if: ${{startsWith(matrix.os, 'ubuntu') && !env.BROWSER_STACK_USERNAME}} - name: start pulseaudio for firefox on linux w/o browserstack run: pulseaudio -D - if: ${{startsWith(matrix.os, 'ubuntu') && !env.BROWSER_STACK_USERNAME}} - name: setup node - uses: actions/setup-node@v1 + uses: actions/setup-node@v4 with: node-version: '${{steps.nvm.outputs.NVMRC}}' + cache: npm # turn off the default setup-node problem watchers... - run: echo "::remove-matcher owner=eslint-compact::" @@ -72,6 +61,12 @@ jobs: run: npm i --prefer-offline --no-audit - name: run npm test - uses: GabrielBB/xvfb-action@v1 + run: npm run test + + - name: coverage + uses: codecov/codecov-action@v4 with: - run: npm run test + token: ${{secrets.CODECOV_TOKEN}} + files: './test/dist/coverage/coverage-final.json' + fail_ci_if_error: true + if: ${{startsWith(env.CI_TEST_TYPE, 'coverage')}} diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml new file mode 100644 index 0000000000..bb58205146 --- /dev/null +++ b/.github/workflows/lock.yml @@ -0,0 +1,22 @@ +name: 'Lock Threads' + +on: + schedule: + - cron: '0 1 * * 1,4' + workflow_dispatch: + +permissions: + issues: write + +concurrency: + group: lock + +jobs: + action: + if: ${{ github.repository_owner == 'videojs' }} + runs-on: ubuntu-latest + steps: + - uses: dessant/lock-threads@v4 + with: + issue-inactive-days: '60' + process-only: 'issues' diff --git a/.github/workflows/pr-titles.yml b/.github/workflows/pr-titles.yml new file mode 100644 index 0000000000..6ec3a61f6b --- /dev/null +++ b/.github/workflows/pr-titles.yml @@ -0,0 +1,22 @@ +name: PR title check + +on: + pull_request: + types: [opened, reopened, edited, synchronize] + branches: [main] + +concurrency: + group: ${{ github.workflow }}-${{ github.event.number }} + cancel-in-progress: true + +jobs: + pr-title-lint: + name: Should follow conventional commit spec + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '20' + - run: npm i @actions/core @actions/github + - run: node .github/actions/pr-titles.js diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000000..70d4f2a991 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,93 @@ +name: release +on: + push: + tags: + # match semver versions + - "v[0-9]+.[0-9]+.[0-9]+" + # match semver pre-releases + - "v[0-9]+.[0-9]+.[0-9]+-*" +jobs: + release: + env: + NETLIFY_BASE: 'videojs-preview.netlify.app' + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + # We need to fetch the entire history as conventional-changelog needs + # access to any number of git commits to build the changelog. + with: + fetch-depth: 0 + + - name: read node version from .nvmrc + run: echo "NVMRC=$(cat .nvmrc)" >> $GITHUB_OUTPUT + shell: bash + id: nvm + + - name: setup node + uses: actions/setup-node@v3 + with: + node-version: '${{steps.nvm.outputs.NVMRC}}' + cache: npm + # this line is required for the setup-node action to be able to run the npm publish below. + registry-url: 'https://registry.npmjs.org' + + - name: npm install + run: npm i --prefer-offline --no-audit + + # publish runs build for us via a prepublishOnly script + - name: npm release + run: npm publish --tag next + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + + - name: get current changelog + run: node -e "console.log(require('./build/current-changelog.js')())" > CHANGELOG-LATEST.md + + - name: get dashed package version for netlify + run: echo "VERSION=$(node -e "process.stdout.write(require('./package.json').version.split('.').join('-'))")" >> $GITHUB_OUTPUT + id: get-version + shell: bash + if: env.NETLIFY_BASE != '' + + - name: add netlify preview to release notes + run: | + echo "" >> CHANGELOG-LATEST.md + echo "[netlify preview for this version](https://v${{steps.get-version.outputs.VERSION}}--${{env.NETLIFY_BASE}})" >> CHANGELOG-LATEST.md + if: env.NETLIFY_BASE != '' + + - name: Create Github release + uses: softprops/action-gh-release@v1 + with: + body_path: CHANGELOG-LATEST.md + token: ${{github.token}} + prerelease: true + files: dist/*.zip + discussion_category_name: Releases + + deploy: + needs: release + runs-on: ubuntu-latest + environment: Deploy + env: + VJS_VERSION: ${{ github.event.head_commit.message }} + S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} + S3_ACCESS: ${{ secrets.AWS_S3_ACCESS }} + S3_KEY: ${{ secrets.AWS_S3_KEY }} + steps: + - name: setup node + uses: actions/setup-node@v3 + + - name: npm install video.js + run: npm install "video.js@$VJS_VERSION" + + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v2 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_S3_SECRET }} + aws-region: us-east-1 + + - name: Copy files to the CDN with the AWS CLI + run: | + aws s3 cp node_modules/video.js/dist s3://${S3_BUCKET}/${S3_KEY}/${VJS_VERSION}/ --acl ${S3_ACCESS} --recursive