Build #86
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
--- | |
name: Build | |
on: | |
schedule: | |
- cron: '48 9 * * 4' | |
pull_request: | |
branches: | |
- "main" | |
push: | |
branches: | |
- "main" | |
paths-ignore: | |
- ".github/workflows/**" | |
workflow_dispatch: | |
inputs: {} | |
jobs: | |
cloc: | |
name: CLOC | |
runs-on: ubuntu-22.04 | |
steps: | |
- name: Checkout repo | |
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | |
- name: Set up CLOC | |
run: | | |
sudo apt-get update | |
sudo apt-get -y install cloc | |
- name: Print lines of code | |
run: cloc --vcs git --exclude-dir Resources,store,test,Properties --include-lang C#,XAML | |
setup: | |
name: Setup | |
runs-on: ubuntu-22.04 | |
outputs: | |
rc_branch_exists: ${{ steps.branch-check.outputs.rc_branch_exists }} | |
hotfix_branch_exists: ${{ steps.branch-check.outputs.hotfix_branch_exists }} | |
steps: | |
- name: Checkout repo | |
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | |
with: | |
submodules: 'true' | |
- name: Check if special branches exist | |
id: branch-check | |
run: | | |
if [[ $(git ls-remote --heads origin rc) ]]; then | |
echo "rc_branch_exists=1" >> $GITHUB_OUTPUT | |
else | |
echo "rc_branch_exists=0" >> $GITHUB_OUTPUT | |
fi | |
if [[ $(git ls-remote --heads origin hotfix-rc) ]]; then | |
echo "hotfix_branch_exists=1" >> $GITHUB_OUTPUT | |
else | |
echo "hotfix_branch_exists=0" >> $GITHUB_OUTPUT | |
fi | |
shell: bash | |
f-droid: | |
name: F-Droid Build | |
runs-on: windows-2022 | |
permissions: | |
checks: write | |
steps: | |
- name: Setup NuGet | |
uses: nuget/setup-nuget@296fd3ccf8528660c91106efefe2364482f86d6f # v1.2.0 | |
with: | |
nuget-version: 5.9.0 | |
- name: Setup Java 11 | |
uses: actions/setup-java@v3 | |
with: | |
distribution: 'microsoft' | |
java-version: '11' | |
- name: Set up .NET | |
uses: actions/setup-dotnet@3447fd6a9f9e57506b15f895c5b76d3b197dc7c2 # v3.2.0 | |
with: | |
dotnet-version: '3.1.x' | |
- name: Set up MSBuild | |
uses: microsoft/setup-msbuild@1ff57057b5cfdc39105cd07a01d78e9b0ea0c14c # v1.3.1 | |
- name: Setup Windows builder | |
run: choco install checksum --no-progress | |
- name: Work Around for broken Windows 2022 Runner Image | |
run: | | |
Set-Location "C:\Program Files (x86)\Microsoft Visual Studio\Installer\" | |
$InstallPath = "C:\Program Files\Microsoft Visual Studio\2022\Enterprise" | |
$componentsToAdd = @( | |
"Component.Xamarin" | |
) | |
[string]$workloadArgs = $componentsToAdd | ForEach-Object {" --add " + $_} | |
$Arguments = ('/c', "vs_installer.exe", 'modify', '--installPath', "`"$InstallPath`"",$workloadArgs, '--quiet', '--norestart', '--nocache') | |
$process = Start-Process -FilePath cmd.exe -ArgumentList $Arguments -Wait -PassThru -WindowStyle Hidden | |
if ($process.ExitCode -eq 0) | |
{ | |
Write-Host "components have been successfully added" | |
} | |
else | |
{ | |
Write-Host "components were not installed" | |
exit 1 | |
} | |
- name: Print environment | |
run: | | |
nuget help | grep Version | |
msbuild -version | |
dotnet --info | |
echo "GitHub ref: $GITHUB_REF" | |
echo "GitHub event: $GITHUB_EVENT" | |
- name: Checkout repo | |
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | |
- name: Decrypt secrets | |
env: | |
DECRYPT_FILE_PASSWORD: ${{ secrets.DECRYPT_FILE_PASSWORD }} | |
run: | | |
mkdir -p ~/secrets | |
gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ | |
--output ./src/Android/app_fdroid-keystore.jks ./.github/secrets/app_fdroid-keystore.jks.gpg | |
shell: bash | |
- name: Increment version | |
run: | | |
BUILD_NUMBER=$((3000 + $GITHUB_RUN_NUMBER)) | |
echo "########################################" | |
echo "##### Setting Version Code $BUILD_NUMBER" | |
echo "########################################" | |
sed -i "s/android:versionCode=\"1\"/android:versionCode=\"$BUILD_NUMBER\"/" \ | |
./src/Android/Properties/AndroidManifest.xml | |
shell: bash | |
- name: Clean for F-Droid | |
run: | | |
$androidPath = $($env:GITHUB_WORKSPACE + "/src/Android/Android.csproj"); | |
$appPath = $($env:GITHUB_WORKSPACE + "/src/App/App.csproj"); | |
$corePath = $($env:GITHUB_WORKSPACE + "/src/Core/Core.csproj"); | |
$androidManifest = $($env:GITHUB_WORKSPACE + "/src/Android/Properties/AndroidManifest.xml"); | |
Write-Output "########################################" | |
Write-Output "##### Clean Android and App" | |
Write-Output "########################################" | |
msbuild "$($androidPath)" "/t:Clean" "/p:Configuration=FDroid" | |
msbuild "$($appPath)" "/t:Clean" "/p:Configuration=FDroid" | |
Write-Output "########################################" | |
Write-Output "##### Backup project files" | |
Write-Output "########################################" | |
Copy-Item $androidManifest $($androidManifest + ".original"); | |
Copy-Item $androidPath $($androidPath + ".original"); | |
Copy-Item $appPath $($appPath + ".original"); | |
Write-Output "########################################" | |
Write-Output "##### Cleanup Android Manifest" | |
Write-Output "########################################" | |
$xml=New-Object XML; | |
$xml.Load($androidManifest); | |
$nsAndroid=New-Object System.Xml.XmlNamespaceManager($xml.NameTable); | |
$nsAndroid.AddNamespace("android", "http://schemas.android.com/apk/res/android"); | |
$xml.Save($androidManifest); | |
Write-Output "########################################" | |
Write-Output "##### Uninstall from Android.csproj" | |
Write-Output "########################################" | |
$xml=New-Object XML; | |
$xml.Load($androidPath); | |
$ns=New-Object System.Xml.XmlNamespaceManager($xml.NameTable); | |
$ns.AddNamespace("ns", $xml.DocumentElement.NamespaceURI); | |
$firebaseNode=$xml.SelectSingleNode(` | |
"/ns:Project/ns:ItemGroup/ns:PackageReference[@Include='Xamarin.Firebase.Messaging']", $ns); | |
$firebaseNode.ParentNode.RemoveChild($firebaseNode); | |
$daggerNode=$xml.SelectSingleNode(` | |
"/ns:Project/ns:ItemGroup/ns:PackageReference[@Include='Xamarin.Google.Dagger']", $ns); | |
$daggerNode.ParentNode.RemoveChild($daggerNode); | |
$safetyNetNode=$xml.SelectSingleNode(` | |
"/ns:Project/ns:ItemGroup/ns:PackageReference[@Include='Xamarin.GooglePlayServices.SafetyNet']", $ns); | |
$safetyNetNode.ParentNode.RemoveChild($safetyNetNode); | |
$xml.Save($androidPath); | |
Write-Output "########################################" | |
Write-Output "##### Uninstall from Core.csproj" | |
Write-Output "########################################" | |
$xml=New-Object XML; | |
$xml.Load($corePath); | |
$appCenterNode=$xml.SelectSingleNode("/Project/ItemGroup/PackageReference[@Include='Microsoft.AppCenter.Crashes']"); | |
$appCenterNode.ParentNode.RemoveChild($appCenterNode); | |
$xml.Save($corePath); | |
shell: pwsh | |
- name: Restore packages | |
run: nuget restore | |
- name: Restore tools | |
run: dotnet tool restore | |
shell: pwsh | |
- name: Verify Format | |
run: dotnet tool run dotnet-format --check | |
shell: pwsh | |
- name: Run Core tests | |
run: dotnet test test/Core.Test/Core.Test.csproj --logger "trx;LogFileName=test-results.trx" -c FDroid | |
shell: pwsh | |
- name: Report test results | |
uses: dorny/test-reporter@c9b3d0e2bd2a4e96aaf424dbaa31c46b42318226 # v1.6.0 | |
if: always() | |
with: | |
name: Test Results | |
path: "**/test-results.trx" | |
reporter: dotnet-trx | |
fail-on-error: true | |
- name: Build for F-Droid | |
run: | | |
$configuration = "FDroid"; | |
Write-Output "########################################" | |
Write-Output "##### Build $configuration Configuration" | |
Write-Output "########################################" | |
msbuild "$($env:GITHUB_WORKSPACE + "/src/Android/Android.csproj")" "/p:Configuration=$configuration" | |
shell: pwsh | |
- name: Sign for F-Droid | |
run: | | |
echo "::add-mask::${{ secrets.FDROID_KEYSTORE_PASSWORD }}" | |
echo "::add-mask::${{ secrets.FDROID_KEY_PASSWORD }}" | |
Write-Output "########################################" | |
Write-Output "##### Sign FDroid Configuration" | |
Write-Output "########################################" | |
msbuild /t:SignAndroidPackage /p:Configuration=FDroid /p:AndroidPackageFormat=apk /p:AndroidKeyStore=true /p:AndroidSigningKeyAlias=nibblewarden "/p:AndroidSigningKeyPass=${{ secrets.FDROID_KEY_PASSWORD }}" /p:AndroidSigningKeyStore=app_fdroid-keystore.jks "/p:AndroidSigningStorePass=${{ secrets.FDROID_KEYSTORE_PASSWORD }}" "$($env:GITHUB_WORKSPACE + "/src/Android/Android.csproj")" "/v:quiet" | |
Write-Output "########################################" | |
Write-Output "##### Copy FDroid apk to project root" | |
Write-Output "########################################" | |
$signedApkPath = $($env:GITHUB_WORKSPACE + "/src/Android/bin/FDroid/com.x8bit.bitwarden-Signed.apk"); | |
$signedApkDestPath = $($env:GITHUB_WORKSPACE + "/com.x8bit.bitwarden-fdroid.apk"); | |
Copy-Item $signedApkPath $signedApkDestPath | |
shell: pwsh | |
- name: Upload F-Droid .apk artifact | |
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 | |
with: | |
name: com.x8bit.bitwarden-fdroid.apk | |
path: ./com.x8bit.bitwarden-fdroid.apk | |
if-no-files-found: error | |
- name: Create checksum for F-Droid artifact | |
run: | | |
checksum -f="./com.x8bit.bitwarden-fdroid.apk" ` | |
-t sha256 | Out-File -Encoding ASCII ./bw-fdroid-apk-sha256.txt | |
- name: Upload F-Droid sha file | |
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 | |
with: | |
name: bw-fdroid-apk-sha256.txt | |
path: ./bw-fdroid-apk-sha256.txt | |
if-no-files-found: error | |
check-failures: | |
name: Check for failures | |
if: always() | |
runs-on: ubuntu-22.04 | |
needs: | |
- cloc | |
- f-droid | |
steps: | |
- name: Check if any job failed | |
if: | | |
(github.ref == 'refs/heads/main') | |
|| (github.ref == 'refs/heads/rc') | |
|| (github.ref == 'refs/heads/hotfix-rc') | |
env: | |
CLOC_STATUS: ${{ needs.cloc.result }} | |
F_DROID_STATUS: ${{ needs.f-droid.result }} | |
run: | | |
if [ "$CLOC_STATUS" = "failure" ]; then | |
exit 1 | |
elif [ "$F_DROID_STATUS" = "failure" ]; then | |
exit 1 | |
fi |