рдПрдХ рджрд┐рди рдореЗрдВ Android рдХреЗ рд▓рд┐рдП рдЬреАрдЖрдИрдереБрдм рдкрд░ рд╕реАрдЖрдИ рдХреЛ рдЙрдард╛рдирд╛

рдирдорд╕реНрдХрд╛рд░! рдЧрд┐рддреБрдм рдХреНрд░рд┐рдпрд╛рдУрдВ

рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде , рдЙрдиреНрд╣реЛрдВрдиреЗ рдкрд╣рд▓ рдХреА рдФрд░ рд╣рдорд╛рд░реЗ рдЫреЛрдЯреЗ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 2 рд╕рд╛рд▓ рдХреЗ рд▓рд╛рдЗрд╡ рдореЗрдВ рдПрдХ рд╕рд░рд▓ (рд▓реЗрдХрд┐рди рдХрд╛рдлреА рдкреНрд░рднрд╛рд╡реА) CI / CD рдХреЛ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ , рдлреНрд▓реЛрд╡реЙрд╡ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд▓рд╛рдЗрд╡ рдХрд┐рдпрд╛ ред

рдХрд┐рд╕ рд▓рд┐рдП?



рд╢рд╛рдпрдж рдХреБрдЫ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╣реИрдВ рдЬреЛ рдЧрд▓рддреА рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдореИрдВ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдирд╣реАрдВ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдХрднреА-рдХрднреА, рд▓реЗрдХрд┐рди рджреБрд░реНрдШрдЯрдирд╛ рдХреЗ рдРрд╕реЗ рдЫреЛрдЯреЗ рдлрдЯрдиреЗ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рддрддреНрдХрд╛рд▓ рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рд░реА рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдкрд╛рджрди рдпрд╛ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд░реЛрд▓рдмреИрдХ рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЙрди рдШрдВрдЯреЛрдВ-рджрд┐рдиреЛрдВ рдореЗрдВ, рдЬрд┐рдирдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдРрдк рдХреНрд░реИрд╢ рдкрд░ рдареЛрдХрд░ рдЦрд╛рддреЗ рд╣реИрдВ, рджреЛрдиреЛрдВ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рдмреАрдЪ рдФрд░ рдПрдХ рдЬрд┐рдореНрдореЗрджрд╛рд░ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдореВрдб рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рд░рд╣рддреЗ рд╣реИрдВред

рдЙрддреНрдкрд╛рджрди рдкрд░ рдлреАрдХреИрдкреА рдХреЛ рдХреИрд╕реЗ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛рдП, рдореИрдВ рдиреАрдЪреЗ рдмрддрд╛рдКрдВрдЧрд╛ред

рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдлрдХреИрдк рдХреНрдпреЛрдВ рд╣реИрдВ?

  1. рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ
  2. рд╡реЗ рдХреБрдЫ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд▓рд╛рдП рдФрд░ рдпрд╣ рд╕реНрдерд┐рддрд┐рдЬрдиреНрдп рд░реВрдк рд╕реЗ рдХреНрд░реИрд╢ рд╣реЛ рдЧрдпрд╛
  3. рдЕрд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд▓рд╛рдЗрдмреНрд░реЗрд░реА (рдЖрдорддреМрд░ рдкрд░ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕) рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛

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 рдкрд░ рд░рд┐рд▓реАрдЬрд╝ рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдб рд╡рд┐рддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдХрдИ рдЙрдкрдпреЛрдЧреА рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рдФрд░ рдпрд╣рд╛рдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ ред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред рд╕реМрднрд╛рдЧреНрдп рдФрд░ рдЙрддреНрдкрд╛рджрди рдкрд░ рдХрдо рджреБрд░реНрдШрдЯрдирд╛рдУрдВ!

All Articles