summaryrefslogtreecommitdiff
path: root/.github/workflows/main.yml
blob: ef8d3977278bdda13c67f2909c2dcaf10b4dc058 (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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
name: CI

# Run this workflow whenever the build may be affected
on:
  push:
    branches: [ master, develop ]
    paths-ignore:
      - 'doc/**'
      - '**.md'
  pull_request:
    branches: [ develop ]
    paths-ignore:
      - 'doc/**'
      - '**.md'

jobs:
  build-firmware:
    runs-on: ubuntu-latest
    container:
      image: infinitime/infinitime-build
    outputs:
      text_size: ${{ steps.output-sizes.outputs.text_size }}
      data_size: ${{ steps.output-sizes.outputs.data_size }}
      bss_size: ${{ steps.output-sizes.outputs.bss_size }}
    env:
      # InfiniTime sources are downloaded to the current directory.
      # Override SOURCES_DIR in build.sh
      SOURCES_DIR: .
    steps:
      - name: Checkout source files
        uses: actions/checkout@v3
        with:
          submodules: recursive
      - name: Build
        shell: bash
        run: /opt/build.sh all
      - name: Output build size
        id: output-sizes
        run: |
          . /opt/build.sh
          .github/workflows/getSize.sh "$BUILD_DIR"/src/pinetime-app-*.out >> $GITHUB_OUTPUT
      # Unzip the package because Upload Artifact will zip up the files
      - name: Unzip DFU package
        run: unzip ./build/output/pinetime-mcuboot-app-dfu-*.zip -d ./build/output/pinetime-mcuboot-app-dfu
      - name: Upload DFU artifacts
        uses: actions/upload-artifact@v3
        with:
          name: InfiniTime DFU ${{ github.head_ref }}
          path: ./build/output/pinetime-mcuboot-app-dfu/*
      - name: Upload MCUBoot image artifacts
        uses: actions/upload-artifact@v3
        with:
          name: InfiniTime MCUBoot image ${{ github.head_ref }}
          path: ./build/output/pinetime-mcuboot-app-image-*.bin
      - name: Upload resources artifacts
        uses: actions/upload-artifact@v3
        with:
          name: InfiniTime resources ${{ github.head_ref }}
          path: ./build/output/infinitime-resources-*.zip

  build-simulator:
    runs-on: ubuntu-22.04
    steps:
    - name: Install SDL2 development package
      run:  |
        sudo apt-get update
        sudo apt-get -y install libsdl2-dev

    - name: Install Ninja
      run:  |
        sudo apt-get -y install ninja-build

    - name: Install lv_font_conv
      run:
        npm i -g lv_font_conv@1.5.2

    - name: Checkout source files
      uses: actions/checkout@v3
      with:
        submodules: recursive

    - name: Get InfiniSim repo
      run:  |
        git clone https://github.com/InfiniTimeOrg/InfiniSim.git --depth 1 --branch main
        git -C InfiniSim submodule update --init lv_drivers libpng

    - name: CMake
      # disable BUILD_RESOURCES as this is already done when building the firmware
      run:  |
        cmake -G Ninja -S InfiniSim -B build_lv_sim -DInfiniTime_DIR="${PWD}" -DBUILD_RESOURCES=OFF

    - name: Build simulator executable
      run:  |
        cmake --build build_lv_sim

    - name: Upload simulator executable
      uses: actions/upload-artifact@v3
      with:
        name: infinisim-${{ github.head_ref }}
        path: build_lv_sim/infinisim

  get-base-ref-size:
    if: github.event_name == 'pull_request'
    runs-on: ubuntu-22.04
    container:
      image: infinitime/infinitime-build
    outputs:
      text_size: ${{ steps.output-sizes.outputs.text_size }}
      data_size: ${{ steps.output-sizes.outputs.data_size }}
      bss_size: ${{ steps.output-sizes.outputs.bss_size }}
    env:
      # InfiniTime sources are downloaded to the current directory.
      # Override SOURCES_DIR in build.sh
      SOURCES_DIR: .
    steps:
    - name: Cache sources
      id: cache-sources
      uses: actions/cache@v3
      with:
        path: .
        key: source-files-${{ github.event.pull_request.base.sha }}

    - if: ${{ steps.cache-sources.outputs.cache-hit != 'true' }}
      name: Checkout source files
      uses: actions/checkout@v3
      with:
        ref: ${{ github.base_ref }}
        submodules: recursive

    - if: ${{ steps.cache-sources.outputs.cache-hit != 'true' }}
      name: Build
      shell: bash
      # Only pinetime-app target is needed, but post_build.sh fails
      run: /opt/build.sh all

    - name: Output build size
      id: output-sizes
      run: |
        . /opt/build.sh
        .github/workflows/getSize.sh "$BUILD_DIR"/src/pinetime-app-*.out >> $GITHUB_OUTPUT

  compare-build-size:
    if: github.event_name == 'pull_request'
    needs: [build-firmware, get-base-ref-size]
    runs-on: ubuntu-latest
    steps:
    - name: Compare build size
      id: output-sizes-diff
      run: |
        TEXT_SIZE=${{ needs.build-firmware.outputs.text_size }}
        DATA_SIZE=${{ needs.build-firmware.outputs.data_size }}
        BSS_SIZE=${{ needs.build-firmware.outputs.bss_size }}

        echo "text_size=$TEXT_SIZE"
        echo "data_size=$DATA_SIZE"
        echo "bss_size=$BSS_SIZE"

        echo "text_size=$TEXT_SIZE" >> $GITHUB_OUTPUT
        echo "data_size=$DATA_SIZE" >> $GITHUB_OUTPUT
        echo "bss_size=$BSS_SIZE" >> $GITHUB_OUTPUT

        TEXT_SIZE_BASE=${{ needs.get-base-ref-size.outputs.text_size }}
        DATA_SIZE_BASE=${{ needs.get-base-ref-size.outputs.data_size }}
        BSS_SIZE_BASE=${{ needs.get-base-ref-size.outputs.bss_size }}

        TEXT_SIZE_DIFF=$((TEXT_SIZE - TEXT_SIZE_BASE))
        DATA_SIZE_DIFF=$((DATA_SIZE - DATA_SIZE_BASE))
        BSS_SIZE_DIFF=$((BSS_SIZE - BSS_SIZE_BASE))

        echo "text_diff=$TEXT_SIZE_DIFF"
        echo "data_diff=$DATA_SIZE_DIFF"
        echo "bss_diff=$BSS_SIZE_DIFF"

        echo "text_diff=$TEXT_SIZE_DIFF" >> $GITHUB_OUTPUT
        echo "data_diff=$DATA_SIZE_DIFF" >> $GITHUB_OUTPUT
        echo "bss_diff=$BSS_SIZE_DIFF" >> $GITHUB_OUTPUT

    - name: Find Comment
      # Due to a security concern, comments can only be created in the context of branches in the repo.
      # PRs from forks can't get the comment.
      if: github.event.pull_request.head.repo.full_name == github.repository
      uses: peter-evans/find-comment@v2
      id: build-size-comment
      with:
        issue-number: ${{ github.event.pull_request.number }}
        comment-author: 'github-actions[bot]'
        body-includes: Build size and comparison to

    - name: Create or update comment
      if: github.event.pull_request.head.repo.full_name == github.repository
      uses: peter-evans/create-or-update-comment@v2
      with:
        comment-id: ${{ steps.build-size-comment.outputs.comment-id }}
        issue-number: ${{ github.event.pull_request.number }}
        body: |
          Build size and comparison to ${{ github.base_ref }}:
          | Section | Size | Difference |
          | ------- | ---- | ---------- |
          | text    | ${{ needs.build-firmware.outputs.text_size }}B | ${{ steps.output-sizes-diff.outputs.text_diff }}B |
          | data    | ${{ needs.build-firmware.outputs.data_size }}B | ${{ steps.output-sizes-diff.outputs.data_diff }}B |
          | bss     | ${{ needs.build-firmware.outputs.bss_size }}B  | ${{ steps.output-sizes-diff.outputs.bss_diff }}B  |
        edit-mode: replace