рдирдорд╕реНрдХрд╛рд░! рдЧрд┐рддреБрдм рдХреНрд░рд┐рдпрд╛рдУрдВрдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде , рдЙрдиреНрд╣реЛрдВрдиреЗ рдкрд╣рд▓ рдХреА рдФрд░ рд╣рдорд╛рд░реЗ рдЫреЛрдЯреЗ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 2 рд╕рд╛рд▓ рдХреЗ рд▓рд╛рдЗрд╡ рдореЗрдВ рдПрдХ рд╕рд░рд▓ (рд▓реЗрдХрд┐рди рдХрд╛рдлреА рдкреНрд░рднрд╛рд╡реА) CI / CD рдХреЛ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ , рдлреНрд▓реЛрд╡реЙрд╡ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд▓рд╛рдЗрд╡ рдХрд┐рдпрд╛ редрдХрд┐рд╕ рд▓рд┐рдП?
рд╢рд╛рдпрдж рдХреБрдЫ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╣реИрдВ рдЬреЛ рдЧрд▓рддреА рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдореИрдВ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдирд╣реАрдВ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдХрднреА-рдХрднреА, рд▓реЗрдХрд┐рди рджреБрд░реНрдШрдЯрдирд╛ рдХреЗ рдРрд╕реЗ рдЫреЛрдЯреЗ рдлрдЯрдиреЗ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рддрддреНрдХрд╛рд▓ рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рд░реА рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдкрд╛рджрди рдпрд╛ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд░реЛрд▓рдмреИрдХ рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЙрди рдШрдВрдЯреЛрдВ-рджрд┐рдиреЛрдВ рдореЗрдВ, рдЬрд┐рдирдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдРрдк рдХреНрд░реИрд╢ рдкрд░ рдареЛрдХрд░ рдЦрд╛рддреЗ рд╣реИрдВ, рджреЛрдиреЛрдВ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рдмреАрдЪ рдФрд░ рдПрдХ рдЬрд┐рдореНрдореЗрджрд╛рд░ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдореВрдб рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рд░рд╣рддреЗ рд╣реИрдВредрдЙрддреНрдкрд╛рджрди рдкрд░ рдлреАрдХреИрдкреА рдХреЛ рдХреИрд╕реЗ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛рдП, рдореИрдВ рдиреАрдЪреЗ рдмрддрд╛рдКрдВрдЧрд╛редрдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдлрдХреИрдк рдХреНрдпреЛрдВ рд╣реИрдВ?- рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ
- рд╡реЗ рдХреБрдЫ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд▓рд╛рдП рдФрд░ рдпрд╣ рд╕реНрдерд┐рддрд┐рдЬрдиреНрдп рд░реВрдк рд╕реЗ рдХреНрд░реИрд╢ рд╣реЛ рдЧрдпрд╛
- рдЕрд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд▓рд╛рдЗрдмреНрд░реЗрд░реА (рдЖрдорддреМрд░ рдкрд░ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕) рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛
1 рдмрд┐рдВрджреБ, рдХреЛрдб рдХреА рд╕рдореАрдХреНрд╖рд╛, рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг, рд╕реНрдерд┐рд░ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг, рдпреВрдЖрдИ рдкрд░реАрдХреНрд╖рдг, рдореИрдиреБрдЕрд▓ рдкрд░реАрдХреНрд╖рдг рд╕реЗ рд╣рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреАред2-3 рдЕрдВрдХреЛрдВ рдХреЗ рд╕рд╛рде - рдХреЗрд╡рд▓ рдпреВрдЖрдИ рдкрд░реАрдХреНрд╖рдг рдФрд░ рдореИрдиреБрдЕрд▓ рдкрд░реАрдХреНрд╖рдгредрдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдЪреБрдирд╛рд╡ рддрдм рдЧрд┐рдердм рдПрдХреНрдЯреНрд╕ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ , рд▓рд╛рдн рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛрдб рдЧрд┐рдердм рдкрд░ рд╣реИред рдореБрдЭреЗ рддреБрд░рдВрдд рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП, рдореБрдлреНрдд рдЬреАрдердм рдЦрд╛рддреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рддрд┐ рдорд╛рд╣ 2,000 рдореБрдлреНрдд рдПрдХреНрд╢рди рдорд┐рдирдЯ рд╣реИрдВредрдХрд╣рд╛ рд╕реЗ рд╢реБрд░реБрд╡рд╛рдд рдХрд░реЗ?
рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рднрд╛рд╖рд╛рдУрдВ рдФрд░ рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рднрд░рд╛ рд╣реИред рдпрд╣ рдЪреАрдЬрд╝ YAML рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреА рдЧрдИ рд╣реИ , рдЬреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред
Android рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рдЙрджрд╛рд╣рд░рдг:name: Android CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Build with Gradle
run: ./gradlew assembleDebug
рд╡рд┐рд╡рд░рдг: рд╣рд░ рдкреБрд╢ рдХреЗ рд▓рд┐рдП, ubuntu OS рдХреЗ рд╕рд╛рде github рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдкрд░ рдХрд┐рд╕реА рднреА рд╢рд╛рдЦрд╛ рдкрд░ рдПрдХ рдХрд╛рд░реНрдп рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдХрд╛рд░реНрдп рдЪрд░рдг: рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рдЪреЗрдХрдЖрдЙрдЯ рдХрд░реЗрдВ, jdk рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ, рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЧреАрдХреГрдд рдХрд╛рд░реНрдп рдЪрд▓рд╛рдПрдБрдПрдХ рдХрджрдо рдХреЗ рдЕрд╕рдлрд▓ рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдРрд╕реА рддрд╕реНрд╡реАрд░
рджреЗрдЦреЗрдВрдЧреЗ рдЬрд╣рд╛рдВ рдЖрдк рд▓реЙрдЧ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВредрдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдХрд┐ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рд╣рдореЗрдВ рддреБрд░рдВрдд рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рд╣рдорд╛рд░рд╛ рдкрд░реАрдХреНрд╖рдг рдЕрдиреБрдХреНрд░рдо рдлрд╝реНрд▓реЙрдк рд╣реЛ рдЧрдпрд╛ рд╣реИред
рдФрд░ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕реНрд▓реИрдХ рдХреЗ рд╕рд╛рде рдЬреАрдердм рдПрдХреАрдХрд░рдг рд╣реИ, рддреЛ рдпрд╣ рднреА рд╣реИ
рдЕрдм рдмрд┐рдВрджреБ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ
1. рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгрдЖрдкрдиреЗ рдЬреВрдирд┐рдЯ, рдореЙрдХрд┐рдЯреЛ рдЖрджрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗредрдЕрдм рдЖрдкрдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдЙрдЪрд┐рдд рдЕрдиреБрдХреНрд░рдорд┐рдХ рдХрд╛рд░реНрдп рдЬреЛрдбрд╝рдХрд░ рдкрд░реАрдХреНрд╖рдг рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред- name: Run some unit tests
run: ./gradlew testStageDebugUnitTest
2. рд╕реНрдЯреЗрдЯрд┐рдХ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдЖрдк рд╕рд╛рдзрд╛рд░рдг linters рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ( detekt - kotlin рдХреЗ рд▓рд┐рдП, PMD - рдЬрд╛рд╡рд╛ рдХреЗ рд▓рд┐рдП)редрдпрд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╡рд┐рдХрд▓реНрдк рд╕реЛрдирд╛рд░рдХреНрдмреА рд╣реИ редрд╕рд╛рдзрд╛рд░рдг рд▓рд┐рдВрдЯрд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬрд╛рд╡рд╛ рдФрд░ рдХреЛрдЯрд▓рд┐рди рджреЛрдиреЛрдВ рд╣реИрдВ):task("checkAll") {
group "Verify"
description "Runs all static checks on the build"
dependsOn "pmd", "detekt"
}
- name: Run some unit tests
run: ./gradlew checkAll
рд╕реЛрдирд╛рд░рдХреНрдмреА рдХреЗ
рдорд╛рдорд▓реЗ рдореЗрдВ - рдЯреНрдпреВрдирд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ - рдпрд╣рд╛рдБ- uses: actions/checkout@v1
- name: SonarCloud Scan
run: ./gradlew jacocoUnitTestReport sonarqube -Dsonar.login=${{ secrets.SONAR_TOKEN }} --stacktrace
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Link to SonarCloud Report
run: echo "https://sonarcloud.io/dashboard?id=.."
3. рдпреВрдЖрдИ рдкрд░реАрдХреНрд╖рдгрдПрдХ рдпреВрдЖрдИ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рдЖрдкрдХреА рдХрд▓реНрдкрдирд╛ рдХрд╛ рдПрдХ рдЕрдиреБрдорд╛рди рд╣реИ, рдореЗрд░рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдПрдХ "рд╕реНрдореЛрдХ" рдЯреЗрд╕реНрдЯ рд╣реИ рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдорд╛рдирдХ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдирдХрд▓ рдХрд░рддрд╛ рд╣реИ - рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВ, рдПрдХ рдЙрддреНрдкрд╛рдж рдЪреБрдиреЗрдВ, рдПрдХ рдСрд░реНрдбрд░ рдЪреБрдиреЗрдВ, рдПрдХ рдСрд░реНрдбрд░ рдХрд░реЗрдВ, рдСрд░реНрдбрд░ рдЯреНрд░реИрдХ рдХрд░реЗрдВред рдЖрдк UIAutomator, Espresso, Kaspresso рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредрдпрд╣рд╛рдВ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 2 рд╡рд┐рдХрд▓реНрдк рднреА рд╣реИрдВ - рдПрдХ рдЧреАрдереВрдм рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдкрд░ рдПрдХ рдПрдореБрд▓реЗрдЯрд░ рдпрд╛ рдлрд╛рдпрд░рд╕реЗрд╕ рдЯреЗрд╕реНрдЯ рд▓реИрдм рдЬреИрд╕реА рдХреНрд▓рд╛рдЙрдб рд╕реЗрд╡рд╛рдПрдВ ред рдЧрд┐рддреБрдм рдХреЗрдЕрдВрджрд░ рдПрдореБрд▓реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ: рдПрдХ рдФрд░ рджреЛ редрдлрд╛рдпрд░рдмреЗрд╕ рдЯреЗрд╕реНрдЯ рд▓реИрдм рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ gcloud CLI рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ Google рдХреНрд▓рд╛рдЙрдб рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛- name: prepare gcloud
uses: GoogleCloudPlatform/github-actions/setup-gcloud@master
with:
version: latest
service_account_email: ${{ secrets.SA_EMAIL }}
service_account_key: ${{ secrets.GOOGLE_APPLICATION_CREDENTIALS }}
- name: gcloud Set up project
run: |
gcloud config set project ${{ secrets.PROJECT_ID }}
- name: Assemble apks for smoke test
run: ./gradlew Smoke
- name: Run tests in test lab
run: |
gcloud firebase test android run \
--app app/build/outputs/apk/production/debug/app.apk \
--test app/build/outputs/apk/androidTest/production/debug/appTest.apk \
--device model=Nexus6P,version=25,orientation=portrait,locale=en_US \
--device model=athene,version=23,orientation=portrait,locale=en_US \
--device model=sailfish,version=26,orientation=portrait,locale=en_US
рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдлрд╛рдпрд░рдмреЗрд╕ рдореЗрдВ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ, Google рдХреНрд▓рд╛рдЙрдб рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реЗрд╡рд╛ рдЦрд╛рддрд╛ рдмрдирд╛рдиреЗ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдХреА рдЧрдИ json рдХреБрдВрдЬреА рдХреЛ рдмреЗрд╕рдХреНрд▓реВрдЬрд╝ рдореЗрдВ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП github рд░рд╣рд╕реНрдпреЛрдВ рдореЗрдВ рдмреЗрд╕ 64 рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ редрдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдиреНрдпрд╛рд╕ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рдерд╛ред рдорд╛рд╕реНрдЯрд░ рдореЗрдВ рдкреАрдЖрд░ рдШрдЯрдирд╛ рд╕реЗ рдХрд╛рд░реНрдп рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИname: Android CI
on:
pull_request:
branches:
- 'master'
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Run static checks
run: ./gradlew checkAll
- name: Run some unit tests
run: ./gradlew testStageDebugUnitTest
- name: prepare gcloud
uses: GoogleCloudPlatform/github-actions/setup-gcloud@master
with:
version: latest
service_account_email: ${{ secrets.SA_EMAIL }}
service_account_key: ${{ secrets.GOOGLE_APPLICATION_CREDENTIALS }}
- name: gcloud Set up project
run: |
gcloud config set project ${{ secrets.PROJECT_ID }}
- name: Assemble apks for smoke test
run: ./gradlew Smoke
- name: Run tests in test lab
run: |
gcloud firebase test android run \
--app app/build/outputs/apk/production/debug/app.apk \
--test app/build/outputs/apk/androidTest/production/debug/appTest.apk \
--device model=Nexus6P,version=25,orientation=portrait,locale=en_US \
--device model=athene,version=23,orientation=portrait,locale=en_US \
--device model=sailfish,version=26,orientation=portrait,locale=en_US
рдпрд╣ рд╕рд░рд▓ рд▓рдЧрддрд╛ рд╣реИред рджрдХреНрд╖рддрд╛ рд▓рд┐рдЦрд┐рдд рдкрд░реАрдХреНрд╖рдгреЛрдВ рдФрд░ рдЪрдпрдирд┐рдд рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдирд┐рдпрдореЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╕реНрд╡рддрдВрддреНрд░ рдХрд╛рд░реНрдп (рдиреМрдХрд░реА) рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рд╕рддреНрдпрд╛рдкрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд▓рдЧрднрдЧ 15 рдорд┐рдирдЯ рд▓рдЧрддреЗ рд╣реИрдВ (рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдЧрд┐рддреБрдм 2-рдХреЛрд░ рд╕реАрдкреАрдпреВ, 7 рдЬреАрдмреА рд░реИрдо, рдПрд╕рдПрд╕рдбреА рдХреА 14 рдЬреАрдмреА), рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдЬрдм рддрдХ рдЖрдк рдЕрдкрдиреА рдЖрдВрдЦреЛрдВ рд╕реЗ "рдЗрд╕реЗ рдХреЛрдб" рдХрд░рддреЗ рд╣реИрдВ, рдЗрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдо рднреА рдЖ рдЧрдП рд╣реИрдВредрдпреВрдЖрдИ рдкрд░реАрдХреНрд╖рдг рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ - рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХреЗ рджреМрд░рд╛рди рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрдк рдмрд╕ рд╕рдордЭ рдЬрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПредGcloud рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдЖрдк Firebase App рд╡рд┐рддрд░рдг, Google Play рдкрд░ рд░рд┐рд▓реАрдЬрд╝ рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдб рд╡рд┐рддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредрдХрдИ рдЙрдкрдпреЛрдЧреА рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рдФрд░ рдпрд╣рд╛рдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ редрдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред рд╕реМрднрд╛рдЧреНрдп рдФрд░ рдЙрддреНрдкрд╛рджрди рдкрд░ рдХрдо рджреБрд░реНрдШрдЯрдирд╛рдУрдВ!