fix: only add existing directories to PATH on windows #262
Workflow file for this run
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: CI/CD | |
on: | |
push: | |
branches: ['main'] | |
pull_request: | |
branches: ['main'] | |
schedule: | |
- cron: '0 0 * * *' | |
workflow_dispatch: | |
inputs: | |
release: | |
description: Create release? | |
required: false | |
type: boolean | |
version: | |
description: New version to release | |
required: false | |
type: string | |
jobs: | |
dependabot: | |
name: Check dependabot PR raised updating swiftorg | |
if: github.event_name == 'pull_request' && github.event.sender.login == 'dependabot[bot]' | |
runs-on: ubuntu-latest | |
concurrency: | |
group: dependabot-${{ github.ref }} | |
cancel-in-progress: true | |
permissions: | |
contents: write | |
pull-requests: write | |
outputs: | |
ci: ${{ !contains(steps.metadata.outputs.dependency-names, 'swiftorg') }} | |
merge: ${{ steps.update-swiftorg.outputs.result == 'true' }} | |
approve: ${{ steps.auto-approve.outputs.result == 'true' }} | |
steps: | |
- name: Dependabot metadata | |
id: metadata | |
uses: dependabot/fetch-metadata@v1 | |
with: | |
github-token: ${{ secrets.COMMIT_TOKEN }} | |
- name: Checkout repository | |
if: contains(steps.metadata.outputs.dependency-names, 'swiftorg') | |
uses: actions/checkout@v3 | |
with: | |
fetch-depth: 0 | |
submodules: true | |
ref: ${{ github.event.pull_request.head.ref }} | |
token: ${{ secrets.COMMIT_TOKEN }} | |
- name: Import GPG | |
if: contains(steps.metadata.outputs.dependency-names, 'swiftorg') | |
uses: crazy-max/ghaction-import-gpg@v5.3.0 | |
with: | |
gpg_private_key: ${{ secrets.COMMIT_SIGN_KEY }} | |
passphrase: ${{ secrets.COMMIT_SIGN_KEY_PASSPHRASE }} | |
git_user_signingkey: true | |
git_commit_gpgsign: true | |
git_tag_gpgsign: true | |
git_push_gpgsign: if-asked | |
- name: Changed Files | |
if: contains(steps.metadata.outputs.dependency-names, 'swiftorg') | |
id: changed-submodule-files | |
uses: tj-actions/changed-files@v38.2.0 | |
with: | |
fetch_additional_submodule_history: true | |
files: | | |
swiftorg/download/index.md | |
swiftorg/download/_older-releases.md | |
swiftorg/_data/builds/**/* | |
- name: Setup Node.js | |
if: steps.changed-submodule-files.outputs.any_changed == 'true' | |
id: setup-node | |
uses: actions/setup-node@v3 | |
with: | |
cache: npm | |
- name: Cache dependencies | |
if: steps.changed-submodule-files.outputs.any_changed == 'true' | |
id: cache-node | |
uses: actions/cache@v3.3.1 | |
with: | |
key: node-${{ github.ref }} | |
path: node_modules | |
- name: Setup npm pacakges | |
if: steps.changed-submodule-files.outputs.any_changed == 'true' | |
run: npm install | |
- name: Update submodule ref in package.json | |
if: steps.changed-submodule-files.outputs.any_changed == 'true' | |
id: update-swiftorg | |
uses: actions/github-script@v6 | |
with: | |
github-token: ${{ secrets.COMMIT_TOKEN }} | |
script: | | |
const hook = require('.github/changelog/pre_commit_hook.js'); | |
await hook.preCommit(); | |
await exec.exec('git', ['commit', '--all', '-S', '--message', `[skip dependabot] wip: update package.json`]); | |
await exec.exec('git', ['push', '--signed=if-asked']); | |
return true; | |
- name: Check if auto-approval needed | |
if: steps.changed-submodule-files.outputs.any_changed == 'true' | |
id: auto-approve | |
uses: actions/github-script@v6 | |
with: | |
script: | | |
const changedFiles = '${{ steps.changed-submodule-files.outputs.all_changed_and_modified_files }}'.split(' '); | |
return changedFiles.some(file => /swiftorg\/_data\/builds\/(swift-.*-release.*|swift_releases\.yml)/.exec(file)); | |
- name: Close PR for unnecessary swiftorg changes | |
if: contains(steps.metadata.outputs.dependency-names, 'swiftorg') && steps.update-swiftorg.outputs.result != 'true' | |
uses: actions/github-script@v6 | |
with: | |
github-token: ${{ secrets.COMMIT_TOKEN }} | |
script: | | |
github.rest.issues.createComment({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
issue_number: context.issue.number, | |
state: 'closed' | |
}); | |
ci: | |
name: Check requirements | |
if: | | |
always() && | |
(needs.dependabot.result == 'skipped' || (needs.dependabot.result == 'success' && needs.dependabot.outputs.ci == 'true')) | |
needs: dependabot | |
runs-on: ubuntu-latest | |
outputs: | |
run: ${{ github.event_name != 'push' }} | |
release: ${{ (steps.check_version_bump.outputs.release_type != '' && github.event_name == 'push') || (github.event_name == 'workflow_dispatch' && github.event.inputs.release == 'true') }} | |
steps: | |
- name: Checkout repository | |
if: github.event_name == 'push' && startsWith(github.event.head_commit.message, 'build(swift-org-website):') | |
uses: actions/checkout@v3 | |
- name: Check version bump | |
if: github.event_name == 'push' && startsWith(github.event.head_commit.message, 'build(swift-org-website):') | |
id: check_version_bump | |
uses: mathieudutour/github-tag-action@v6.1 | |
with: | |
github_token: ${{ github.token }} | |
custom_release_rules: build(swift-org-website):patch | |
default_bump: false | |
dry_run: true | |
analyze: | |
name: Run CodeQL analysis | |
if: | | |
always() && needs.ci.result == 'success' && | |
github.event_name != 'workflow_dispatch' | |
needs: ci | |
runs-on: ubuntu-latest | |
concurrency: | |
group: analyze-${{ github.ref }} | |
cancel-in-progress: true | |
permissions: | |
actions: read | |
contents: read | |
security-events: write | |
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: javascript | |
- name: Perform CodeQL Analysis | |
uses: github/codeql-action/analyze@v2 | |
unit-test: | |
name: Run unit tests | |
if: always() && needs.ci.result == 'success' | |
needs: ci | |
runs-on: ubuntu-latest | |
concurrency: | |
group: unit-test-${{ github.ref }} | |
cancel-in-progress: true | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v3 | |
with: | |
submodules: true | |
- name: Setup Node.js | |
id: setup-node | |
uses: actions/setup-node@v3 | |
with: | |
cache: npm | |
- name: Cache dependencies | |
id: cache-node | |
uses: actions/cache@v3.3.1 | |
with: | |
key: node-${{ github.ref }} | |
path: node_modules | |
- name: Setup npm pacakges | |
run: npm install | |
- name: Run unit tests | |
run: | | |
npm run lint | |
npm run test | |
- name: Codecov upload | |
uses: codecov/codecov-action@v3.1.4 | |
with: | |
token: ${{ secrets.CODECOV_TOKEN }} | |
fail_ci_if_error: ${{ github.event_name == 'push' }} | |
integration-test: | |
name: Integrate Swift ${{ matrix.swift }} on ${{ matrix.os }} with development ${{ matrix.development }} | |
if: | | |
always() && needs.ci.result == 'success' && | |
needs.ci.outputs.run == 'true' | |
needs: ci | |
runs-on: ${{ matrix.os }} | |
concurrency: | |
group: integration-test-${{ github.ref }}-${{ matrix.os }}-${{ matrix.swift }}-${{ matrix.development }} | |
cancel-in-progress: true | |
strategy: | |
matrix: | |
os: [ubuntu-latest, macos-latest, windows-latest] | |
swift: ['latest'] | |
development: [false, true] | |
include: | |
- os: macos-latest | |
swift: '5.0.0' | |
development: false | |
- os: macos-13 | |
swift: 'latest' | |
development: false | |
- os: ubuntu-latest | |
swift: '5.3.0' | |
development: false | |
- os: windows-latest | |
swift: '5.3' | |
development: false | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v3 | |
- name: Setup Node.js | |
id: setup-node | |
uses: actions/setup-node@v3 | |
with: | |
cache: npm | |
- name: Cache dependencies | |
id: cache-node | |
uses: actions/cache@v3.3.1 | |
with: | |
key: node-${{ github.ref }} | |
path: node_modules | |
- name: Setup npm pacakges | |
run: npm install | |
- name: Build | |
run: npm run build && npm run package | |
- name: Run | |
id: setup-swift | |
uses: ./ | |
with: | |
swift-version: ${{ matrix.swift }} | |
development: ${{ matrix.development }} | |
check-latest: ${{ github.event_name == 'schedule' }} | |
cache-snapshot: ${{ !matrix.development }} | |
- name: Verify Swift version in macos | |
if: runner.os == 'macOS' | |
run: xcrun --toolchain ${{ env.TOOLCHAINS || '""' }} swift --version | grep ${{ steps.setup-swift.outputs.swift-version }} || exit 1 | |
- name: Verify Swift version | |
run: swift --version | grep ${{ steps.setup-swift.outputs.swift-version }} || exit 1 | |
dry-run: | |
name: Check action with dry run | |
if: | | |
always() && needs.ci.result == 'success' && | |
needs.ci.outputs.run == 'true' | |
needs: ci | |
runs-on: ubuntu-latest | |
concurrency: | |
group: dry-run-${{ github.ref }} | |
cancel-in-progress: true | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v3 | |
- name: Setup Node.js | |
id: setup-node | |
uses: actions/setup-node@v3 | |
with: | |
cache: npm | |
- name: Cache dependencies | |
id: cache-node | |
uses: actions/cache@v3.3.1 | |
with: | |
key: node-${{ github.ref }} | |
path: node_modules | |
- name: Setup npm pacakges | |
run: npm install | |
- name: Build | |
run: npm run build && npm run package | |
- name: Run | |
id: setup-swift | |
uses: ./ | |
with: | |
check-latest: ${{ github.event_name == 'schedule' }} | |
dry-run: true | |
- name: Verify Swift version | |
uses: addnab/docker-run-action@v3 | |
with: | |
image: swift:${{ fromJSON(steps.setup-swift.outputs.toolchain).docker }} | |
run: swift --version | grep ${{ steps.setup-swift.outputs.swift-version }} || exit 1 | |
e2e-test: | |
name: End-to-end test latest Swift on ${{ matrix.os }} | |
if: | | |
always() && needs.ci.result == 'success' && | |
needs.ci.outputs.run == 'true' | |
needs: ci | |
runs-on: ${{ matrix.os }} | |
concurrency: | |
group: e2e-test-${{ github.ref }}-${{ matrix.os }} | |
cancel-in-progress: true | |
env: | |
COMPOSITE: ./.ref-download-test | |
strategy: | |
matrix: | |
os: [ubuntu-latest, macos-latest, windows-latest] | |
steps: | |
- name: Setup wrapper composite action at ${{ env.COMPOSITE }} | |
uses: actions/github-script@v6 | |
with: | |
script: | | |
const path = require('path'); | |
const fs = require('fs/promises'); | |
const composite = '${{ env.COMPOSITE }}'; | |
const repo = '${{ github.event.pull_request.head.repo.full_name || github.repository }}'; | |
const branch = '${{ github.head_ref || github.ref_name }}'; | |
const action = { | |
outputs: { | |
'swift-version': { | |
value: '$' + `{{ steps.run.outputs.swift-version }}` | |
} | |
}, | |
runs: { | |
using: 'composite', | |
steps: [ | |
{ | |
name: 'Cleanup', | |
uses: `actions/github-script@${{ github.action_ref }}`, | |
with: { | |
script: `await io.rmRF('${composite}')` | |
} | |
}, | |
{ | |
name: `Run ${repo}@${branch}`, | |
id: 'run', | |
uses: `${repo}@${branch}`, | |
with: { | |
'swift-version': 'latest', | |
'check-latest': '${{ github.event_name == 'schedule' }}' | |
} | |
} | |
] | |
} | |
}; | |
const content = JSON.stringify(action); | |
core.debug(`Writing action:\n${content}\n`); | |
await io.mkdirP(composite); | |
await fs.writeFile(path.join(composite, 'action.yml'), content); | |
- name: Run composite action ${{ env.COMPOSITE }} | |
id: setup-swift | |
uses: ./.ref-download-test | |
- name: Cleanup | |
if: always() | |
uses: actions/github-script@v6 | |
continue-on-error: true | |
with: | |
script: await io.rmRF('${{ env.COMPOSITE }}'); | |
- name: Verify Swift version in macos | |
if: runner.os == 'macOS' | |
run: xcrun --toolchain ${{ env.TOOLCHAINS || '""' }} swift --version | grep ${{ steps.setup-swift.outputs.swift-version }} || exit 1 | |
- name: Verify Swift version | |
run: swift --version | grep ${{ steps.setup-swift.outputs.swift-version }} || exit 1 | |
- name: Test Swift package | |
run: | | |
swift package init --type library --name SetupLib | |
swift build --build-tests | |
swift test | |
merge: | |
name: Auto-merge submodule update PR | |
if: needs.dependabot.outputs.merge == 'true' | |
needs: dependabot | |
runs-on: ubuntu-latest | |
concurrency: | |
group: swiftorg-update | |
cancel-in-progress: true | |
permissions: | |
contents: write | |
pull-requests: write | |
steps: | |
- name: Approve | |
if: needs.dependabot.outputs.approve == 'true' | |
run: gh pr review --approve "${{ github.event.pull_request.html_url }}" | |
env: | |
GITHUB_TOKEN: ${{ secrets.COMMIT_TOKEN }} | |
- name: Auto-merge | |
run: gh pr merge --auto --squash "${{ github.event.pull_request.html_url }}" | |
env: | |
GITHUB_TOKEN: ${{ secrets.COMMIT_TOKEN }} | |
cd: | |
name: Create release | |
if: | | |
always() && needs.ci.outputs.release == 'true' && | |
(needs.analyze.result == 'success' || needs.analyze.result == 'skipped') && | |
(needs.unit-test.result == 'success' || needs.unit-test.result == 'skipped') && | |
(needs.integration-test.result == 'success' || needs.integration-test.result == 'skipped') && | |
(needs.dry-run.result == 'success' || needs.dry-run.result == 'skipped') && | |
(needs.e2e-test.result == 'success' || needs.e2e-test.result == 'skipped') | |
needs: [ci, analyze, unit-test, integration-test, dry-run, e2e-test] | |
runs-on: ubuntu-latest | |
concurrency: | |
group: cd-${{ github.ref }} | |
cancel-in-progress: true | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v3 | |
with: | |
fetch-tags: true | |
submodules: true | |
token: ${{ secrets.COMMIT_TOKEN }} | |
- name: Import GPG | |
uses: crazy-max/ghaction-import-gpg@v5.3.0 | |
with: | |
gpg_private_key: ${{ secrets.COMMIT_SIGN_KEY }} | |
passphrase: ${{ secrets.COMMIT_SIGN_KEY_PASSPHRASE }} | |
git_user_signingkey: true | |
git_commit_gpgsign: true | |
git_tag_gpgsign: true | |
git_push_gpgsign: if-asked | |
- name: Setup Node.js | |
id: setup-node | |
uses: actions/setup-node@v3 | |
with: | |
cache: npm | |
- name: Cache dependencies | |
id: cache-node | |
uses: actions/cache@v3.3.1 | |
with: | |
key: node-${{ github.ref }} | |
path: node_modules | |
- name: Setup npm pacakges | |
run: npm install | |
- name: Generate changelog | |
id: changelog | |
uses: TriPSs/conventional-changelog-action@v4 | |
with: | |
github-token: ${{ secrets.COMMIT_TOKEN }} | |
git-message: 'chore(CHANGELOG): update for {version}' | |
git-user-name: swiftylab-ci | |
git-user-email: swiftylab.bot@gmail.com | |
release-count: 0 | |
version-file: ./package.json | |
version-path: version | |
fallback-version: ${{ inputs.version || '1.0.0' }} | |
config-file-path: .github/changelog/config.js | |
pre-commit: .github/changelog/pre_commit_hook.js | |
pre-changelog-generation: .github/changelog/pre_changelog_hook.js | |
create-summary: true | |
env: | |
VERSION: ${{ inputs.version }} | |
NODE_PATH: ${{ github.workspace }}/node_modules | |
- name: Update latest tag | |
run: | | |
git push --signed=if-asked origin :refs/tags/latest | |
git tag -sfa latest -m latest | |
git push --signed=if-asked origin --tags | |
- name: Create GitHub release | |
uses: ncipollo/release-action@v1 | |
with: | |
token: ${{ github.token }} | |
tag: ${{ steps.changelog.outputs.tag }} | |
body: ${{ steps.changelog.outputs.changelog }} |