Skip to content

fix: only add existing directories to PATH on windows #262

fix: only add existing directories to PATH on windows

fix: only add existing directories to PATH on windows #262

Workflow file for this run

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 }}