Update release pipelines to upload release artifacts

This commit is contained in:
Conrad Kramer 2024-03-16 10:40:09 -07:00
parent 4334f8c9c9
commit cb1bc1c8aa
52 changed files with 593 additions and 74 deletions

View file

@ -26,9 +26,12 @@ runs:
run: | run: |
echo "${{ inputs.app-store-key }}" > AuthKey_${{ inputs.app-store-key-id }}.p8 echo "${{ inputs.app-store-key }}" > AuthKey_${{ inputs.app-store-key-id }}.p8
xcodebuild archive \ xcodebuild clean archive \
-allowProvisioningUpdates \ -allowProvisioningUpdates \
-allowProvisioningDeviceRegistration \ -allowProvisioningDeviceRegistration \
-skipPackagePluginValidation \
-skipMacroValidation \
-onlyUsePackageVersionsFromResolvedFile \
-authenticationKeyID ${{ inputs.app-store-key-id }} \ -authenticationKeyID ${{ inputs.app-store-key-id }} \
-authenticationKeyIssuerID ${{ inputs.app-store-key-issuer-id }} \ -authenticationKeyIssuerID ${{ inputs.app-store-key-issuer-id }} \
-authenticationKeyPath "${PWD}/AuthKey_${{ inputs.app-store-key-id }}.p8" \ -authenticationKeyPath "${PWD}/AuthKey_${{ inputs.app-store-key-id }}.p8" \
@ -38,6 +41,4 @@ runs:
-archivePath '${{ inputs.archive-path }}' \ -archivePath '${{ inputs.archive-path }}' \
-resultBundlePath BuildResults.xcresult -resultBundlePath BuildResults.xcresult
./Tools/xcresulttool-github BuildResults.xcresult
rm -rf AuthKey_${{ inputs.app-store-key-id }}.p8 rm -rf AuthKey_${{ inputs.app-store-key-id }}.p8

View file

@ -18,7 +18,7 @@ inputs:
runs: runs:
using: composite using: composite
steps: steps:
- name: Cache Swift Packages - name: Xcode Cache
uses: actions/cache@v3 uses: actions/cache@v3
with: with:
path: | path: |

View file

@ -1,4 +1,4 @@
name: Notarize name: Export
inputs: inputs:
app-store-key: app-store-key:
description: App Store key in PEM PKCS#8 format description: App Store key in PEM PKCS#8 format
@ -24,8 +24,7 @@ inputs:
runs: runs:
using: composite using: composite
steps: steps:
- id: notarize - shell: bash
shell: bash
working-directory: Apple working-directory: Apple
run: | run: |
echo "${{ inputs.app-store-key }}" > AuthKey_${{ inputs.app-store-key-id }}.p8 echo "${{ inputs.app-store-key }}" > AuthKey_${{ inputs.app-store-key-id }}.p8

58
.github/actions/notarize/action.yml vendored Normal file
View file

@ -0,0 +1,58 @@
name: Notarize
inputs:
app-store-key:
description: App Store key in PEM PKCS#8 format
required: true
app-store-key-id:
description: App Store key ID
required: true
app-store-key-issuer-id:
description: App Store key issuer ID
required: true
archive-path:
description: Xcode archive path
required: true
export-path:
description: The path to export the archive to
required: true
outputs:
notarized-app:
description: The compressed and notarized app
value: ${{ steps.notarize.outputs.notarized-app }}
runs:
using: composite
steps:
- id: notarize
shell: bash
working-directory: Apple
run: |
echo "${{ inputs.app-store-key }}" > AuthKey_${{ inputs.app-store-key-id }}.p8
echo '{"destination":"upload","method":"developer-id"}' \
| plutil -convert xml1 -o ExportOptions.plist -
xcodebuild \
-exportArchive \
-allowProvisioningUpdates \
-allowProvisioningDeviceRegistration \
-authenticationKeyID ${{ inputs.app-store-key-id }} \
-authenticationKeyIssuerID ${{ inputs.app-store-key-issuer-id }} \
-authenticationKeyPath "${PWD}/AuthKey_${{ inputs.app-store-key-id }}.p8" \
-archivePath '${{ inputs.archive-path }}' \
-exportOptionsPlist ExportOptions.plist
until xcodebuild \
-exportNotarizedApp \
-allowProvisioningUpdates \
-allowProvisioningDeviceRegistration \
-authenticationKeyID ${{ inputs.app-store-key-id }} \
-authenticationKeyIssuerID ${{ inputs.app-store-key-issuer-id }} \
-authenticationKeyPath "${PWD}/AuthKey_${{ inputs.app-store-key-id }}.p8" \
-archivePath '${{ inputs.archive-path }}' \
-exportPath ${{ inputs.export-path }}
do
echo "Failed to export app, trying again in 10s..."
sleep 10
done
rm -rf AuthKey_${{ inputs.app-store-key-id }}.p8 ExportOptions.plist

View file

@ -18,9 +18,6 @@ inputs:
runs: runs:
using: composite using: composite
steps: steps:
- shell: bash
id: vars
run: echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
- shell: bash - shell: bash
working-directory: Apple working-directory: Apple
run: | run: |
@ -28,10 +25,10 @@ runs:
-scheme '${{ inputs.scheme }}' \ -scheme '${{ inputs.scheme }}' \
-destination '${{ inputs.destination }}' \ -destination '${{ inputs.destination }}' \
${{ inputs.test-plan && '-testPlan ' }}${{ inputs.test-plan }} \ ${{ inputs.test-plan && '-testPlan ' }}${{ inputs.test-plan }} \
-resultBundlePath "${{ inputs.artifact-prefix }}-${{ steps.vars.outputs.sha_short }}.xcresult" -resultBundlePath "${{ inputs.artifact-prefix }}.xcresult"
- uses: kishikawakatsumi/xcresulttool@v1 - uses: kishikawakatsumi/xcresulttool@v1
if: always() if: always()
with: with:
path: Apple/${{ inputs.artifact-prefix }}-${{ steps.vars.outputs.sha_short }}.xcresult path: Apple/${{ inputs.artifact-prefix }}.xcresult
title: ${{ inputs.check-name }} title: ${{ inputs.check-name }}
show-passed-tests: false show-passed-tests: false

View file

@ -1,8 +1,11 @@
name: Build AppImage name: Build AppImage
on: on:
push: push:
branches: [main] branches:
- main
pull_request: pull_request:
branches:
- "*"
jobs: jobs:
appimage: appimage:
name: Build AppImage name: Build AppImage
@ -17,7 +20,7 @@ jobs:
docker cp temp:/app/burrow-gtk/build-appimage/Burrow-x86_64.AppImage . docker cp temp:/app/burrow-gtk/build-appimage/Burrow-x86_64.AppImage .
docker rm temp docker rm temp
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
name: Upload to GitHub
with: with:
name: AppImage name: AppImage
path: Burrow-x86_64.AppImage path: Burrow-x86_64.AppImage

View file

@ -1,4 +1,4 @@
name: Apple Build name: Build Apple Apps
on: on:
push: push:
branches: branches:
@ -12,7 +12,7 @@ concurrency:
jobs: jobs:
build: build:
name: Build App (${{ matrix.platform }}) name: Build App (${{ matrix.platform }})
runs-on: macos-13 runs-on: macos-14
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
@ -53,7 +53,6 @@ jobs:
- name: Install Rust - name: Install Rust
uses: dtolnay/rust-toolchain@stable uses: dtolnay/rust-toolchain@stable
with: with:
toolchain: stable
targets: ${{ join(matrix.rust-targets, ', ') }} targets: ${{ join(matrix.rust-targets, ', ') }}
- name: Build - name: Build
id: build id: build
@ -64,7 +63,7 @@ jobs:
app-store-key: ${{ secrets.APPSTORE_KEY }} app-store-key: ${{ secrets.APPSTORE_KEY }}
app-store-key-id: ${{ secrets.APPSTORE_KEY_ID }} app-store-key-id: ${{ secrets.APPSTORE_KEY_ID }}
app-store-key-issuer-id: ${{ secrets.APPSTORE_KEY_ISSUER_ID }} app-store-key-issuer-id: ${{ secrets.APPSTORE_KEY_ISSUER_ID }}
- name: Xcode Unit Test - name: Run Unit Tests
if: ${{ matrix.xcode-unit-test != '' }} if: ${{ matrix.xcode-unit-test != '' }}
continue-on-error: true continue-on-error: true
uses: ./.github/actions/test-without-building uses: ./.github/actions/test-without-building
@ -74,7 +73,7 @@ jobs:
test-plan: ${{ matrix.xcode-unit-test }} test-plan: ${{ matrix.xcode-unit-test }}
artifact-prefix: unit-tests-${{ matrix.sdk-name }} artifact-prefix: unit-tests-${{ matrix.sdk-name }}
check-name: Xcode Unit Tests (${{ matrix.platform }}) check-name: Xcode Unit Tests (${{ matrix.platform }})
- name: Xcode UI Test - name: Run UI Tests
if: ${{ matrix.xcode-ui-test != '' }} if: ${{ matrix.xcode-ui-test != '' }}
continue-on-error: true continue-on-error: true
uses: ./.github/actions/test-without-building uses: ./.github/actions/test-without-building

View file

@ -33,6 +33,7 @@ jobs:
images: ghcr.io/${{ github.repository }} images: ghcr.io/${{ github.repository }}
tags: | tags: |
type=sha type=sha
type=match,pattern=builds/(.*),group=1
type=raw,value=latest,enable={{is_default_branch}} type=raw,value=latest,enable={{is_default_branch}}
- name: Build and Push - name: Build and Push
uses: docker/build-push-action@v4 uses: docker/build-push-action@v4

View file

@ -1,10 +1,5 @@
on: workflow_dispatch
name: Build RPM name: Build RPM
on:
push:
branches: [ "main" ]
pull_request:
branches:
- "*"
jobs: jobs:
build: build:
name: Build RPM name: Build RPM
@ -20,4 +15,3 @@ jobs:
strip -s target/release/burrow strip -s target/release/burrow
- name: Build RPM - name: Build RPM
run: cargo generate-rpm -p burrow run: cargo generate-rpm -p burrow

View file

@ -1,4 +1,4 @@
name: Rust Build name: Build Rust Crate
on: on:
push: push:
branches: branches:

View file

@ -8,13 +8,14 @@ jobs:
name: Git Lint name: Git Lint
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - name: Checkout
with: uses: actions/checkout@v4
ref: ${{ github.event.pull_request.head.sha }} with:
fetch-depth: 0 ref: ${{ github.event.pull_request.head.sha }}
- name: Install Gitlint fetch-depth: 0
shell: bash - name: Install
run: python -m pip install gitlint shell: bash
- name: Run Gitlint run: python -m pip install gitlint
shell: bash - name: Lint
run: gitlint --commits "${{ github.event.pull_request.base.sha }}..HEAD" shell: bash
run: gitlint --commits "${{ github.event.pull_request.base.sha }}..HEAD"

View file

@ -1,8 +1,5 @@
name: Swift Lint name: Swift Lint
on: on:
push:
branches:
- main
pull_request: pull_request:
branches: branches:
- "*" - "*"
@ -14,8 +11,6 @@ jobs:
image: ghcr.io/realm/swiftlint:latest image: ghcr.io/realm/swiftlint:latest
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v4
with:
ssh-key: ${{ secrets.DEPLOY_KEY }}
- name: Lint - name: Lint
run: swiftlint lint --reporter github-actions-logging run: swiftlint lint --reporter github-actions-logging

29
.github/workflows/release-appimage.yml vendored Normal file
View file

@ -0,0 +1,29 @@
name: Release (AppImage)
on:
release:
types:
- created
jobs:
appimage:
name: Build AppImage
runs-on: ubuntu-latest
container: docker
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Build
run: |
docker build -t appimage-builder . -f burrow-gtk/build-aux/Dockerfile
docker create --name temp appimage-builder
docker cp temp:/app/burrow-gtk/build-appimage/Burrow-x86_64.AppImage .
docker rm temp
- name: Upload to GitHub
uses: SierraSoftworks/gh-releases@v1.0.7
with:
token: ${{ secrets.GITHUB_TOKEN }}
release_tag: ${{ github.ref_name }}
overwrite: 'true'
files: |
Burrow-x86_64.AppImage

View file

@ -1,65 +1,115 @@
name: Build Apple Release name: Release (Apple)
on: on:
release: release:
types: types:
- created - created
jobs: jobs:
build: build:
name: Build ${{ matrix.configuration['platform'] }} Release name: Build ${{ matrix.platform }} Release
runs-on: macos-13 runs-on: macos-14
permissions:
contents: write
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
configuration: include:
- scheme: App (iOS) - destination: generic/platform=iOS
destination: generic/platform=iOS
platform: iOS platform: iOS
method: ad-hoc rust-targets:
artifact-file: Apple/Release/Burrow.ipa - aarch64-apple-ios
- scheme: App (macOS) - destination: generic/platform=macOS
destination: generic/platform=macOS
platform: macOS platform: macOS
method: mac-application rust-targets:
artifact-file: Burrow.app.txz - x86_64-apple-darwin
- aarch64-apple-darwin
env: env:
DEVELOPER_DIR: /Applications/Xcode_15.2.app/Contents/Developer DEVELOPER_DIR: /Applications/Xcode_15.2.app/Contents/Developer
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v4
with: with:
ssh-key: ${{ secrets.DEPLOY_KEY }} fetch-depth: 0
submodules: recursive
- name: Import Certificate - name: Import Certificate
uses: ./.github/actions/import-cert uses: ./.github/actions/import-cert
with: with:
certificate: ${{ secrets.DEVELOPER_CERT }} certificate: ${{ secrets.DEVELOPER_CERT }}
password: ${{ secrets.DEVELOPER_CERT_PASSWORD }} password: ${{ secrets.DEVELOPER_CERT_PASSWORD }}
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ join(matrix.rust-targets, ', ') }}
- name: Configure Version
shell: bash
run: Tools/version.sh
- name: Archive - name: Archive
uses: ./.github/actions/archive uses: ./.github/actions/archive
with: with:
scheme: ${{ matrix.configuration['scheme'] }} scheme: App
destination: ${{ matrix.configuration['destination'] }} destination: ${{ matrix.destination }}
app-store-key: ${{ secrets.APPSTORE_KEY }} app-store-key: ${{ secrets.APPSTORE_KEY }}
app-store-key-id: ${{ secrets.APPSTORE_KEY_ID }} app-store-key-id: ${{ secrets.APPSTORE_KEY_ID }}
app-store-key-issuer-id: ${{ secrets.APPSTORE_KEY_ISSUER_ID }} app-store-key-issuer-id: ${{ secrets.APPSTORE_KEY_ISSUER_ID }}
archive-path: Burrow.xcarchive archive-path: Burrow.xcarchive
- name: Export Locally - name: Notarize (macOS)
if: ${{ matrix.platform == 'macOS' }}
uses: ./.github/actions/notarize
with:
app-store-key: ${{ secrets.APPSTORE_KEY }}
app-store-key-id: ${{ secrets.APPSTORE_KEY_ID }}
app-store-key-issuer-id: ${{ secrets.APPSTORE_KEY_ISSUER_ID }}
archive-path: Burrow.xcarchive
- name: Export IPA (iOS)
if: ${{ matrix.platform == 'iOS' }}
uses: ./.github/actions/export uses: ./.github/actions/export
with: with:
method: ${{ matrix.configuration['method'] }} method: ad-hoc
destination: export destination: export
app-store-key: ${{ secrets.APPSTORE_KEY }} app-store-key: ${{ secrets.APPSTORE_KEY }}
app-store-key-id: ${{ secrets.APPSTORE_KEY_ID }} app-store-key-id: ${{ secrets.APPSTORE_KEY_ID }}
app-store-key-issuer-id: ${{ secrets.APPSTORE_KEY_ISSUER_ID }} app-store-key-issuer-id: ${{ secrets.APPSTORE_KEY_ISSUER_ID }}
archive-path: Burrow.xcarchive archive-path: Burrow.xcarchive
export-path: Release export-path: Release
- name: Compress - name: Compress (iOS)
if: ${{ matrix.configuration['platform'] == 'macOS' }} if: ${{ matrix.platform == 'iOS' }}
shell: bash shell: bash
run: tar --options xz:compression-level=9 -C Apple/Release -cJf Burrow.app.txz ./ run: |
- name: Attach Artifact cp Apple/Release/Burrow.ipa Burrow.ipa
uses: SierraSoftworks/gh-releases@v1.0.6 aa archive -a lzma -b 8m -d Apple -subdir Burrow.xcarchive -o Burrow-${{ matrix.platform }}.xcarchive.aar
rm -rf Apple/Release
- name: Compress (macOS)
if: ${{ matrix.platform == 'macOS' }}
shell: bash
run: |
aa archive -a lzma -b 8m -d Apple/Release -subdir Burrow.app -o Burrow.app.aar
aa archive -a lzma -b 8m -d Apple -subdir Burrow.xcarchive -o Burrow-${{ matrix.platform }}.xcarchive.aar
rm -rf Apple/Release
- name: Upload to GitHub (iOS)
if: ${{ matrix.platform == 'iOS' }}
uses: SierraSoftworks/gh-releases@v1.0.7
with: with:
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.GITHUB_TOKEN }}
overwrite: 'false' release_tag: ${{ github.ref_name }}
files: ${{ matrix.configuration['artifact-file'] }} overwrite: 'true'
files: |
Burrow.ipa
Burrow-${{ matrix.platform }}.xcarchive.aar
- name: Upload to GitHub (macOS)
if: ${{ matrix.platform == 'macOS' }}
uses: SierraSoftworks/gh-releases@v1.0.7
with:
token: ${{ secrets.GITHUB_TOKEN }}
release_tag: ${{ github.ref_name }}
overwrite: 'true'
files: |
Burrow.aap.aar
Burrow-${{ matrix.platform }}.xcarchive.aar
- name: Upload to App Store Connect
uses: ./.github/actions/export
with:
method: app-store
destination: upload
app-store-key: ${{ secrets.APPSTORE_KEY }}
app-store-key-id: ${{ secrets.APPSTORE_KEY_ID }}
app-store-key-issuer-id: ${{ secrets.APPSTORE_KEY_ISSUER_ID }}
archive-path: Burrow.xcarchive
export-path: Release

View file

@ -0,0 +1,21 @@
name: Create Release If Needed
on:
workflow_dispatch:
schedule:
- cron: '0 10 * * *'
concurrency:
group: ${{ github.workflow }}
jobs:
create:
name: Create Release If Needed
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- shell: bash
run: |
if [[ $(Tools/version.sh status) == "dirty" ]]; then
gh workflow run release-now.yml
fi

17
.github/workflows/release-now.yml vendored Normal file
View file

@ -0,0 +1,17 @@
name: Create Release
on: workflow_dispatch
concurrency:
group: ${{ github.workflow }}
jobs:
create:
env:
GH_TOKEN: ${{ secrets.GH_RELEASE_TOKEN }}
name: Create Release
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- shell: bash
run: Tools/version.sh increment

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 684 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 927 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

View file

@ -1,59 +1,340 @@
{ {
"images" : [ "images" : [
{ {
"idiom" : "universal", "filename" : "40.png",
"platform" : "ios", "idiom" : "iphone",
"scale" : "2x",
"size" : "20x20"
},
{
"filename" : "60.png",
"idiom" : "iphone",
"scale" : "3x",
"size" : "20x20"
},
{
"filename" : "29.png",
"idiom" : "iphone",
"scale" : "1x",
"size" : "29x29"
},
{
"filename" : "58.png",
"idiom" : "iphone",
"scale" : "2x",
"size" : "29x29"
},
{
"filename" : "87.png",
"idiom" : "iphone",
"scale" : "3x",
"size" : "29x29"
},
{
"filename" : "80.png",
"idiom" : "iphone",
"scale" : "2x",
"size" : "40x40"
},
{
"filename" : "120.png",
"idiom" : "iphone",
"scale" : "3x",
"size" : "40x40"
},
{
"filename" : "57.png",
"idiom" : "iphone",
"scale" : "1x",
"size" : "57x57"
},
{
"filename" : "114.png",
"idiom" : "iphone",
"scale" : "2x",
"size" : "57x57"
},
{
"filename" : "120.png",
"idiom" : "iphone",
"scale" : "2x",
"size" : "60x60"
},
{
"filename" : "180.png",
"idiom" : "iphone",
"scale" : "3x",
"size" : "60x60"
},
{
"filename" : "20.png",
"idiom" : "ipad",
"scale" : "1x",
"size" : "20x20"
},
{
"filename" : "40.png",
"idiom" : "ipad",
"scale" : "2x",
"size" : "20x20"
},
{
"filename" : "29.png",
"idiom" : "ipad",
"scale" : "1x",
"size" : "29x29"
},
{
"filename" : "58.png",
"idiom" : "ipad",
"scale" : "2x",
"size" : "29x29"
},
{
"filename" : "40.png",
"idiom" : "ipad",
"scale" : "1x",
"size" : "40x40"
},
{
"filename" : "80.png",
"idiom" : "ipad",
"scale" : "2x",
"size" : "40x40"
},
{
"filename" : "50.png",
"idiom" : "ipad",
"scale" : "1x",
"size" : "50x50"
},
{
"filename" : "100.png",
"idiom" : "ipad",
"scale" : "2x",
"size" : "50x50"
},
{
"filename" : "72.png",
"idiom" : "ipad",
"scale" : "1x",
"size" : "72x72"
},
{
"filename" : "144.png",
"idiom" : "ipad",
"scale" : "2x",
"size" : "72x72"
},
{
"filename" : "76.png",
"idiom" : "ipad",
"scale" : "1x",
"size" : "76x76"
},
{
"filename" : "152.png",
"idiom" : "ipad",
"scale" : "2x",
"size" : "76x76"
},
{
"filename" : "167.png",
"idiom" : "ipad",
"scale" : "2x",
"size" : "83.5x83.5"
},
{
"filename" : "1024.png",
"idiom" : "ios-marketing",
"scale" : "1x",
"size" : "1024x1024" "size" : "1024x1024"
}, },
{ {
"filename" : "16.png",
"idiom" : "mac", "idiom" : "mac",
"scale" : "1x", "scale" : "1x",
"size" : "16x16" "size" : "16x16"
}, },
{ {
"filename" : "32.png",
"idiom" : "mac", "idiom" : "mac",
"scale" : "2x", "scale" : "2x",
"size" : "16x16" "size" : "16x16"
}, },
{ {
"filename" : "32.png",
"idiom" : "mac", "idiom" : "mac",
"scale" : "1x", "scale" : "1x",
"size" : "32x32" "size" : "32x32"
}, },
{ {
"filename" : "64.png",
"idiom" : "mac", "idiom" : "mac",
"scale" : "2x", "scale" : "2x",
"size" : "32x32" "size" : "32x32"
}, },
{ {
"filename" : "128.png",
"idiom" : "mac", "idiom" : "mac",
"scale" : "1x", "scale" : "1x",
"size" : "128x128" "size" : "128x128"
}, },
{ {
"filename" : "256.png",
"idiom" : "mac", "idiom" : "mac",
"scale" : "2x", "scale" : "2x",
"size" : "128x128" "size" : "128x128"
}, },
{ {
"filename" : "256.png",
"idiom" : "mac", "idiom" : "mac",
"scale" : "1x", "scale" : "1x",
"size" : "256x256" "size" : "256x256"
}, },
{ {
"filename" : "512.png",
"idiom" : "mac", "idiom" : "mac",
"scale" : "2x", "scale" : "2x",
"size" : "256x256" "size" : "256x256"
}, },
{ {
"filename" : "512.png",
"idiom" : "mac", "idiom" : "mac",
"scale" : "1x", "scale" : "1x",
"size" : "512x512" "size" : "512x512"
}, },
{ {
"filename" : "1024.png",
"idiom" : "mac", "idiom" : "mac",
"scale" : "2x", "scale" : "2x",
"size" : "512x512" "size" : "512x512"
},
{
"filename" : "48.png",
"idiom" : "watch",
"role" : "notificationCenter",
"scale" : "2x",
"size" : "24x24",
"subtype" : "38mm"
},
{
"filename" : "55.png",
"idiom" : "watch",
"role" : "notificationCenter",
"scale" : "2x",
"size" : "27.5x27.5",
"subtype" : "42mm"
},
{
"filename" : "58.png",
"idiom" : "watch",
"role" : "companionSettings",
"scale" : "2x",
"size" : "29x29"
},
{
"filename" : "87.png",
"idiom" : "watch",
"role" : "companionSettings",
"scale" : "3x",
"size" : "29x29"
},
{
"idiom" : "watch",
"role" : "notificationCenter",
"scale" : "2x",
"size" : "33x33",
"subtype" : "45mm"
},
{
"filename" : "80.png",
"idiom" : "watch",
"role" : "appLauncher",
"scale" : "2x",
"size" : "40x40",
"subtype" : "38mm"
},
{
"filename" : "88.png",
"idiom" : "watch",
"role" : "appLauncher",
"scale" : "2x",
"size" : "44x44",
"subtype" : "40mm"
},
{
"idiom" : "watch",
"role" : "appLauncher",
"scale" : "2x",
"size" : "46x46",
"subtype" : "41mm"
},
{
"filename" : "100.png",
"idiom" : "watch",
"role" : "appLauncher",
"scale" : "2x",
"size" : "50x50",
"subtype" : "44mm"
},
{
"idiom" : "watch",
"role" : "appLauncher",
"scale" : "2x",
"size" : "51x51",
"subtype" : "45mm"
},
{
"idiom" : "watch",
"role" : "appLauncher",
"scale" : "2x",
"size" : "54x54",
"subtype" : "49mm"
},
{
"filename" : "172.png",
"idiom" : "watch",
"role" : "quickLook",
"scale" : "2x",
"size" : "86x86",
"subtype" : "38mm"
},
{
"filename" : "196.png",
"idiom" : "watch",
"role" : "quickLook",
"scale" : "2x",
"size" : "98x98",
"subtype" : "42mm"
},
{
"filename" : "216.png",
"idiom" : "watch",
"role" : "quickLook",
"scale" : "2x",
"size" : "108x108",
"subtype" : "44mm"
},
{
"idiom" : "watch",
"role" : "quickLook",
"scale" : "2x",
"size" : "117x117",
"subtype" : "45mm"
},
{
"idiom" : "watch",
"role" : "quickLook",
"scale" : "2x",
"size" : "129x129",
"subtype" : "49mm"
},
{
"filename" : "1024.png",
"idiom" : "watch-marketing",
"scale" : "1x",
"size" : "1024x1024"
} }
], ],
"info" : { "info" : {

View file

@ -30,7 +30,6 @@
D0BCC5FD2A086D4700AD070D /* NetworkExtension+Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BCC5FC2A086D4700AD070D /* NetworkExtension+Async.swift */; }; D0BCC5FD2A086D4700AD070D /* NetworkExtension+Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BCC5FC2A086D4700AD070D /* NetworkExtension+Async.swift */; };
D0BCC6082A0981FE00AD070D /* Tunnel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B98FC629FDC5B5004E7149 /* Tunnel.swift */; }; D0BCC6082A0981FE00AD070D /* Tunnel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B98FC629FDC5B5004E7149 /* Tunnel.swift */; };
D0BCC6092A09A03E00AD070D /* libburrow.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D0BCC6032A09535900AD070D /* libburrow.a */; }; D0BCC6092A09A03E00AD070D /* libburrow.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D0BCC6032A09535900AD070D /* libburrow.a */; };
D0BCC60A2A09A0B800AD070D /* build-rust.sh in Resources */ = {isa = PBXBuildFile; fileRef = D0B98FBF29FD8072004E7149 /* build-rust.sh */; };
D0FAB5922B818A5900F6A84B /* NetworkExtensionTunnel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0FAB5912B818A5900F6A84B /* NetworkExtensionTunnel.swift */; }; D0FAB5922B818A5900F6A84B /* NetworkExtensionTunnel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0FAB5912B818A5900F6A84B /* NetworkExtensionTunnel.swift */; };
D0FAB5962B818B2900F6A84B /* TunnelButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0FAB5952B818B2900F6A84B /* TunnelButton.swift */; }; D0FAB5962B818B2900F6A84B /* TunnelButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0FAB5952B818B2900F6A84B /* TunnelButton.swift */; };
D0FAB5982B818B8200F6A84B /* TunnelStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0FAB5972B818B8200F6A84B /* TunnelStatusView.swift */; }; D0FAB5982B818B8200F6A84B /* TunnelStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0FAB5972B818B8200F6A84B /* TunnelStatusView.swift */; };
@ -103,6 +102,7 @@
D020F66929E4AA74002790F6 /* App-macOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "App-macOS.entitlements"; sourceTree = "<group>"; }; D020F66929E4AA74002790F6 /* App-macOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "App-macOS.entitlements"; sourceTree = "<group>"; };
D032E6512B8A79C20006B8AD /* HackClub.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HackClub.swift; sourceTree = "<group>"; }; D032E6512B8A79C20006B8AD /* HackClub.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HackClub.swift; sourceTree = "<group>"; };
D032E6532B8A79DA0006B8AD /* WireGuard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WireGuard.swift; sourceTree = "<group>"; }; D032E6532B8A79DA0006B8AD /* WireGuard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WireGuard.swift; sourceTree = "<group>"; };
D04A3E1D2BAF465F0043EC85 /* Version.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Version.xcconfig; sourceTree = "<group>"; };
D05B9F7229E39EEC008CB1F9 /* Burrow.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Burrow.app; sourceTree = BUILT_PRODUCTS_DIR; }; D05B9F7229E39EEC008CB1F9 /* Burrow.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Burrow.app; sourceTree = BUILT_PRODUCTS_DIR; };
D05B9F7529E39EEC008CB1F9 /* BurrowApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BurrowApp.swift; sourceTree = "<group>"; }; D05B9F7529E39EEC008CB1F9 /* BurrowApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BurrowApp.swift; sourceTree = "<group>"; };
D05B9F7729E39EEC008CB1F9 /* BurrowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BurrowView.swift; sourceTree = "<group>"; }; D05B9F7729E39EEC008CB1F9 /* BurrowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BurrowView.swift; sourceTree = "<group>"; };
@ -185,6 +185,7 @@
D020F64A29E4A452002790F6 /* App.xcconfig */, D020F64A29E4A452002790F6 /* App.xcconfig */,
D020F66329E4A703002790F6 /* Extension.xcconfig */, D020F66329E4A703002790F6 /* Extension.xcconfig */,
D020F64029E4A1FF002790F6 /* Compiler.xcconfig */, D020F64029E4A1FF002790F6 /* Compiler.xcconfig */,
D04A3E1D2BAF465F0043EC85 /* Version.xcconfig */,
D020F64229E4A1FF002790F6 /* Info.plist */, D020F64229E4A1FF002790F6 /* Info.plist */,
); );
path = Configuration; path = Configuration;
@ -318,6 +319,7 @@
isa = PBXNativeTarget; isa = PBXNativeTarget;
buildConfigurationList = D05B9F8129E39EED008CB1F9 /* Build configuration list for PBXNativeTarget "App" */; buildConfigurationList = D05B9F8129E39EED008CB1F9 /* Build configuration list for PBXNativeTarget "App" */;
buildPhases = ( buildPhases = (
D04A3E232BAF4AE50043EC85 /* Update Build Number */,
D05B9F6E29E39EEC008CB1F9 /* Sources */, D05B9F6E29E39EEC008CB1F9 /* Sources */,
D05B9F6F29E39EEC008CB1F9 /* Frameworks */, D05B9F6F29E39EEC008CB1F9 /* Frameworks */,
D05B9F7029E39EEC008CB1F9 /* Resources */, D05B9F7029E39EEC008CB1F9 /* Resources */,
@ -384,7 +386,6 @@
isa = PBXResourcesBuildPhase; isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
D0BCC60A2A09A0B800AD070D /* build-rust.sh in Resources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -400,6 +401,27 @@
/* End PBXResourcesBuildPhase section */ /* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */
D04A3E232BAF4AE50043EC85 /* Update Build Number */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"$(PROJECT_DIR)/../Tools/version.sh",
"$(PROJECT_DIR)/../.git",
);
name = "Update Build Number";
outputFileListPaths = (
);
outputPaths = (
"$(PROJECT_DIR)/Configuration/Version.xcconfig",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"$PROJECT_DIR/../Tools/version.sh\"\n";
};
D0BCC60B2A09A0C100AD070D /* Compile Rust */ = { D0BCC60B2A09A0C100AD070D /* Compile Rust */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1; alwaysOutOfDate = 1;

View file

@ -1,4 +1,5 @@
#include "Identity.xcconfig" #include "Identity.xcconfig"
#include "Version.xcconfig"
SDKROOT = auto SDKROOT = auto
ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES
@ -12,7 +13,6 @@ SUPPORTS_MACCATALYST = NO
ALWAYS_SEARCH_USER_PATHS = NO ALWAYS_SEARCH_USER_PATHS = NO
PRODUCT_NAME = $(TARGET_NAME:c99extidentifier) PRODUCT_NAME = $(TARGET_NAME:c99extidentifier)
PRODUCT_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).$(PRODUCT_NAME) PRODUCT_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).$(PRODUCT_NAME)
CURRENT_PROJECT_VERSION = 1
MARKETING_VERSION = 0.1 MARKETING_VERSION = 0.1
SKIP_INSTALL = YES SKIP_INSTALL = YES

View file

51
Tools/version.sh Executable file
View file

@ -0,0 +1,51 @@
#!/bin/bash
export PATH="$PATH:/opt/homebrew/bin:/usr/local/bin:/etc/profiles/per-user/$USER/bin"
set -euo pipefail
cd "$(dirname "${BASH_SOURCE[0]}")"/..
TAG_PREFIX="builds/"
CURRENT_BUILD=$(git tag --points-at HEAD | tail -n 1)
LATEST_BUILD="$TAG_PREFIX$(git tag -l "builds/[0-9]*" | cut -d'/' -f 2 | sort -n | tail -n 1)"
CURRENT_BUILD_NUMBER=${CURRENT_BUILD#$TAG_PREFIX}
LATEST_BUILD_NUMBER=${LATEST_BUILD#$TAG_PREFIX}
if [[ -z $LATEST_BUILD_NUMBER ]]; then
LATEST_BUILD_NUMBER="0"
fi
if [[ ! -z $LATEST_BUILD && $(git merge-base --is-ancestor $LATEST_BUILD HEAD) -ne 0 ]]; then
echo "error: HEAD is not descended from build $LATEST_BUILD_NUMBER" >&2
exit 1
fi
BUILD_NUMBER=$LATEST_BUILD_NUMBER
if [[ $# -gt 0 && "$1" == "increment" ]]; then
NEW_BUILD_NUMBER=$((LATEST_BUILD_NUMBER + 1))
NEW_TAG="$TAG_PREFIX$NEW_BUILD_NUMBER"
BUILD_NUMBER=$NEW_BUILD_NUMBER
git tag $NEW_TAG
git push --quiet origin $NEW_TAG
gh release create "$NEW_TAG" -t "Build $BUILD_NUMBER" --verify-tag --generate-notes >/dev/null
fi
if [[ -z $(grep $BUILD_NUMBER Apple/Configuration/Version.xcconfig 2>/dev/null) ]]; then
echo "CURRENT_PROJECT_VERSION = $BUILD_NUMBER" > Apple/Configuration/Version.xcconfig
git update-index --assume-unchanged Apple/Configuration/Version.xcconfig
fi
if [[ $# -gt 0 && "$1" == "status" ]]; then
if [[ $CURRENT_BUILD_NUMBER -eq $LATEST_BUILD_NUMBER ]]; then
echo "clean"
else
echo "dirty"
fi
exit 0
fi
echo $BUILD_NUMBER