From a0dbc039acb25f18aace3162b69aa11eb7ca83d6 Mon Sep 17 00:00:00 2001 From: Adrian Castro <22133246+castdrian@users.noreply.github.com> Date: Thu, 8 May 2025 12:26:40 +0200 Subject: [PATCH] chore: close #8 (#16) * chore: add codeowners file * feat: yoink and modify my workflow * feat: use config file fro versioning * chore: move files because vsc is stupid * chore: move codeowners file * chore: swap out get next version action * fix: that might just work again like this, who knows * fix: see if this approach is saner * fix: bump some stuff and add empty view * fix: use xcode 16.2 * fix: zip app since we're not signing it * chore: fix this * fix: fix workflow * chore: adjust codeowners --- .github/CODEOWNERS | 1 + .github/dependabot.yml | 7 + .github/workflows/main.yml | 182 ++++++++++++++++++ iRPC.xcodeproj/project.pbxproj | 12 +- .../UserInterfaceState.xcuserstate | Bin 0 -> 22335 bytes .../xcschemes/xcschememanagement.plist | 14 ++ iRPC/Config.xcconfig | 12 ++ iRPC/iRPCApp.swift | 3 + 8 files changed, 227 insertions(+), 4 deletions(-) create mode 100644 .github/CODEOWNERS create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/main.yml create mode 100644 iRPC.xcodeproj/project.xcworkspace/xcuserdata/adrian.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 iRPC.xcodeproj/xcuserdata/adrian.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 iRPC/Config.xcconfig diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..c1eea37 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @thehairy \ No newline at end of file diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..9960204 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,7 @@ +version: 2 +updates: + + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..41e3920 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,182 @@ +name: Build and Release App + +on: + push: + branches: + - main + paths-ignore: + - '**/*.md' + - '**.github/workflows/*' + workflow_dispatch: + +permissions: + contents: write + # pages: write + # id-token: write + +# concurrency: +# group: "pages" +# cancel-in-progress: false + +jobs: + release: + runs-on: macos-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Xcode Select Version + uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: '16.2' + + # - name: Setup Certificate + # uses: apple-actions/import-codesign-certs@v2 + # with: + # p12-file-base64: ${{ secrets.P12_CERTIFICATE_BASE64 }} + # p12-password: ${{ secrets.P12_PASSWORD }} + + - name: Setup get-next-version + run: | + curl -L -o get-next-version https://github.com/thenativeweb/get-next-version/releases/download/2.6.3/get-next-version-darwin-arm64 + chmod a+x get-next-version + sudo mv get-next-version /usr/local/bin + + - name: Get Next Version + id: get_next_version + run: | + OUTPUT=$(get-next-version --target json) + NEXT_VERSION=$(echo $OUTPUT | jq -r '.version') + CURRENT_VERSION=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0") + echo "version=$NEXT_VERSION" >> $GITHUB_OUTPUT + echo "current_version=$CURRENT_VERSION" >> $GITHUB_OUTPUT + + - name: Bump version in Config.xcconfig + run: | + CURRENT_BUILD=$(grep BUILD_NUMBER iRPC/Config.xcconfig | cut -d ' ' -f 3) + NEW_BUILD=$((CURRENT_BUILD + 1)) + sed -i '' "s/BUILD_NUMBER = $CURRENT_BUILD/BUILD_NUMBER = $NEW_BUILD/" iRPC/Config.xcconfig + + CURRENT_VERSION=$(grep VERSION iRPC/Config.xcconfig | cut -d ' ' -f 3) + NEW_VERSION=${{ steps.get_next_version.outputs.version }} + sed -i '' "s/VERSION = $CURRENT_VERSION/VERSION = $NEW_VERSION/" iRPC/Config.xcconfig + + - name: Build Changelog + uses: dlavrenuek/conventional-changelog-action@v1.2.3 + id: changelog + with: + from: ${{ steps.get_next_version.outputs.current_version }} + to: HEAD + + - name: Write Changelog + run: echo "${{ steps.changelog.outputs.body }}" > RELEASE.md + + - name: Build macOS app + run: xcodebuild archive -scheme "iRPC" -configuration "Release" -archivePath "build/iRPC.xcarchive" -destination "generic/platform=macOS,name=Any Mac" CODE_SIGN_IDENTITY="" CODE_SIGNING_ALLOWED=NO "OTHER_SWIFT_FLAGS=${inherited} -D GITHUB_RELEASE" | xcbeautify + + # - name: Sign, Package and Notarize .app + # run: | + # cp -R "build/iRPC.xcarchive/Products/Applications/"*.app "build/iRPC.app" + # cd build + # codesign -s "Developer ID Application" -f --timestamp -o runtime --deep "iRPC.app/Contents/Frameworks/Sparkle.framework/Versions/B/XPCServices/Downloader.xpc/Contents/MacOS/Downloader" + # codesign -s "Developer ID Application" -f --timestamp -o runtime --deep "iRPC.app/Contents/Frameworks/Sparkle.framework/Versions/B/XPCServices/Installer.xpc/Contents/MacOS/Installer" + # codesign -s "Developer ID Application" -f --timestamp -o runtime --deep "iRPC.app/Contents/Frameworks/Sparkle.framework/Versions/B/Updater.app/Contents/MacOS/Updater" + # codesign -s "Developer ID Application" -f --timestamp -o runtime --deep "iRPC.app/Contents/Frameworks/Sparkle.framework/Versions/B/Autoupdate" + # codesign -s "Developer ID Application" -f --timestamp -o runtime --deep "iRPC.app/Contents/MacOS/iRPC" + # codesign -s "Developer ID Application" -f --timestamp -o runtime --deep "iRPC.app" + # npm install --global create-dmg + # create-dmg "iRPC.app" --overwrite + # mv *.dmg iRPC.dmg + # DMG_FILE="iRPC.dmg" + # echo "DMG_FILE=$DMG_FILE" >> $GITHUB_ENV + # xcrun notarytool submit "$DMG_FILE" --wait --apple-id "${{ secrets.NOTARIZATION_USERNAME }}" --password "${{ secrets.NOTARIZATION_PASSWORD }}" --team-id "L988J7YMK5" + # xcrun stapler staple "$DMG_FILE" + + # - name: Configure Sparkle + # run: | + # curl -L -o Sparkle-2.4.2.tar.xz https://github.com/sparkle-project/Sparkle/releases/download/2.4.2/Sparkle-2.4.2.tar.xz + # tar -xJf Sparkle-2.4.2.tar.xz + # mkdir update + # mv "./build/$DMG_FILE" update/ + # echo "${{ steps.changelog.outputs.body }}" > RELEASE.md + # chmod +x ./bin/generate_appcast + + # - name: Convert Markdown to HTML + # uses: jaywcjlove/markdown-to-html-cli@main + # with: + # source: RELEASE.md + # output: ./update/${DMG_FILE%.dmg}.html + # github-corners: false + + # - name: Generate appcast.xml + # run: echo "$EDDSA_PRIVATE_KEY" | ./bin/generate_appcast --ed-key-file - --link https://iRPCmac.app --embed-release-notes --download-url-prefix https://github.com/castdrian/iRPC/releases/latest/download/ update/ + # env: + # EDDSA_PRIVATE_KEY: ${{ secrets.EDDSA_PRIVATE_KEY }} + # ARCHIVES_SOURCE_DIR: . + + # - name: Archive appcast.xml as artifact + # uses: actions/upload-artifact@v4 + # with: + # name: appcast + # path: ./update/appcast.xml + + - name: Create App Archive + run: | + cp -R "build/iRPC.xcarchive/Products/Applications/"*.app "iRPC.app" + zip -r iRPC.zip iRPC.app + rm -rf iRPC.app + + - name: Commit & Push changes + uses: EndBug/add-and-commit@v9 + with: + add: 'iRPC/Config.xcconfig' + default_author: github_actions + fetch: false + message: 'Bump version [skip ci]' + push: true + + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ steps.get_next_version.outputs.version }} + body_path: RELEASE.md + files: iRPC.zip + fail_on_unmatched_files: true + token: ${{ env.GITHUB_TOKEN }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + # pages: + # environment: + # name: github-pages + # url: ${{ steps.deployment.outputs.page_url }} + # runs-on: ubuntu-latest + # needs: release + # steps: + # - name: Checkout + # uses: actions/checkout@v4 + + # - name: Download appcast.xml artifact + # uses: actions/download-artifact@v4 + # with: + # name: appcast + # path: ./ + + # - name: Setup Pages + # uses: actions/configure-pages@v3 + + # - name: Build with Jekyll + # uses: actions/jekyll-build-pages@v1 + # with: + # source: ./ + # destination: ./_site + + # - name: Upload artifact + # uses: actions/upload-pages-artifact@v3 + + # - name: Deploy to GitHub Pages + # id: deployment + # uses: actions/deploy-pages@v4 \ No newline at end of file diff --git a/iRPC.xcodeproj/project.pbxproj b/iRPC.xcodeproj/project.pbxproj index 15c3b39..4fbe5e5 100644 --- a/iRPC.xcodeproj/project.pbxproj +++ b/iRPC.xcodeproj/project.pbxproj @@ -260,13 +260,15 @@ }; F4BE1C3E2DC94AD6009B622C /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReferenceAnchor = F4BE1C332DC94AD5009B622C /* iRPC */; + baseConfigurationReferenceRelativePath = Config.xcconfig; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = iRPC/iRPC.entitlements; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = "$(BUILD_NUMBER)"; DEVELOPMENT_TEAM = F2VS4PRAT5; ENABLE_HARDENED_RUNTIME = YES; ENABLE_PREVIEWS = YES; @@ -278,7 +280,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = "$(VERSION)"; PRODUCT_BUNDLE_IDENTIFIER = dev.stabenow.iRPC; PRODUCT_NAME = "$(TARGET_NAME)"; REGISTER_APP_GROUPS = YES; @@ -289,13 +291,15 @@ }; F4BE1C3F2DC94AD6009B622C /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReferenceAnchor = F4BE1C332DC94AD5009B622C /* iRPC */; + baseConfigurationReferenceRelativePath = Config.xcconfig; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = iRPC/iRPC.entitlements; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = "$(BUILD_NUMBER)"; DEVELOPMENT_TEAM = F2VS4PRAT5; ENABLE_HARDENED_RUNTIME = YES; ENABLE_PREVIEWS = YES; @@ -307,7 +311,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = "$(VERSION)"; PRODUCT_BUNDLE_IDENTIFIER = dev.stabenow.iRPC; PRODUCT_NAME = "$(TARGET_NAME)"; REGISTER_APP_GROUPS = YES; diff --git a/iRPC.xcodeproj/project.xcworkspace/xcuserdata/adrian.xcuserdatad/UserInterfaceState.xcuserstate b/iRPC.xcodeproj/project.xcworkspace/xcuserdata/adrian.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..4a60fdffb5bd55b8ea5d517fe4522a3c0ac10a99 GIT binary patch literal 22335 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 + + + + SchemeUserState + + iRPC.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/iRPC/Config.xcconfig b/iRPC/Config.xcconfig new file mode 100644 index 0000000..623fbc7 --- /dev/null +++ b/iRPC/Config.xcconfig @@ -0,0 +1,12 @@ +// +// Config.xcconfig +// iRPC +// +// Created by Adrian Castro on 7/5/25. +// + +// Configuration settings file format documentation can be found at: +// https://developer.apple.com/documentation/xcode/adding-a-build-configuration-file-to-your-project + +BUILD_NUMBER = 1 +VERSION = 1.0.0 diff --git a/iRPC/iRPCApp.swift b/iRPC/iRPCApp.swift index b0eb333..34aad16 100644 --- a/iRPC/iRPCApp.swift +++ b/iRPC/iRPCApp.swift @@ -12,5 +12,8 @@ struct iRPCApp: App { @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate var body: some Scene { + WindowGroup { + EmptyView() + } } }