mirror of
https://github.com/bitwarden/android.git
synced 2026-05-09 05:20:24 -05:00
Compare commits
86 Commits
retro-agen
...
agalles/au
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5dedc37b07 | ||
|
|
34354b11e5 | ||
|
|
3ad1121d01 | ||
|
|
1ac697e84a | ||
|
|
27e45a0646 | ||
|
|
814e3d3cb9 | ||
|
|
fc4ec405da | ||
|
|
45ee744ace | ||
|
|
99dfd53747 | ||
|
|
12afc04e92 | ||
|
|
f73014f39e | ||
|
|
0cce938248 | ||
|
|
e7e94e9a81 | ||
|
|
21d8b24522 | ||
|
|
1128680ff2 | ||
|
|
21a810303c | ||
|
|
a08210414c | ||
|
|
90fcb747e5 | ||
|
|
bbade469c1 | ||
|
|
738f502a36 | ||
|
|
3f33f03459 | ||
|
|
f954e1637d | ||
|
|
64fb2ab341 | ||
|
|
08a04cf419 | ||
|
|
d770f43b82 | ||
|
|
ef18b502b8 | ||
|
|
aefee591e1 | ||
|
|
4d2f130f0a | ||
|
|
669fcc3448 | ||
|
|
47aaa79dc3 | ||
|
|
9249bed287 | ||
|
|
441da4e3f2 | ||
|
|
ffee7d6c8e | ||
|
|
b9e000e2ae | ||
|
|
f4bfeb5220 | ||
|
|
3dcacee3f4 | ||
|
|
0156309b79 | ||
|
|
9210d63775 | ||
|
|
7b385bb178 | ||
|
|
03b83b6e68 | ||
|
|
934d32d6ec | ||
|
|
6fd9fa9d23 | ||
|
|
b8a3d078f3 | ||
|
|
3e3743f77e | ||
|
|
af15eca966 | ||
|
|
592c548fcb | ||
|
|
fd647d88c8 | ||
|
|
c6be79d909 | ||
|
|
5717d5fe15 | ||
|
|
3420efc3c3 | ||
|
|
d2ce39b42e | ||
|
|
80f74e9aa3 | ||
|
|
a66c996143 | ||
|
|
b08b7c0b84 | ||
|
|
26fb8ebf6e | ||
|
|
b541599248 | ||
|
|
03907f8e36 | ||
|
|
563cd732b8 | ||
|
|
0823bfecc6 | ||
|
|
042e59fa5b | ||
|
|
b45d03ac22 | ||
|
|
28f4eb854f | ||
|
|
3a0744a047 | ||
|
|
3f54e1180b | ||
|
|
10299848c6 | ||
|
|
d005f98008 | ||
|
|
4acfb56df7 | ||
|
|
246c3e1768 | ||
|
|
d400b4fcc2 | ||
|
|
7434114d09 | ||
|
|
25cfc6d06f | ||
|
|
9de23fa205 | ||
|
|
0c077cb3fb | ||
|
|
3702dcad42 | ||
|
|
3e4c227b13 | ||
|
|
f9e822b03d | ||
|
|
ba3b7f7135 | ||
|
|
9fd6578083 | ||
|
|
f04bc7e2c3 | ||
|
|
8f7c98574f | ||
|
|
ad6b0bb560 | ||
|
|
7fe29198a2 | ||
|
|
b1ce52596f | ||
|
|
9e7cddd24f | ||
|
|
c05f6219a9 | ||
|
|
9deb39d745 |
136
.github/workflows/publish.yml
vendored
136
.github/workflows/publish.yml
vendored
@@ -1,14 +1,142 @@
|
||||
|
||||
name: Publish
|
||||
|
||||
run-name: "Promoting ${{ inputs.product }} ${{ inputs.version-code }} from ${{ inputs.track-from }} to ${{ inputs.track-target }}"
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
product:
|
||||
description: "Which app is being released."
|
||||
type: choice
|
||||
options:
|
||||
- Password Manager
|
||||
- Authenticator
|
||||
version-code:
|
||||
description: "Build number to promote to production."
|
||||
required: true
|
||||
type: number
|
||||
rollout-percentage:
|
||||
description: "Percentage of users who will receive this version update."
|
||||
required: true
|
||||
type: choice
|
||||
options:
|
||||
- 10%
|
||||
- 30%
|
||||
- 50%
|
||||
- 100%
|
||||
release-notes:
|
||||
description: "Change notes to be included with this release."
|
||||
type: string
|
||||
required: true
|
||||
track-from:
|
||||
description: "Track to promote from."
|
||||
type: string
|
||||
required: true
|
||||
default: "internal"
|
||||
track-target:
|
||||
description: "Track to promote to."
|
||||
type: string
|
||||
required: true
|
||||
default: "Fastlane Automation Testing Source"
|
||||
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
GITHUB_ACTION_RUN_URL: "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
packages: read
|
||||
|
||||
jobs:
|
||||
publish:
|
||||
promote:
|
||||
runs-on: ubuntu-24.04
|
||||
name: Promote build to Production in Play Store
|
||||
|
||||
steps:
|
||||
- name: TEST STEP
|
||||
run: exit 0
|
||||
- name: Display Options
|
||||
run: |
|
||||
echo "product: ${{ inputs.product }}"
|
||||
echo "version-code: ${{ inputs.version-code }}"
|
||||
echo "rollout-percentage: ${{ inputs.rollout-percentage }}"
|
||||
echo "release-notes: ${{ inputs.release-notes }}"
|
||||
echo "track-from: ${{ inputs.track-from }}"
|
||||
echo "track-target: ${{ inputs.track-target }}"
|
||||
|
||||
- name: Check out repo
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
|
||||
- name: Configure Ruby
|
||||
uses: ruby/setup-ruby@ca041f971d66735f3e5ff1e21cc13e2d51e7e535 # v1.233.0
|
||||
with:
|
||||
bundler-cache: true
|
||||
|
||||
- name: Install Fastlane
|
||||
run: |
|
||||
gem install bundler:2.2.27
|
||||
bundle config path vendor/bundle
|
||||
bundle install --jobs 4 --retry 3
|
||||
|
||||
- name: Log in to Azure
|
||||
uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0
|
||||
with:
|
||||
creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
|
||||
|
||||
- name: Retrieve secrets
|
||||
env:
|
||||
ACCOUNT_NAME: bitwardenci
|
||||
CONTAINER_NAME: mobile
|
||||
run: |
|
||||
mkdir -p ${{ github.workspace }}/secrets
|
||||
mkdir -p ${{ github.workspace }}/app/src/standardRelease
|
||||
|
||||
az storage blob download --account-name $ACCOUNT_NAME --container-name $CONTAINER_NAME \
|
||||
--name app_play-keystore.jks --file ${{ github.workspace }}/keystores/app_play-keystore.jks --output none
|
||||
az storage blob download --account-name $ACCOUNT_NAME --container-name $CONTAINER_NAME \
|
||||
--name app_upload-keystore.jks --file ${{ github.workspace }}/keystores/app_upload-keystore.jks --output none
|
||||
az storage blob download --account-name $ACCOUNT_NAME --container-name $CONTAINER_NAME \
|
||||
--name play_creds.json --file ${{ github.workspace }}/secrets/play_creds.json --output none
|
||||
az storage blob download --account-name $ACCOUNT_NAME --container-name $CONTAINER_NAME \
|
||||
--name app_beta_play-keystore.jks --file ${{ github.workspace }}/keystores/app_beta_play-keystore.jks --output none
|
||||
az storage blob download --account-name $ACCOUNT_NAME --container-name $CONTAINER_NAME \
|
||||
--name app_beta_upload-keystore.jks --file ${{ github.workspace }}/keystores/app_beta_upload-keystore.jks --output none
|
||||
az storage blob download --account-name $ACCOUNT_NAME --container-name $CONTAINER_NAME \
|
||||
--name google-services.json --file ${{ github.workspace }}/app/src/standardRelease/google-services.json --output none
|
||||
|
||||
- name: Format Release Notes
|
||||
run: |
|
||||
FORMATTED_MESSAGE="$( "${{ inputs.release-notes }}" | sed 's/ /\n/g')"
|
||||
echo "RELEASE_NOTES<<EOF" >> $GITHUB_ENV
|
||||
echo "$FORMATTED_MESSAGE" >> $GITHUB_ENV
|
||||
echo "EOF" >> $GITHUB_ENV
|
||||
|
||||
- name: Promote Play Store version to production
|
||||
env:
|
||||
PLAY_KEYSTORE_PASSWORD: ${{ secrets.PLAY_BETA_KEYSTORE_PASSWORD }}
|
||||
PLAY_KEY_PASSWORD: ${{ secrets.PLAY_BETA_KEY_PASSWORD }}
|
||||
VERSION_CODE: ${{ inputs.version-code }}
|
||||
ROLLOUT_PERCENTAGE: ${{ inputs.rollout-percentage }}
|
||||
PRODUCT: ${{ inputs.product }}
|
||||
TRACK_FROM: ${{ inputs.track-from }}
|
||||
TRACK_TARGET: ${{ inputs.track-target }}
|
||||
run: |
|
||||
if [ "$PRODUCT" = "Password Manager" ]; then
|
||||
PACKAGE_NAME="com.x8bit.bitwarden"
|
||||
elif [ "$PRODUCT" = "Authenticator" ]; then
|
||||
PACKAGE_NAME="com.bitwarden.authenticator"
|
||||
else
|
||||
echo "Unsupported product: $PRODUCT"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
decimal=$(echo "scale=2; ${ROLLOUT_PERCENTAGE/\%/} / 100" | bc)
|
||||
|
||||
bundle exec fastlane updateReleaseNotes \
|
||||
releaseNotes:"$RELEASE_NOTES" \
|
||||
versionCode:"$VERSION_CODE"
|
||||
|
||||
bundle exec fastlane promoteToProduction \
|
||||
versionCode:"$VERSION_CODE" \
|
||||
rolloutPercentage:$decimal \
|
||||
packageName:"$PACKAGE_NAME"\
|
||||
releaseNotes:"$RELEASE_NOTES"\
|
||||
track:"$TRACK_FROM"\
|
||||
trackPromoteTo:"$TRACK_TARGET"
|
||||
|
||||
@@ -13,6 +13,9 @@
|
||||
# Uncomment the line if you want fastlane to automatically update itself
|
||||
# update_fastlane
|
||||
|
||||
require_relative 'patches/supply_custom_promote_config'
|
||||
require_relative 'patches/supply_custom_promote'
|
||||
|
||||
default_platform(:android)
|
||||
|
||||
platform :android do
|
||||
@@ -384,4 +387,48 @@ platform :android do
|
||||
mapping: "authenticator/build/outputs/mapping/release/mapping.txt",
|
||||
)
|
||||
end
|
||||
|
||||
desc "Update release notes for all locales."
|
||||
lane :updateReleaseNotes do |options|
|
||||
changelog = options[:releaseNotes]
|
||||
version_code = options[:versionCode]
|
||||
changelog = "\"#{changelog}\"".undump # Replaces literal \n and \t with actual newlines and tabs
|
||||
UI.message("Changelog: #{changelog}")
|
||||
|
||||
auth_locales = ["en-US"]
|
||||
pw_manager_locales = ["ca", "cs-CZ", "da-DK", "de-DE", "en-US", "es-ES", "et", "fr-FR", "hr", "hu-HU", "id", "it-IT", "iw-IL", "ja-JP", "nl-NL", "pl-PL", "pt-BR", "pt-PT", "ro", "ru-RU", "sk", "sv-SE", "tr-TR", "uk", "vi", "zh-CN", "zh-TW"]
|
||||
if options[:packageName] == "com.bitwarden.authenticator"
|
||||
locales = auth_locales
|
||||
else
|
||||
locales = pw_manager_locales
|
||||
end
|
||||
locales.each do |locale|
|
||||
dir = "metadata/android/#{locale}/changelogs"
|
||||
FileUtils.mkdir_p(dir)
|
||||
File.write("#{dir}/#{version_code}.txt", changelog)
|
||||
end
|
||||
end
|
||||
|
||||
desc "Promote to production."
|
||||
lane :promoteToProduction do |options|
|
||||
supply_options = {
|
||||
package_name: options[:packageName],
|
||||
version_code: options[:versionCode],
|
||||
track: options[:track],
|
||||
track_promote_to: options[:trackPromoteTo],
|
||||
skip_release_verification: true,
|
||||
skip_upload_apk: true,
|
||||
skip_upload_aab: true,
|
||||
skip_upload_metadata: false
|
||||
}
|
||||
|
||||
if options[:rolloutPercentage].to_f < 1
|
||||
supply_options[:track_promote_release_status] = "inProgress"
|
||||
supply_options[:rollout] = options[:rolloutPercentage]
|
||||
else
|
||||
supply_options[:track_promote_release_status] = "completed"
|
||||
end
|
||||
|
||||
supply(supply_options)
|
||||
end
|
||||
end
|
||||
|
||||
83
fastlane/patches/supply_custom_promote.rb
Normal file
83
fastlane/patches/supply_custom_promote.rb
Normal file
@@ -0,0 +1,83 @@
|
||||
module Supply
|
||||
class Uploader
|
||||
alias_method :original_promote_track, :promote_track
|
||||
|
||||
def promote_track
|
||||
if Supply.config[:skip_release_verification]
|
||||
custom_promote_track
|
||||
else
|
||||
original_promote_track
|
||||
end
|
||||
end
|
||||
|
||||
def custom_promote_track
|
||||
UI.message("Using custom promotion logic")
|
||||
track_from = client.tracks(Supply.config[:track]).first
|
||||
unless track_from
|
||||
UI.user_error!("Cannot promote from track '#{Supply.config[:track]}' - track doesn't exist")
|
||||
end
|
||||
|
||||
releases = track_from.releases
|
||||
|
||||
version_code = Supply.config[:version_code].to_s
|
||||
if !Supply.config[:skip_release_verification]
|
||||
if version_code != ""
|
||||
releases = releases.select do |release|
|
||||
release.version_codes.include?(version_code)
|
||||
end
|
||||
else
|
||||
releases = releases.select do |release|
|
||||
release.status == Supply.config[:release_status]
|
||||
end
|
||||
end
|
||||
|
||||
if releases.size == 0
|
||||
if version_code != ""
|
||||
UI.user_error!("Cannot find release with version code '#{version_code}' to promote in track '#{Supply.config[:track]}'")
|
||||
else
|
||||
UI.user_error!("Track '#{Supply.config[:track]}' doesn't have any releases")
|
||||
end
|
||||
elsif releases.size > 1
|
||||
UI.user_error!("Track '#{Supply.config[:track]}' has more than one release - use :version_code to filter the release to promote")
|
||||
end
|
||||
else
|
||||
UI.message("Skipping release verification as per configuration.")
|
||||
if version_code == ""
|
||||
UI.user_error!("Must provide a version code when release verification is skipped.")
|
||||
end
|
||||
release = AndroidPublisher::TrackRelease.new(
|
||||
version_codes: [version_code],
|
||||
status: Supply.config[:track_promote_release_status] || Supply::ReleaseStatus::COMPLETED
|
||||
)
|
||||
end
|
||||
|
||||
release = releases.first unless Supply.config[:skip_release_verification]
|
||||
track_to = client.tracks(Supply.config[:track_promote_to]).first || AndroidPublisher::Track.new(
|
||||
track: Supply.config[:track_promote_to],
|
||||
releases: []
|
||||
)
|
||||
|
||||
rollout = (Supply.config[:rollout] || 0).to_f
|
||||
if rollout > 0 && rollout < 1
|
||||
release.status = Supply::ReleaseStatus::IN_PROGRESS
|
||||
release.user_fraction = rollout
|
||||
else
|
||||
release.status = Supply.config[:track_promote_release_status]
|
||||
release.user_fraction = nil
|
||||
end
|
||||
|
||||
if track_to
|
||||
# Its okay to set releases to an array containing the newest release
|
||||
# Google Play will keep previous releases there this release is a partial rollout
|
||||
track_to.releases = [release]
|
||||
else
|
||||
track_to = AndroidPublisher::Track.new(
|
||||
track: Supply.config[:track_promote_to],
|
||||
releases: [release]
|
||||
)
|
||||
end
|
||||
|
||||
client.update_track(Supply.config[:track_promote_to], track_to)
|
||||
end
|
||||
end
|
||||
end
|
||||
30
fastlane/patches/supply_custom_promote_config.rb
Normal file
30
fastlane/patches/supply_custom_promote_config.rb
Normal file
@@ -0,0 +1,30 @@
|
||||
module Supply
|
||||
class Options
|
||||
class << self
|
||||
alias_method :original_available_options, :available_options
|
||||
|
||||
def available_options
|
||||
original_options = original_available_options
|
||||
custom_options = [
|
||||
FastlaneCore::ConfigItem.new(
|
||||
key: :skip_release_verification,
|
||||
env_name: "SUPPLY_SKIP_RELEASE_VERIFICATION",
|
||||
description: "If set to true, skips checking if the version code exists in the track before promoting",
|
||||
type: Boolean,
|
||||
default_value: false,
|
||||
optional: true
|
||||
)
|
||||
]
|
||||
|
||||
# Only add custom options if they aren't already present
|
||||
custom_options.each do |custom_option|
|
||||
unless original_options.any? { |option| option.key == custom_option.key }
|
||||
original_options << custom_option
|
||||
end
|
||||
end
|
||||
|
||||
original_options
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user