From de46c3e54edbec3ab69b41a09e38b5369d97a4a5 Mon Sep 17 00:00:00 2001
From: buchwasa <17461354+buchwasa@users.noreply.github.com>
Date: Tue, 22 Mar 2022 21:28:36 -0400
Subject: [PATCH] macos: build arm-64
Add support for building osx-arm64 in addition to osx-x64 to produce
native M1 binaries.
---
.github/workflows/release.yml | 57 ++++++++++++++-----
src/osx/Installer.Mac/Installer.Mac.csproj | 4 +-
src/osx/Installer.Mac/build.sh | 6 +-
src/osx/Installer.Mac/distribution.xml | 2 +-
src/osx/Installer.Mac/layout.sh | 23 +++++++-
.../Atlassian.Bitbucket.UI.Avalonia.csproj | 2 +-
.../Git-Credential-Manager.csproj | 2 +-
.../GitHub.UI.Avalonia.csproj | 2 +-
.../GitLab.UI.Avalonia.csproj | 2 +-
9 files changed, 76 insertions(+), 24 deletions(-)
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index e15d88394..db6dc6807 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -12,6 +12,9 @@ jobs:
osx-build:
name: Build macOS
runs-on: macos-latest
+ strategy:
+ matrix:
+ runtime: [ osx-x64, osx-arm64 ]
steps:
- uses: actions/checkout@v3
with:
@@ -27,7 +30,9 @@ jobs:
- name: Build
run: |
- dotnet build --configuration=MacRelease
+ dotnet build src/osx/Installer.Mac/*.csproj \
+ --configuration=MacRelease --no-self-contained \
+ --runtime=${{ matrix.runtime }}
- name: Run macOS unit tests
run: |
@@ -35,7 +40,9 @@ jobs:
- name: Lay out payload and symbols
run: |
- src/osx/Installer.Mac/layout.sh --configuration=MacRelease --output=payload --symbol-output=symbols
+ src/osx/Installer.Mac/layout.sh \
+ --configuration=MacRelease --output=payload \
+ --symbol-output=symbols --runtime=${{ matrix.runtime }}
- name: Create keychain
env:
@@ -58,7 +65,7 @@ jobs:
- name: Upload macOS artifacts
uses: actions/upload-artifact@v3
with:
- name: tmp.osx-build
+ name: tmp.${{ matrix.runtime }}-build
path: |
payload
symbols
@@ -67,6 +74,9 @@ jobs:
name: Sign macOS payload
# ESRP service requires signing to run on Windows
runs-on: windows-latest
+ strategy:
+ matrix:
+ runtime: [ osx-x64, osx-arm64 ]
needs: osx-build
steps:
- name: Check out repository
@@ -75,7 +85,7 @@ jobs:
- name: Download payload
uses: actions/download-artifact@v3
with:
- name: tmp.osx-build
+ name: tmp.${{ matrix.runtime }}-build
- name: Zip unsigned payload
shell: pwsh
@@ -109,7 +119,9 @@ jobs:
APPLE_KEY_CODE: ${{ secrets.APPLE_KEY_CODE }}
APPLE_SIGNING_OP_CODE: ${{ secrets.APPLE_SIGNING_OPERATION_CODE }}
run: |
- python .github\run_esrp_signing.py payload $env:APPLE_KEY_CODE $env:APPLE_SIGNING_OP_CODE --params 'Hardening' '--options=runtime'
+ python .github\run_esrp_signing.py payload `
+ $env:APPLE_KEY_CODE $env:APPLE_SIGNING_OP_CODE `
+ --params 'Hardening' '--options=runtime'
- name: Unzip signed payload
shell: pwsh
@@ -120,13 +132,16 @@ jobs:
- name: Upload signed payload
uses: actions/upload-artifact@v3
with:
- name: osx-payload-sign
+ name: ${{ matrix.runtime }}-payload-sign
path: |
signed
osx-pack:
name: Package macOS payload
runs-on: macos-latest
+ strategy:
+ matrix:
+ runtime: [ osx-x64, osx-arm64 ]
needs: osx-payload-sign
steps:
- name: Check out repository
@@ -147,20 +162,24 @@ jobs:
- name: Download signed payload
uses: actions/download-artifact@v3
with:
- name: osx-payload-sign
+ name: ${{ matrix.runtime }}-payload-sign
- name: Create component package
run: |
- src/osx/Installer.Mac/pack.sh --payload=payload --version=$GitBuildVersionSimple --output=components/com.microsoft.gitcredentialmanager.component.pkg
+ src/osx/Installer.Mac/pack.sh --payload=payload \
+ --version=$GitBuildVersionSimple \
+ --output=components/com.microsoft.gitcredentialmanager.component.pkg
- name: Create product archive
run: |
- src/osx/Installer.Mac/dist.sh --package-path=components --version=$GitBuildVersionSimple --output=pkg/gcm-osx-x64-$GitBuildVersionSimple.pkg || exit 1
+ src/osx/Installer.Mac/dist.sh --package-path=components \
+ --version=$GitBuildVersionSimple --runtime=${{ matrix.runtime }} \
+ --output=pkg/gcm-${{ matrix.runtime }}-$GitBuildVersionSimple.pkg || exit 1
- name: Upload package
uses: actions/upload-artifact@v3
with:
- name: tmp.osx-pack
+ name: tmp.${{ matrix.runtime }}-pack
path: |
pkg
@@ -168,6 +187,9 @@ jobs:
name: Sign and notarize macOS package
# ESRP service requires signing to run on Windows
runs-on: windows-latest
+ strategy:
+ matrix:
+ runtime: [ osx-x64, osx-arm64 ]
needs: osx-pack
steps:
- name: Check out repository
@@ -176,7 +198,7 @@ jobs:
- name: Download unsigned package
uses: actions/download-artifact@v3
with:
- name: tmp.osx-pack
+ name: tmp.${{ matrix.runtime }}-pack
path: pkg
- name: Zip unsigned package
@@ -236,7 +258,7 @@ jobs:
- name: Publish signed package
uses: actions/upload-artifact@v3
with:
- name: osx-sign
+ name: ${{ matrix.runtime }}-sign
path: signed/*.pkg
# ================================
@@ -468,8 +490,12 @@ jobs:
- name: Archive macOS payload and symbols
run: |
mkdir osx-payload-and-symbols
- tar -C osx-payload-sign -czf osx-payload-and-symbols/gcm-osx-x64-$GitBuildVersionSimple.tar.gz .
- tar -C tmp.osx-build/symbols -czf osx-payload-and-symbols/gcm-osx-x64-$GitBuildVersionSimple-symbols.tar.gz .
+
+ tar -C osx-x64-payload-sign -czf osx-payload-and-symbols/gcm-osx-x64-$GitBuildVersionSimple.tar.gz .
+ tar -C tmp.osx-x64-build/symbols -czf osx-payload-and-symbols/gcm-osx-x64-$GitBuildVersionSimple-symbols.tar.gz .
+
+ tar -C osx-arm64-payload-sign -czf osx-payload-and-symbols/gcm-osx-arm64-$GitBuildVersionSimple.tar.gz .
+ tar -C tmp.osx-arm64-build/symbols -czf osx-payload-and-symbols/gcm-osx-arm64-$GitBuildVersionSimple-symbols.tar.gz .
- name: Archive Windows payload and symbols
shell: pwsh
@@ -527,7 +553,8 @@ jobs:
uploadDirectoryToRelease('win-x86-payload-and-symbols'),
// Upload macOS artifacts
- uploadDirectoryToRelease('osx-sign'),
+ uploadDirectoryToRelease('osx-x64-sign'),
+ uploadDirectoryToRelease('osx-arm64-sign'),
uploadDirectoryToRelease('osx-payload-and-symbols'),
// Upload Linux artifacts
diff --git a/src/osx/Installer.Mac/Installer.Mac.csproj b/src/osx/Installer.Mac/Installer.Mac.csproj
index 685862ff5..f42bd3333 100644
--- a/src/osx/Installer.Mac/Installer.Mac.csproj
+++ b/src/osx/Installer.Mac/Installer.Mac.csproj
@@ -21,8 +21,8 @@
-
-
+
+
diff --git a/src/osx/Installer.Mac/build.sh b/src/osx/Installer.Mac/build.sh
index 816c621ec..f8aaf2260 100755
--- a/src/osx/Installer.Mac/build.sh
+++ b/src/osx/Installer.Mac/build.sh
@@ -22,6 +22,10 @@ case "$i" in
CONFIGURATION="${i#*=}"
shift # past argument=value
;;
+ --runtime=*)
+ RUNTIME="${i#*=}"
+ shift
+ ;;
--version=*)
VERSION="${i#*=}"
shift # past argument=value
@@ -45,7 +49,7 @@ COMPONENTOUT="$COMPONENTDIR/com.microsoft.gitcredentialmanager.component.pkg"
DISTOUT="$OUTDIR/gcm-osx-x64-$VERSION.pkg"
# Layout and pack
-"$INSTALLER_SRC/layout.sh" --configuration="$CONFIGURATION" --output="$PAYLOAD" || exit 1
+"$INSTALLER_SRC/layout.sh" --configuration="$CONFIGURATION" --output="$PAYLOAD" --runtime="$RUNTIME" || exit 1
"$INSTALLER_SRC/pack.sh" --payload="$PAYLOAD" --version="$VERSION" --output="$COMPONENTOUT" || exit 1
"$INSTALLER_SRC/dist.sh" --package-path="$COMPONENTDIR" --version="$VERSION" --output="$DISTOUT" || exit 1
diff --git a/src/osx/Installer.Mac/distribution.xml b/src/osx/Installer.Mac/distribution.xml
index 657397513..667286e5d 100644
--- a/src/osx/Installer.Mac/distribution.xml
+++ b/src/osx/Installer.Mac/distribution.xml
@@ -2,7 +2,7 @@
Git Credential Manager
-
+
diff --git a/src/osx/Installer.Mac/layout.sh b/src/osx/Installer.Mac/layout.sh
index 288216165..b7be0010f 100755
--- a/src/osx/Installer.Mac/layout.sh
+++ b/src/osx/Installer.Mac/layout.sh
@@ -27,7 +27,6 @@ GITLAB_UI_SRC="$SRC/shared/GitLab.UI.Avalonia"
# Build parameters
FRAMEWORK=net6.0
-RUNTIME=osx-x64
# Parse script arguments
for i in "$@"
@@ -41,6 +40,10 @@ case "$i" in
PAYLOAD="${i#*=}"
shift # past argument=value
;;
+ --runtime=*)
+ RUNTIME="${i#*=}"
+ shift # past argument=value
+ ;;
--symbol-output=*)
SYMBOLOUT="${i#*=}"
;;
@@ -50,6 +53,24 @@ case "$i" in
esac
done
+# Determine a runtime if one was not provided
+if [ -z "$RUNTIME" ]; then
+ TEST_ARCH=`uname -m`
+ case $TEST_ARCH in
+ "x86_64")
+ RUNTIME="osx-x64"
+ ;;
+ "arm64")
+ RUNTIME="osx-arm64"
+ ;;
+ *)
+ die "Unknown architecture '$TEST_ARCH'"
+ ;;
+ esac
+fi
+
+echo "Building for runtime '$RUNTIME'"
+
# Perform pre-execution checks
CONFIGURATION="${CONFIGURATION:=Debug}"
if [ -z "$PAYLOAD" ]; then
diff --git a/src/shared/Atlassian.Bitbucket.UI.Avalonia/Atlassian.Bitbucket.UI.Avalonia.csproj b/src/shared/Atlassian.Bitbucket.UI.Avalonia/Atlassian.Bitbucket.UI.Avalonia.csproj
index e1ae6d4af..a9185278a 100644
--- a/src/shared/Atlassian.Bitbucket.UI.Avalonia/Atlassian.Bitbucket.UI.Avalonia.csproj
+++ b/src/shared/Atlassian.Bitbucket.UI.Avalonia/Atlassian.Bitbucket.UI.Avalonia.csproj
@@ -3,7 +3,7 @@
WinExe
net6.0
- osx-x64;linux-x64
+ osx-x64;linux-x64;osx-arm64
Atlassian.Bitbucket.UI
Atlassian.Bitbucket.UI
diff --git a/src/shared/Git-Credential-Manager/Git-Credential-Manager.csproj b/src/shared/Git-Credential-Manager/Git-Credential-Manager.csproj
index 10f598f61..441ee82bc 100644
--- a/src/shared/Git-Credential-Manager/Git-Credential-Manager.csproj
+++ b/src/shared/Git-Credential-Manager/Git-Credential-Manager.csproj
@@ -4,7 +4,7 @@
Exe
net6.0
net472;net6.0
- win-x86;osx-x64;linux-x64
+ win-x86;osx-x64;linux-x64;osx-arm64
x86
git-credential-manager-core
GitCredentialManager
diff --git a/src/shared/GitHub.UI.Avalonia/GitHub.UI.Avalonia.csproj b/src/shared/GitHub.UI.Avalonia/GitHub.UI.Avalonia.csproj
index d1e040118..828677fcc 100644
--- a/src/shared/GitHub.UI.Avalonia/GitHub.UI.Avalonia.csproj
+++ b/src/shared/GitHub.UI.Avalonia/GitHub.UI.Avalonia.csproj
@@ -3,7 +3,7 @@
WinExe
net6.0
- osx-x64;linux-x64
+ osx-x64;linux-x64;osx-arm64
GitHub.UI
GitHub.UI
diff --git a/src/shared/GitLab.UI.Avalonia/GitLab.UI.Avalonia.csproj b/src/shared/GitLab.UI.Avalonia/GitLab.UI.Avalonia.csproj
index 0a64307ee..26927c272 100644
--- a/src/shared/GitLab.UI.Avalonia/GitLab.UI.Avalonia.csproj
+++ b/src/shared/GitLab.UI.Avalonia/GitLab.UI.Avalonia.csproj
@@ -3,7 +3,7 @@
WinExe
net6.0
- osx-x64;linux-x64
+ osx-x64;linux-x64;osx-arm64
GitLab.UI
GitLab.UI