Add CI pipeline

This commit is contained in:
TheDevMinerTV
2022-02-22 00:55:16 +01:00
parent a9311763a8
commit 74a1fbbfea
3 changed files with 149 additions and 0 deletions

29
.github/workflows/actions.yml vendored Normal file
View File

@@ -0,0 +1,29 @@
name: Build
on:
push:
pull_request:
jobs:
build:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v1
- name: Install pio and its dependencies
run: |
python -m pip install --upgrade pip
pip install platformio
- name: Run builds
run: python ./ci/build.py
- name: Upload binaries
uses: actions/upload-artifact@v2
with:
name: binaries
path: ./build/*.bin

1
.gitignore vendored
View File

@@ -3,3 +3,4 @@
.vscode/c_cpp_properties.json
.vscode/launch.json
.vscode/ipch
build/

119
ci/build.py Normal file
View File

@@ -0,0 +1,119 @@
import os
import re
import shutil
import subprocess
from textwrap import dedent
def build_for_platform(platform: str) -> int:
shutil.copy("src/defines.h", "src/defines.h.bak")
board = "BOARD_"
if platform == "esp12e":
board += "SLIMEVR"
elif platform == "d1_mini_lite":
board += "WEMOSD1MINI"
elif platform == "esp01":
board += "ESP01"
elif platform == "esp32dev":
board += "WROOM32"
else:
raise Exception("Unknown platform")
with open("src/defines.h", "r") as f:
lines = f.read().rstrip().lstrip()
lines = re.sub("#define BOARD .*", f"#define BOARD {board}", lines)
with open("src/defines.h", "wt") as f:
f.write(lines)
print("Building for platform: " + platform)
ret_code = os.system(f"platformio run -e {platform}")
if ret_code == 0:
print("Build succeeded")
shutil.copy(f".pio/build/{platform}/firmware.bin",
f"build/{platform}.bin")
else:
print("Build failed")
shutil.copy("src/defines.h.bak", "src/defines.h")
os.remove("src/defines.h.bak")
return ret_code
def main() -> None:
shutil.copy("platformio.ini", "platformio.ini.bak")
if os.path.exists("./build"):
shutil.rmtree("./build")
os.mkdir("./build")
with open("platformio.ini", "r") as f:
lines = f.read().rstrip().lstrip()
matches = re.search(
"\[env:.*\]\nplatform = .*\nboard = .*", lines)
if matches:
# remove lines
lines = lines.replace(matches.group(0), "")
# add new lines
lines += dedent("""
; ESP32 Dev Board
[env:esp32dev]
platform = espressif32
board = esp32dev
; SlimeVR PCB
[env:esp12e]
platform = espressif8266
board = esp12e
; ESP01 (512kB flash)
[env:esp01]
platform = espressif8266
board = esp01
; WEMOS D1 mini lite (1MB flash)
[env:d1_mini_lite]
platform = espressif8266
board = d1_mini_lite
""")
with open("platformio.ini", "wt") as f:
f.write(lines)
# TODO: Build a matrix of all platforms and all IMUs
esp32_ret_code = build_for_platform("esp32dev")
esp12e_ret_code = build_for_platform("esp12e")
esp01_ret_code = build_for_platform("esp01")
d1_mini_lite_ret_code = build_for_platform("d1_mini_lite")
shutil.copy("platformio.ini.bak", "platformio.ini")
os.remove("platformio.ini.bak")
print("\n\n\n\n")
if esp32_ret_code != 0:
print("Error occurred while building for ESP32 Dev Board")
if esp12e_ret_code != 0:
print("Error occurred while building for SlimeVR PCB")
if esp01_ret_code != 0:
print("Error occurred while building for ESP01")
if d1_mini_lite_ret_code != 0:
print("Error occurred while building for WEMOS D1 mini lite")
if esp32_ret_code != 0 or esp12e_ret_code != 0 or esp01_ret_code != 0 or d1_mini_lite_ret_code != 0:
print("One or more builds failed")
os._exit(1)
if __name__ == "__main__":
main()