Skip to content

Publish Release

Publish Release #101

name: Publish Release
on:
workflow_dispatch:
inputs:
prerelease:
type: boolean
description: "Prerelease"
# Whether to create a prerelease or proper release
default: true
required: true
swift_format_version:
type: string
default: 601.0.0
description: "swift-format version"
# The version of swift-format to tag. If this is a prerelease, `-prerelease-<date>` is added to this version.
required: true
swift_syntax_tag:
type: string
default: 601.0.0
description: "swift-syntax version"
# The swift-syntax version to depend on. If this is a prerelease, the latest swift-syntax prerelease tag for this version is used.
required: true
jobs:
test:
name: Test
runs-on: windows-2022
needs: define_tags
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Test
run: |
mkdir $env:TEMP\run-script
echo @"
${{ needs.define_tags.outputs.release_commit_patch }}
"@ > $env:TEMP\patch.diff
git config --local user.name "swift-ci"
git config --local user.email "[email protected]"
Get-ChildItem env:
echo @'
echo "------"
Get-ChildItem env:
cat $env:TEMP\patch.diff | git am
'@ >> $env:TEMP\run-script\pre-build.ps1
'C:\Program Files\PowerShell\7\pwsh.EXE' "$env:TEMP\run-script\pre-build.ps1"
# check_triggering_actor:
# name: Check user is allowed to create release
# # Only a single user should be allowed to create releases to avoid two people triggering the creation of a release
# # at the same time. If the release manager changes between users, update this condition.
# runs-on: ubuntu-latest
# steps:
# - run: |
# if [[ "${{ github.triggering_actor }}" != "ahoppen" ]]; then
# echo "${{ github.triggering_actor }} is not allowed to create a release"
# exit 1
# fi
define_tags:
name: Determine dependent swift-syntax version and prerelease date
runs-on: ubuntu-latest
outputs:
swift_syntax_tag: ${{ steps.swift_syntax_tag.outputs.swift_syntax_tag }}
swift_format_version: ${{ steps.swift_format_version.outputs.swift_format_version }}
release_commit_patch: ${{ steps.create_release_commits.outputs.release_commit_patch }}
steps:
- name: Determine swift-syntax tag to depend on
id: swift_syntax_tag
shell: bash
run: |
if [[ "${{ github.event.inputs.prerelease }}" == "false" ]]; then
SWIFT_SYNTAX_TAG="${{ github.event.inputs.swift_syntax_tag }}"
else
git clone https://github.com/swiftlang/swift-syntax.git
cd swift-syntax
SWIFT_SYNTAX_TAG="$(git tag | grep ${{ github.event.inputs.swift_syntax_tag }}-prerelease | sort -r | head -1)"
fi
echo "Using swift-syntax tag: $SWIFT_SYNTAX_TAG"
echo "swift_syntax_tag=$SWIFT_SYNTAX_TAG" >> "$GITHUB_OUTPUT"
- name: Determine swift-format prerelease version
id: swift_format_version
run: |
if [[ "${{ github.event.inputs.prerelease }}" == "false" ]]; then
SWIFT_FORMAT_VERSION="${{ github.event.inputs.swift_format_version }}"
else
SWIFT_FORMAT_VERSION="${{ github.event.inputs.swift_format_version }}-prerelease-$(date +'%Y-%m-%d')"
fi
echo "Using swift-format version: $SWIFT_FORMAT_VERSION"
echo "swift_format_version=$SWIFT_FORMAT_VERSION" >> "$GITHUB_OUTPUT"
- name: Checkout repository
uses: actions/checkout@v4
- name: Create release commits
id: create_release_commits
run: |
BASE_COMMIT=$(git rev-parse HEAD)
bash .github/workflows/create-release-commits.sh '${{ steps.swift_syntax_tag.outputs.swift_syntax_tag }}' '${{ steps.swift_format_version.outputs.swift_format_version }}'
{
echo 'release_commit_patch<<EOF'
git format-patch "$BASE_COMMIT"..HEAD --stdout
echo EOF
} >> "$GITHUB_OUTPUT"
# test_debug:
# name: Test in Debug configuration
# uses: ahoppen/github-workflows/.github/workflows/swift_package_test.yml@windows-pre-build
# needs: define_tags
# with:
# linux_pre_build_command: |
# git config --global --add safe.directory "$(realpath .)"
# git config --local user.name 'swift-ci'
# git config --local user.email '[email protected]'
# echo '${{ needs.define_tags.outputs.release_commit_patch }}' | git am
# # We require that releases of swift-format build without warnings
# linux_build_command: swift test -Xswiftc -warnings-as-errors
# windows_pre_build_command: |
# git config user.name "swift-ci"
# git config user.email "[email protected]"
# git config --global user.name "swift-ci"
# git config --global user.email "[email protected]"
# echo @"
# ${{ needs.define_tags.outputs.release_commit_patch }}
# "@ > $env:TEMP\patch.diff
# cat $env:TEMP\patch.diff
# cat $env:TEMP\patch.diff | git am
# windows_build_command: swift test -Xswiftc -warnings-as-errors
# linux_exclude_swift_versions: '[{"swift_version": "5.8"}, {"swift_version": "5.9"}, {"swift_version": "5.10"}, {"swift_version": "6.0"}, {"swift_version": "nightly-main"}, {"swift_version": "nightly-6.0"}]'
# windows_exclude_swift_versions: '[{"swift_version": "5.8"}, {"swift_version": "5.9"}, {"swift_version": "5.10"}, {"swift_version": "nightly"}, {"swift_version": "nightly-6.0"}]'
# create_tag:
# name: Create Tag
# runs-on: ubuntu-latest
# needs: [check_triggering_actor, test_debug, define_tags]
# permissions:
# contents: write
# steps:
# - name: Checkout repository
# uses: actions/checkout@v4
# - name: Create release commits
# run: bash .github/workflows/create-release-commits.sh '${{ needs.define_tags.outputs.swift_syntax_tag }}' '${{ needs.define_tags.outputs.swift_format_version }}'
# - name: Tag release
# run: |
# git tag "${{ needs.define_tags.outputs.swift_format_version }}"
# git push origin "${{ needs.define_tags.outputs.swift_format_version }}"
# - name: Create release
# env:
# GH_TOKEN: ${{ github.token }}
# run: |
# if [[ "${{ github.event.inputs.prerelease }}" != "true" ]]; then
# # Only create a release automatically for prereleases. For real releases, release notes should be crafted by hand.
# exit
# fi
# gh release create "${{ needs.define_tags.outputs.swift_format_version }}" \
# --title "${{ needs.define_tags.outputs.swift_format_version }}" \
# --prerelease
# TODO:
# - Move create-release-commits to workflow
# - Use patch file in create_tag