Release - Swift Toolchain Binary Sizes #120
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
# Uploads a toolchain release's binary size metrics to DataDog. | |
# | |
# To target a specific Swift Toolchain Release, run: | |
# | |
# $TOOLCHAIN_VERSION="..." | |
# gh workflow run "Release - Swift Toolchain Binary Sizes" ` | |
# -f toolchain_version=${TOOLCHAIN_VERSION} ` | |
# -f environment_label=${USER} ` | |
# -R github.com/thebrowsercompany/swift-build ` | |
# | |
name: Release - Swift Toolchain Binary Sizes | |
on: | |
release: | |
types: [created, edited] | |
workflow_dispatch: | |
inputs: | |
toolchain_version: | |
description: 'Use this swift toolchain release version' | |
required: false | |
type: string | |
default: '' # See env.SWIFT_TOOLCHAIN_VERSION | |
environment_label: | |
description: 'Tag the uploaded data with this value. This helps with filtering' | |
required: false | |
type: string | |
default: '' | |
env: | |
SOURCE_ROOT: ${{ github.workspace }}/source | |
BUILD_ROOT: ${{ github.workspace }}/build | |
jobs: | |
context: | |
runs-on: windows-latest | |
outputs: | |
matrix: ${{ steps.matrix.outputs.matrix }} | |
steps: | |
- id: matrix | |
run: | | |
$Matrix = @" | |
{ | |
"include": [ | |
{ | |
"arch": "amd64", | |
"os": "windows-latest", | |
"is_cirun": "false" | |
}, | |
{ | |
"arch": "arm64", | |
"os": "cirun-win11-23h2-pro-arm64-16-2024-04-22", | |
"is_cirun": "true" | |
} | |
] | |
} | |
"@ | |
# USE_CIRUN kill switch. | |
# Edit https://github.com/thebrowsercompany/swift-build/settings/variables/actions to override. | |
if ("${{ vars.USE_CIRUN }}" -eq "false") { | |
$Matrix=("$Matrix" | jq 'del(.include[] | select(.is_cirun == ""true""))') | |
} | |
$Matrix=($Matrix | ConvertFrom-Json | ConvertTo-Json -Compress) | |
echo "$Matrix" | |
"matrix=$Matrix" | Out-File -Encoding utf8 -Append $env:GITHUB_OUTPUT | |
binary_size_data: | |
name: Generate Swift toolchain binary size data | |
needs: [context] | |
permissions: | |
contents: read | |
# required to make OIDC work | |
id-token: write | |
env: | |
BLOATY_OPTIONS_FILE: ${{ github.workspace }}/bloaty.textproto | |
SWIFT_TOOLCHAIN_VERSION: ${{ github.event.inputs.toolchain_version || github.ref_name }} | |
ENVIRONMENT_LABEL: ${{ github.event.inputs.environment_label || 'ci' }} | |
strategy: | |
matrix: ${{ fromJson(needs.context.outputs.matrix) }} | |
runs-on: ${{ matrix.os }} | |
steps: | |
- name: Checkout swift-build | |
uses: actions/checkout@v4 | |
with: | |
show-progress: false | |
- name: Get service account credentials | |
# configure-aws-credentials v4.0.1 release | |
uses: thebrowsercompany/gha-aws-ssm-get-parameter@v1 | |
with: | |
aws-role-to-assume: ${{ secrets.SWIFT_TOOLCHAIN_UPLOADER_ROLE_ARN }} | |
aws-role-session-name: SwiftToolchainMetricsUploader | |
aws-ssm-parameter: "/shared/secrets/GITHUB_ACTIONS_BQ_DATA_UPLOAD" | |
save-to-filepath: ${{ github.workspace }}/.google_application_credentials | |
- name: Setup Google application default credentials | |
run: echo "GOOGLE_APPLICATION_CREDENTIALS=${{ github.workspace }}/.google_application_credentials" | Out-File -FilePath $env:GITHUB_ENV -Append | |
- name: Install Swift toolchain | |
uses: compnerd/gha-setup-swift@main | |
with: | |
github-repo: thebrowsercompany/swift-build | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
release-asset-name: installer-${{ matrix.arch }}.exe | |
release-tag-name: ${{ env.SWIFT_TOOLCHAIN_VERSION }} | |
- name: Store Swift Toolchain root in environment variable | |
run: | | |
# Locate the toolchain installation <root> by walking up from | |
# '<root>/Toolchains/<toolchain-version>/usr/bin/swift.exe'. | |
$SwiftPath=$(Get-Command swift).Source | |
$SwiftInstallRoot=$(Resolve-Path -LiteralPath $SwiftPath\..\..\..\..\..) | |
echo "SWIFT_INSTALL_ROOT=${SwiftInstallRoot}" | Out-File -FilePath $env:GITHUB_ENV -Append | |
# For scripts/python/binary_sizes | |
- name: Install Python dependencies | |
run: | | |
pip install google-cloud-bigquery | |
pip install google-auth-oathlib | |
pip install pandas | |
- name: Setup VS Dev Env | |
uses: compnerd/gha-setup-vsdevenv@main | |
with: | |
host_arch: ${{ matrix.arch }} | |
components: 'Microsoft.VisualStudio.Component.VC.Tools.x86.x64;Microsoft.VisualStudio.Component.VC.Tools.ARM64' | |
arch: ${{ matrix.arch }} | |
- name: Run google/bloaty | |
uses: thebrowsercompany/gha-google-bloaty@8481ad244140a67ebca1fca5eddf444f3065ce8f | |
with: | |
bloaty-version: 34f4a66559ad4938c1e629e9b5f54630b2b4d7b0 | |
bloaty-args: -w -n 0 -d inputfiles,segments -s file --csv | |
bloaty-input-files: | | |
${{ env.SWIFT_INSTALL_ROOT }}/**/*.dll | |
${{ env.SWIFT_INSTALL_ROOT }}/**/*.exe | |
bloaty-output-file: ${{ github.workspace }}/binary_sizes.csv | |
cache-bloaty: 'true' | |
# Normally the cache key includes `bloaty-version`. This ensures that | |
# all workflow runs for the same target arch use a single cache | |
# consuming minimal space. | |
cache-bloaty-key: google-bloaty-${{ matrix.arch }} | |
- name: Generate BigQuery table data | |
run: | | |
$CreationTime=$(gh release view ${{ env.SWIFT_TOOLCHAIN_VERSION }} --json createdAt --jq '.[]') | |
$Script="./scripts/python/binary_sizes/bigquery_generate_table_data.py" | |
python ${Script} ${{ github.workspace }}/binary_sizes.csv ${{ github.workspace }}/table_data.csv ` | |
--toolchain-version=${{ env.SWIFT_TOOLCHAIN_VERSION }} ` | |
--toolchain-arch=${{ matrix.arch }} ` | |
--strip-inputfiles-prefix=${{ env.SWIFT_INSTALL_ROOT }} ` | |
--environment="${{ env.ENVIRONMENT_LABEL }}" ` | |
--creation-time="$CreationTime" | |
- name: Show BigQuery table data to upload | |
run: Get-Content -Path ${{ github.workspace }}/table_data.csv | |
- name: Upload to BigQuery | |
continue-on-error: true | |
run: | | |
$Script="./scripts/python/binary_sizes/bigquery_load_csv.py" | |
python ${Script} ${{ github.workspace }}/table_data.csv | |
# TODO(thebrowsercompany/gha-aws-ssm-get-parameter/issues/1): Do this as a post-step in gha-aws-ssm-get-parameter. | |
- name: Cleanup credentials | |
run: Remove-Item ${{ github.workspace }}/.google_application_credentials |