Skip to content

Release - Swift Toolchain Binary Sizes #2081

Release - Swift Toolchain Binary Sizes

Release - Swift Toolchain Binary Sizes #2081

# 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 = @"
[
{
"arch": "amd64",
"os": "windows-latest",
"is_cirun": "false"
},
{
"arch": "arm64",
"os": "cirun-win11-23h2-pro-arm64-16-2024-04-22",
"is_cirun": "true"
}
]
"@
# Cirun kill switch.
# Edit https://github.com/thebrowsercompany/swift-build/settings/variables/actions to override.
if ("${{ vars.USE_CIRUN }}" -eq "false") {
$Matrix="$Matrix" | jq '[ .[] | select(.is_cirun == "false") ]'
}
# Minify output so Github can parse it.
$Matrix=$Matrix | jq -c
echo "Generated matrix: $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:
include: ${{ 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@main
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 }}
# Use MSVC (cl) for arm64 because:
# 1. g++ is the default and fails on our arm64 vms because the Windows SDK isn't old enough to
# support g++11 (required by google/bloaty -> google/re2).
# 2. clang-cl fails on google/bloaty -> protocolfbuffers/protobuf due to
# https://github.com/protocolbuffers/protobuf/issues/6503.
compiler: ${{ matrix.arch == 'arm64' && 'cl' || '' }}
- 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