diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000000..491f6a7956 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,133 @@ +name: CI + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Use Node.js 18.x + uses: actions/setup-node@v3 + with: + node-version: 18.x + cache: 'yarn' + - name: Install dependencies + run: yarn --frozen-lockfile + - name: Build + run: yarn setup + - name: Zip artifacts + run: | + zip -r compressed-build \ + ./out/* \ + ./out-test/* \ + ./addons/xterm-addon-attach/out/* \ + ./addons/xterm-addon-attach/out-test/* \ + ./addons/xterm-addon-canvas/out/* \ + ./addons/xterm-addon-canvas/out-test/* \ + ./addons/xterm-addon-fit/out/* \ + ./addons/xterm-addon-fit/out-test/* \ + ./addons/xterm-addon-image/inwasm-builds/out/* \ + ./addons/xterm-addon-image/out/* \ + ./addons/xterm-addon-image/out-test/* \ + ./addons/xterm-addon-ligatures/out/* \ + ./addons/xterm-addon-ligatures/out-test/* \ + ./addons/xterm-addon-search/out/* \ + ./addons/xterm-addon-search/out-test/* \ + ./addons/xterm-addon-serialize/out/* \ + ./addons/xterm-addon-serialize/out-test/* \ + ./addons/xterm-addon-unicode11/out/* \ + ./addons/xterm-addon-unicode11/out-test/* \ + ./addons/xterm-addon-web-links/out/* \ + ./addons/xterm-addon-web-links/out-test/* \ + ./addons/xterm-addon-webgl/out/* \ + ./addons/xterm-addon-webgl/out-test/* + - name: Upload artifacts + uses: actions/upload-artifact@v3 + with: + name: build-artifacts + path: compressed-build.zip + if-no-files-found: error + + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Use Node.js 18.x + uses: actions/setup-node@v3 + with: + node-version: 18.x + cache: 'yarn' + - name: Install dependencies + run: yarn --frozen-lockfile + - name: Lint code + run: yarn lint + - name: Lint API + run: yarn lint-api + + unit-tests: + needs: build + strategy: + matrix: + node-version: [16.x, 18.x] + runs-on: [ubuntu-latest, macos-latest, windows-latest] + runs-on: ${{ matrix.runs-on }} + steps: + - uses: actions/checkout@v3 + - uses: actions/download-artifact@v3 + with: + name: build-artifacts + - name: Unzip artifacts (Linux, macOS) + if: runner.os != 'Windows' + run: unzip -o compressed-build.zip + - name: Unzip artifacts (Windows) + if: runner.os == 'Windows' + run: 7z x compressed-build.zip -aoa -o${{ github.workspace }} + - name: Print directory structure + run: ls -R + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + cache: 'yarn' + - name: Install dependencies + run: yarn --frozen-lockfile + - name: Unit tests + run: yarn test-unit --forbid-only + + integration-tests: + needs: build + strategy: + matrix: + node-version: [18.x] + runs-on: [ubuntu-latest, windows-latest] # macos-latest is flaky + browser: [chromium, firefox] + runs-on: ${{ matrix.runs-on }} + steps: + - uses: actions/checkout@v3 + - uses: actions/download-artifact@v3 + with: + name: build-artifacts + - name: Unzip artifacts (Linux, macOS) + if: runner.os != 'Windows' + run: unzip -o compressed-build.zip + - name: Unzip artifacts (Windows) + if: runner.os == 'Windows' + run: 7z x compressed-build.zip -aoa -o${{ github.workspace }} + - name: Print directory structure + run: ls -R + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + cache: 'yarn' + - name: Install dependencies + run: yarn --frozen-lockfile + - name: Install playwright + run: npx playwright install + - name: Integration tests (${{ matrix.browser }}) + run: yarn test-api-${{ matrix.browser }} --headless --forbid-only diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml deleted file mode 100644 index f8c8362a64..0000000000 --- a/.github/workflows/codeql-analysis.yml +++ /dev/null @@ -1,72 +0,0 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -# -# ******** NOTE ******** -# We have attempted to detect the languages in your repository. Please check -# the `language` matrix defined below to confirm you have the correct set of -# supported CodeQL languages. -# -name: "CodeQL" - -on: - push: - branches: [ "master" ] - pull_request: - # The branches below must be a subset of the branches above - branches: [ "master" ] - schedule: - - cron: '41 17 * * 0' - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - permissions: - actions: read - contents: read - security-events: write - - strategy: - fail-fast: false - matrix: - language: [ 'javascript' ] - # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] - # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support - - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v2 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - - # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs - # queries: security-extended,security-and-quality - - - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v2 - - # ℹī¸ Command-line programs to run using the OS shell. - # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun - - # If the Autobuild fails above, remove it and uncomment the following three lines. - # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. - - # - run: | - # echo "Run, Build Application using script" - # ./location_of_script_within_repo/buildscript.sh - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 0000000000..3ba91f7e95 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,35 @@ +name: "CodeQL" + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + schedule: + - cron: '41 17 * * 0' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'javascript' ] + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ matrix.language }} + - name: Autobuild + uses: github/codeql-action/autobuild@v2 + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000000..1e26e438f0 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,30 @@ +name: Release + +on: + push: + # If a commit reaches master, assume it has passed CI via PR and publish + # without running tests to save time to publish + branches: [ "master" ] + +jobs: + release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Use Node.js 18.x + uses: actions/setup-node@v3 + with: + node-version: 18.x + cache: 'yarn' + - name: Install dependencies + run: yarn --frozen-lockfile + - name: Build + run: yarn setup + - name: Package headless + run: | + yarn package-headless + node ./bin/package_headless.js + - name: Publish to npm + env: + NPM_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + run: node ./bin/publish.js diff --git a/azure-pipelines.yml b/azure-pipelines.yml deleted file mode 100644 index f96a0e8a78..0000000000 --- a/azure-pipelines.yml +++ /dev/null @@ -1,182 +0,0 @@ -pr: - branches: - include: ["main"] - -trigger: - branches: - include: ["main"] - -jobs: -- job: Linux - pool: - vmImage: 'ubuntu-20.04' - steps: - - task: NodeTool@0 - inputs: - versionSpec: '18.x' - displayName: 'Install Node.js' - - task: YarnInstaller@3 - inputs: - versionSpec: '1.x' - displayName: 'Install Yarn' - - task: CacheBeta@1 - inputs: - key: yarn2 | $(Agent.OS) | yarn.lock - path: node_modules - displayName: Cache node modules - - script: yarn --frozen-lockfile - displayName: 'Install dependencies and build' - - script: | - yarn test-unit-coverage --forbid-only - EXIT_CODE=$? - ./node_modules/.bin/nyc report --reporter=cobertura - exit $EXIT_CODE - displayName: 'Unit tests' - - script: yarn lint - displayName: 'Lint code' - - script: yarn lint-api - displayName: 'Lint API' - - task: PublishCodeCoverageResults@1 - inputs: - codeCoverageTool: Cobertura - summaryFileLocation: '$(System.DefaultWorkingDirectory)/**/*coverage.xml' - displayName: 'Publish coverage' - -- job: macOS - pool: - vmImage: 'macOS-11' - steps: - - task: NodeTool@0 - inputs: - versionSpec: '18.x' - displayName: 'Install Node.js' - - task: CacheBeta@1 - inputs: - key: yarn2 | $(Agent.OS) | yarn.lock - path: node_modules - displayName: Cache node modules - - script: yarn --frozen-lockfile - displayName: 'Install dependencies and build' - - script: yarn test-unit --forbid-only - displayName: 'Unit tests' - - script: yarn lint - displayName: 'Lint code' - - script: yarn lint-api - displayName: 'Lint API' - -- job: Windows - pool: - vmImage: 'windows-2019' - steps: - - task: NodeTool@0 - inputs: - versionSpec: '18.x' - displayName: 'Install Node.js' - - task: CacheBeta@1 - inputs: - key: yarn2 | $(Agent.OS) | yarn.lock - path: node_modules - displayName: Cache node modules - - script: yarn --frozen-lockfile - displayName: 'Install dependencies and build' - - script: yarn test-unit --forbid-only - displayName: 'Unit tests' - - script: yarn lint - displayName: 'Lint code' - - script: yarn lint-api - displayName: 'Lint API' - -- job: Linux_IntegrationTests - pool: - vmImage: 'ubuntu-20.04' - steps: - - script: | - # source: https://github.com/microsoft/playwright/issues/1041 - sudo apt update - sudo apt install libwoff1 libopus0 libwebp6 libwebpdemux2 libenchant1c2a libgudev-1.0-0 libsecret-1-0 libhyphen0 libgdk-pixbuf2.0-0 libegl1 libnotify4 libxslt1.1 libevent-2.1-6 libgles2 libgl1 libegl1 libvpx5 - # for chromium - sudo apt install libnss3 libxss1 libasound2 - # for firefox - sudo apt install libdbus-glib-1-2 libxt6 - displayName: Install required packages - - task: NodeTool@0 - inputs: - versionSpec: '18.x' - displayName: 'Install Node.js' - - task: YarnInstaller@3 - inputs: - versionSpec: '1.x' - displayName: 'Install Yarn' - - script: yarn --frozen-lockfile - displayName: 'Install dependencies and build' - - script: yarn test-api-chromium --headless --forbid-only - displayName: 'Integration tests (Chromium)' - - script: xvfb-run --auto-servernum -- bash -c "yarn test-api-firefox --headless --forbid-only" - displayName: 'Integration tests (Firefox)' - -# Integration tests are too flaky on macOS https://github.com/xtermjs/xterm.js/issues/3590 -# - job: macOS_IntegrationTests -# pool: -# vmImage: 'macOS-11' -# steps: -# - task: NodeTool@0 -# inputs: -# versionSpec: '18.x' -# displayName: 'Install Node.js' -# - script: yarn --frozen-lockfile -# displayName: 'Install dependencies and build' -# - script: yarn test-api-chromium --headless --forbid-only -# displayName: 'Integration tests (Chromium)' -# - script: yarn test-api-firefox --headless --forbid-only -# displayName: 'Integration tests (Firefox)' -# - script: yarn test-api-webkit --headless --forbid-only -# displayName: 'Integration tests (Webkit)' - -- job: Windows_IntegrationTests - pool: - vmImage: 'windows-2019' - steps: - - task: NodeTool@0 - inputs: - versionSpec: '18.x' - displayName: 'Install Node.js' - - script: yarn --frozen-lockfile - displayName: 'Install dependencies and build' - - script: yarn test-api-chromium --headless --forbid-only - displayName: 'Integration tests (Chromium)' - - script: yarn test-api-firefox --headless --forbid-only - displayName: 'Integration tests (Firefox)' - -- job: Release - dependsOn: - - Linux - - macOS - - Windows - - Linux_IntegrationTests - # - macOS_IntegrationTests - - Windows_IntegrationTests - condition: and(succeeded(), or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['FORCE_RELEASE'], 'true'))) - pool: - vmImage: 'ubuntu-20.04' - steps: - - task: NodeTool@0 - inputs: - versionSpec: '18.x' - displayName: 'Install Node.js' - - task: YarnInstaller@3 - inputs: - versionSpec: '1.x' - displayName: 'Install Yarn' - - task: CacheBeta@1 - inputs: - key: yarn2 | $(Agent.OS) | yarn.lock - path: node_modules - displayName: Cache node modules - - script: yarn --frozen-lockfile - displayName: 'Install dependencies and build' - - script: | - yarn package-headless - node ./bin/package_headless.js - displayName: 'Package xterm-headless' - - script: NPM_AUTH_TOKEN="$(NPM_AUTH_TOKEN)" node ./bin/publish.js - displayName: 'Package and publish to npm' diff --git a/bin/publish.js b/bin/publish.js index e65048dbdd..ec089e7bf1 100644 --- a/bin/publish.js +++ b/bin/publish.js @@ -67,25 +67,24 @@ function checkAndPublishPackage(packageDir) { const packageJsonFile = path.join(packageDir, 'package.json'); packageJson.version = nextVersion; console.log(`Set version of ${packageJsonFile} to ${nextVersion}`); - if (!isDryRun) { - fs.writeFileSync(packageJsonFile, JSON.stringify(packageJson, null, 2)); - } + fs.writeFileSync(packageJsonFile, JSON.stringify(packageJson, null, 2)); // Publish const args = ['publish']; if (!isStableRelease) { args.push('--tag', 'beta'); } + if (isDryRun) { + args.push('--dry-run'); + } console.log(`Spawn: npm ${args.join(' ')}`); - if (!isDryRun) { - const result = cp.spawnSync('npm', args, { - cwd: packageDir, - stdio: 'inherit' - }); - if (result.status) { - console.error(`Spawn exited with code ${result.status}`); - process.exit(result.status); - } + const result = cp.spawnSync('npm', args, { + cwd: packageDir, + stdio: 'inherit' + }); + if (result.status) { + console.error(`Spawn exited with code ${result.status}`); + process.exit(result.status); } console.groupEnd(); diff --git a/package.json b/package.json index 5fc4e55801..4fb383fda9 100644 --- a/package.json +++ b/package.json @@ -41,9 +41,8 @@ "test-unit-coverage": "node ./bin/test.js --coverage", "test-unit-dev": "cross-env NODE_PATH='./out' mocha", "build": "tsc -b ./tsconfig.all.json", - "prepare": "npm run setup", "setup": "npm run build", - "presetup": "node ./bin/install-addons.js", + "postinstall": "node ./bin/install-addons.js", "postsetup": "npm run inwasm", "prepublishOnly": "npm run package", "watch": "tsc -b -w ./tsconfig.all.json --preserveWatchOutput",