-
-
Notifications
You must be signed in to change notification settings - Fork 19
227 lines (187 loc) · 7.95 KB
/
main.yml
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
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
# GitHub Actions Workflow to build Rust+Mynewt Firmware for PineTime Smart Watch
# See https://lupyuen.github.io/pinetime-rust-mynewt/articles/cloud
# Name of this Workflow
name: Build PineTime Firmware
# When to run this Workflow...
on:
# Run this Workflow when files are updated (Pushed) in this Branch
push:
branches: [ master ]
# Steps to run for the Workflow
jobs:
build:
# Run these steps on Ubuntu
runs-on: ubuntu-latest
steps:
#########################################################################################
# Checkout
- name: Checkout source files
uses: actions/checkout@v2
with:
submodules: 'recursive'
- name: Check cache for newt
id: cache-newt
uses: actions/cache@v2
env:
cache-name: cache-newt
with:
path: ${{ runner.temp }}/mynewt-newt
key: ${{ runner.os }}-build-${{ env.cache-name }}
restore-keys: ${{ runner.os }}-build-${{ env.cache-name }}
- name: Install newt
if: steps.cache-newt.outputs.cache-hit != 'true' # Install newt if not found in cache
run: |
source scripts/install-version.sh
cd ${{ runner.temp }}
git clone --branch $mynewt_version https://github.com/apache/mynewt-newt/
cd mynewt-newt/
./build.sh
newt/newt version
export PATH=$PATH:${{ runner.temp }}/mynewt-newt/newt
newt version
- name: Check cache for Mynewt source files
id: cache-mynewt
uses: actions/cache@v2
env:
cache-name: cache-mynewt
with:
path: repos
key: ${{ runner.os }}-build-${{ env.cache-name }}
restore-keys: ${{ runner.os }}-build-${{ env.cache-name }}
- name: Download Mynewt source files
if: steps.cache-mynewt.outputs.cache-hit != 'true' # Install mynewt if not found in cache
run: |
# Ignore Error: Error updating "mcuboot": error: The following untracked working tree files would be overwritten by checkout:
# ext/mbedtls/include/mbedtls/check_config.h
# ext/mbedtls/include/mbedtls/config.h
export PATH=$PATH:${{ runner.temp }}/mynewt-newt/newt
newt install -v -f || ls -l repos
# Overwrite MCUBoot with newer version
source scripts/install-version.sh
cd repos
rm -rf mcuboot
git clone --branch $mcuboot_version https://github.com/JuulLabs-OSS/mcuboot
# git clone --branch $mynewt_version https://github.com/apache/mynewt-core
# git clone --branch $nimble_version https://github.com/apache/mynewt-nimble
- name: Show files
run: set ; pwd ; ls -l
#########################################################################################
# Convert Logo
- name: Convert Logo from PNG to C
run: |
# Run pinetime-graphic in the temp folder to avoid Cargo.toml and .cargo conflicts
cp -r pinetime-graphic ${{ runner.temp }}
cp pinetime-graphic.png ${{ runner.temp }}/pinetime-graphic
# Convert the graphic from PNG to C
cd ${{ runner.temp }}/pinetime-graphic
rustup default nightly
export RUST_BACKTRACE=1
export TERM=vt100
cargo run -q pinetime-graphic.png >${{ github.workspace }}/apps/my_sensor_app/src/write_graphic.inc
- name: Upload Converted Logo
uses: actions/upload-artifact@v2
with:
name: write_graphic.inc
path: apps/my_sensor_app/src/write_graphic.inc
#########################################################################################
# Download and Cache Dependencies
# - name: Fetch cache for Rust Toolchain
# id: cache-rust
# uses: actions/cache@v2
# with:
# path: |
# ~/.cargo/registry
# ~/.cargo/git
# target
# key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- name: Install Rust Target thumbv7em-none-eabihf
run: |
rustup default nightly
rustup target add thumbv7em-none-eabihf
- name: Check cache for Embedded Arm Toolchain arm-none-eabi-gcc
id: cache-toolchain
uses: actions/cache@v2
env:
cache-name: cache-toolchain
with:
path: ${{ runner.temp }}/arm-none-eabi
key: ${{ runner.os }}-build-${{ env.cache-name }}
restore-keys: ${{ runner.os }}-build-${{ env.cache-name }}
- name: Install Embedded Arm Toolchain arm-none-eabi-gcc
if: steps.cache-toolchain.outputs.cache-hit != 'true' # Install toolchain if not found in cache
uses: fiam/[email protected]
with:
# GNU Embedded Toolchain for Arm release name, in the V-YYYY-qZ format (e.g. "9-2019-q4")
release: 8-2019-q3
# Directory to unpack GCC to. Defaults to a temporary directory.
directory: ${{ runner.temp }}/arm-none-eabi
- name: Check cache for MCUBoot
id: cache-mcuboot
uses: actions/cache@v2
env:
cache-name: cache-mcuboot
with:
path: ${{ runner.temp }}/mcuboot
key: ${{ runner.os }}-build-${{ env.cache-name }}
restore-keys: ${{ runner.os }}-build-${{ env.cache-name }}
- name: Install MCUBoot
if: steps.cache-mcuboot.outputs.cache-hit != 'true' # Install MCUBoot if not found in cache
run: |
cd ${{ runner.temp }}
git clone --branch v1.5.0 https://github.com/JuulLabs-OSS/mcuboot
# - name: Install imgtool dependencies
# run: pip3 install --user -r ${{ runner.temp }}/mcuboot/scripts/requirements.txt
# - name: Install adafruit-nrfutil
# run: |
# pip3 install --user wheel
# pip3 install --user setuptools
# pip3 install --user adafruit-nrfutil
#########################################################################################
# Build and Upload MCUBoot Bootloader
- name: Build Bootloader
run: |
export PATH=$PATH:${{ runner.temp }}/mynewt-newt/newt:${{ runner.temp }}/arm-none-eabi/bin
./scripts/nrf52/build-boot.sh
- name: Upload Bootloader
uses: actions/upload-artifact@v2
with:
name: mynewt.elf
path: bin/targets/nrf52_boot/app/boot/mynewt/mynewt.elf
- name: Upload Bootloader Outputs
uses: actions/upload-artifact@v2
with:
name: mynewt.zip
path: bin/targets/nrf52_boot/app/boot/mynewt/mynewt.*
#########################################################################################
# Build and Upload Rust+Mynewt Application Firmware
- name: Build Application Firmware
run: |
export PATH=$PATH:${{ runner.temp }}/mynewt-newt/newt:${{ runner.temp }}/arm-none-eabi/bin
./scripts/build-app.sh
- name: Upload Application Firmware
uses: actions/upload-artifact@v2
with:
name: my_sensor_app.elf
path: bin/targets/nrf52_my_sensor/app/apps/my_sensor_app/my_sensor_app.elf
- name: Create Application Firmware Image
run: |
export PATH=$PATH:${{ runner.temp }}/mynewt-newt/newt:${{ runner.temp }}/arm-none-eabi/bin
./scripts/nrf52/image-app.sh
- name: Upload Application Firmware Image
uses: actions/upload-artifact@v2
with:
name: my_sensor_app.img
path: bin/targets/nrf52_my_sensor/app/apps/my_sensor_app/my_sensor_app.img
- name: Upload Application Firmware Outputs
uses: actions/upload-artifact@v2
with:
name: my_sensor_app.zip
path: bin/targets/nrf52_my_sensor/app/apps/my_sensor_app/my_sensor_app.*
#########################################################################################
# Finish
- name: Find output
run: |
find bin/targets/nrf52_boot/app/boot/mynewt -name "mynewt.*" -ls
find bin/targets/nrf52_my_sensor/app/apps/my_sensor_app -name "my_sensor_app.*" -ls
# Embedded Arm Toolchain will only be cached if the build succeeds.
# So make sure that the first build always succeeds, e.g. comment out the "Build" step.