summaryrefslogtreecommitdiff
path: root/.github/workflows/checks.yml
blob: 587b6780af0836c4832e475216219f4130538c0d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
name: Checks

on:
  pull_request:
    types: [opened, synchronize, reopened]
  push:
    branches: [master, develop]

jobs:
  code-style:
    name: "Code Style"
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0
      - name: Checkstyle
        run: |
          curl -s -L https://github.com/checkstyle/checkstyle/releases/download/checkstyle-9.2.1/checkstyle-9.2.1-all.jar > checkstyle.jar
          find . -name "*\.java" | xargs java -Dconfig_loc=config/checkstyle -jar checkstyle.jar -c config/checkstyle/checkstyle.xml
      - name: Find PR Base Commit
        id: vars
        run: |
          git fetch origin develop
          echo "::set-output name=branchBaseCommit::$(git merge-base origin/develop HEAD)"
      - name: Diff-Checkstyle
        run: |
          curl -s -L https://github.com/yangziwen/diff-checkstyle/releases/download/0.0.4/diff-checkstyle.jar > diff-checkstyle.jar
          java -Dconfig_loc=config/checkstyle -jar diff-checkstyle.jar -c config/checkstyle/checkstyle-new-code.xml --git-dir . --base-rev ${{ steps.vars.outputs.branchBaseCommit }}
      - name: XML of changed files
        run: |
          curl -s -L https://github.com/ByteHamster/android-xml-formatter/releases/download/1.1.0/android-xml-formatter.jar > android-xml-formatter.jar
          git diff --name-only ${{ steps.vars.outputs.branchBaseCommit }} --diff-filter=AM | { grep "res/layout/" || true; } | xargs java -jar android-xml-formatter.jar
          test $(git diff | wc -l) -eq 0 || (echo -e "\n\n===== Found XML code style violations! See output below how to fix them. =====\n\n" && git --no-pager diff --color=always && false)

  wrapper-validation:
    name: "Gradle Wrapper Validation"
    needs: code-style
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: gradle/wrapper-validation-action@v1

  static-analysis:
    name: "Static Code Analysis"
    needs: code-style
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Cache Gradle
        uses: actions/cache@v2
        with:
          path: |
            ~/.gradle/caches
            ~/.gradle/wrapper
          key: gradle-${{ hashFiles('**/*.gradle*') }}-${{ hashFiles('**/gradle/wrapper/gradle-wrapper.properties') }}
      - name: Lint
        run: ./gradlew lintPlayRelease lintRelease
      - name: SpotBugs
        run: ./gradlew spotbugsPlayDebug spotbugsDebug 2>&1 | grep -i "spotbugs"

  unit-test:
    name: "Unit Test: ${{ matrix.variant }}"
    needs: code-style
    runs-on: ubuntu-latest
    strategy:
      matrix:
        include:
          - variant: "PlayDebug"
            base-variant: "Debug"
            execute-tests: true
            upload-artifact: true
          - variant: "PlayRelease"
            base-variant: "Release"
            execute-tests: true
            upload-artifact: false
          - variant: "FreeRelease"
            base-variant: "Release"
            execute-tests: false
            upload-artifact: false
    steps:
      - uses: actions/checkout@v2
      - name: Cache Gradle
        uses: actions/cache@v2
        with:
          path: |
            ~/.gradle/caches
            ~/.gradle/wrapper
          key: gradle-${{ hashFiles('**/*.gradle*') }}-${{ hashFiles('**/gradle/wrapper/gradle-wrapper.properties') }}
      - name: Create temporary release keystore
        run: keytool -noprompt -genkey -v -keystore "app/keystore" -alias alias -storepass password -keypass password -keyalg RSA -validity 10 -dname "CN=antennapod.org, OU=dummy, O=dummy, L=dummy, S=dummy, C=US"
      - name: Build
        run: ./gradlew assemble${{ matrix.variant }}
      - name: Test
        if: matrix.execute-tests == true
        run: ./gradlew test${{ matrix.variant }}UnitTest test${{ matrix.base-variant }}UnitTest
      - uses: actions/upload-artifact@v2
        if: matrix.upload-artifact == true
        with:
          name: app-play-debug.apk
          path: app/build/outputs/apk/play/debug/app-play-debug.apk

  emulator-test:
    name: "Emulator Test"
    needs: code-style
    runs-on: macOS-latest
    env:
      api-level: 27
    steps:
      - uses: actions/checkout@v2
      - name: Set up JDK 11
        uses: actions/setup-java@v2
        with:
          distribution: 'adopt'
          java-version: '11'
      - name: Build with Gradle
        run: ./gradlew assemblePlayDebugAndroidTest
      - name: Cache Gradle
        uses: actions/cache@v2
        with:
          path: |
            ~/.gradle/caches
            ~/.gradle/wrapper
          key: gradle-${{ hashFiles('**/*.gradle*') }}-${{ hashFiles('**/gradle/wrapper/gradle-wrapper.properties') }}
      - name: Cache AVD
        uses: actions/cache@v2
        id: avd-cache
        with:
          path: |
            ~/.android/avd/*
            ~/.android/adb*
          key: avd-${{ env.api-level }}
      - name: Create AVD and generate snapshot for caching
        if: steps.avd-cache.outputs.cache-hit != 'true'
        uses: reactivecircus/android-emulator-runner@v2
        with:
          api-level: ${{ env.api-level }}
          force-avd-creation: false
          emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
          disable-animations: false
          script: echo "Generated AVD snapshot for caching."
      - name: Android Emulator test
        uses: reactivecircus/android-emulator-runner@v2
        with:
          api-level: ${{ env.api-level }}
          force-avd-creation: false
          emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
          disable-animations: true
          script: zsh .github/workflows/runEmulatorTests.sh
      - uses: actions/upload-artifact@v2
        if: failure()
        with:
          name: test-report
          path: app/build/reports/androidTests/connected/flavors/PLAY/