Compile All #6
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Compile All | |
on: | |
workflow_dispatch: | |
jobs: | |
build: | |
name: Build for ${{ matrix.target.name }} | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
target: | |
- { name: "esp32-generic", idf_target: "esp32", sdkconfig_file: "configs/sdkconfig.default.esp32", zip_name: "esp32-generic.zip" } | |
- { name: "esp32s2-generic", idf_target: "esp32s2", sdkconfig_file: "configs/sdkconfig.default.esp32s2", zip_name: "esp32s2-generic.zip"} | |
- { name: "esp32s3-generic", idf_target: "esp32s3", sdkconfig_file: "configs/sdkconfig.default.esp32s3", zip_name: "esp32s3-generic.zip" } | |
- { name: "esp32c3-generic", idf_target: "esp32c3", sdkconfig_file: "configs/sdkconfig.default.esp32c3", zip_name: "esp32c3-generic.zip" } | |
- { name: "esp32c6-generic", idf_target: "esp32c6", sdkconfig_file: "configs/sdkconfig.default.esp32c6", zip_name: "esp32c6-generic.zip" } | |
- { name: "Awok V5", idf_target: "esp32s2", sdkconfig_file: "configs/sdkconfig.default.esp32s2", zip_name: "esp32v5_awok.zip"} | |
# Dev Kit configurations (LED on, no screen support) | |
- { name: "esp32c3-devkit", idf_target: "esp32c3", sdkconfig_file: "configs/sdkconfig.devkit.esp32c3", zip_name: "esp32c3-devkit.zip"} | |
- { name: "esp32c6-devkit", idf_target: "esp32c6", sdkconfig_file: "configs/sdkconfig.devkit.esp32c6", zip_name: "esp32c6-devkit.zip"} | |
# Ghost board (LED on, special pin and LED count) | |
- { name: "ghostboard", idf_target: "esp32c6", sdkconfig_file: "configs/sdkconfig.ghostboard", zip_name: "ghostboard.zip"} | |
# Screen-supported builds | |
- { name: "MarauderV4_FlipperHub", idf_target: "esp32", sdkconfig_file: "configs/sdkconfig.marauderv4", zip_name: "MarauderV4_FlipperHub.zip"} | |
- { name: "MarauderV6&AwokDual", idf_target: "esp32", sdkconfig_file: "configs/sdkconfig.marauderv6", zip_name: "MarauderV6_AwokDual.zip"} | |
- { name: "AwokMini", idf_target: "esp32", sdkconfig_file: "configs/sdkconfig.awokmini", zip_name: "AwokMini.zip"} | |
- { name: "ESP32-S3-Cardputer", idf_target: "esp32s3", sdkconfig_file: "configs/sdkconfig.cardputer", zip_name: "ESP32-S3-Cardputer.zip"} | |
- { name: "LillyGoTWatch_S3", idf_target: "esp32s3", sdkconfig_file: "configs/sdkconfig.S3TWatch", zip_name: "lillygos3watch.zip"} | |
# CYD (Cheap Yellow Display) with touch screen | |
- { name: "CYD2USB", idf_target: "esp32", sdkconfig_file: "configs/sdkconfig.CYD2USB", zip_name: "CYD2USB.zip"} | |
- { name: "CYDMicroUSB", idf_target: "esp32", sdkconfig_file: "configs/sdkconfig.CYDMicroUSB", zip_name: "CYDMicroUSB.zip"} | |
- { name: "CYDDualUSB", idf_target: "esp32", sdkconfig_file: "configs/sdkconfig.CYDDualUSB", zip_name: "CYDDualUSB.zip"} | |
- { name: "CYD2USB2.4_Inch", idf_target: "esp32", sdkconfig_file: "configs/sdkconfig.CYD2USB2.4Inch", zip_name: "CYD2USB2.4Inch.zip"} | |
# 7-inch boards | |
- { name: "Waveshare_LCD", idf_target: "esp32s3", sdkconfig_file: "configs/sdkconfig.waveshare7inch", zip_name: "Waveshare_LCD.zip"} | |
- { name: "Crowtech_LCD", idf_target: "esp32s3", sdkconfig_file: "configs/sdkconfig.crowtech7inch", zip_name: "Crowtech_LCD.zip"} | |
steps: | |
- name: Checkout Repository | |
uses: actions/checkout@v3 | |
- name: Set up Python | |
uses: actions/setup-python@v4 | |
with: | |
python-version: '3.9' | |
- name: Install ESP-IDF | |
run: | | |
sudo apt-get update | |
sudo apt-get install -y wget git flex bison gperf python3-pip python3-setuptools cmake ninja-build ccache libffi-dev libssl-dev dfu-util | |
git clone -b v5.3.1 --depth 1 https://github.com/espressif/esp-idf.git ~/esp-idf | |
~/esp-idf/install.sh | |
- name: Apply Custom SDK Config | |
run: | | |
cp "${{ matrix.target.sdkconfig_file }}" sdkconfig.defaults | |
- name: Set up ESP-IDF and Target | |
run: | | |
. ~/esp-idf/export.sh | |
export IDF_TARGET=${{ matrix.target.idf_target }} | |
echo "IDF_TARGET=${{ matrix.target.idf_target }}" >> $GITHUB_ENV | |
- name: Clean and Build Project | |
env: | |
SDKCONFIG_DEFAULTS: "sdkconfig.defaults" | |
run: | | |
. ~/esp-idf/export.sh | |
idf.py clean | |
idf.py build | |
- name: Package Build Artifacts | |
run: | | |
mkdir -p packaged_artifacts | |
cp build/partition_table/partition-table.bin packaged_artifacts/ | |
cp build/*.bin packaged_artifacts/ | |
zip "packaged_artifacts/${{ matrix.target.zip_name }}" packaged_artifacts/* | |
- name: Upload Build Artifacts to GitHub | |
uses: actions/upload-artifact@v3 | |
with: | |
name: ${{ matrix.target.zip_name }} | |
path: packaged_artifacts/${{ matrix.target.zip_name }} | |
upload_all: | |
name: Upload All to Cloudflare R2 and GitHub Release | |
needs: build | |
runs-on: ubuntu-latest | |
steps: | |
- name: Download All Artifacts | |
uses: actions/download-artifact@v3 | |
with: | |
path: all_artifacts | |
- name: Verify and Flatten Artifacts | |
run: | | |
echo "Checking and flattening artifacts..." | |
mkdir -p flat_artifacts | |
if [ -d "all_artifacts" ] && [ "$(ls -A all_artifacts)" ]; then | |
find all_artifacts -type f -exec cp {} flat_artifacts/ \; | |
echo "Flattened artifacts:" | |
ls -lh flat_artifacts | |
else | |
echo "No artifacts found or directory is empty." | |
exit 1 | |
fi | |
- name: Install rclone | |
run: | | |
curl -fsSL https://rclone.org/install.sh | sudo bash | |
- name: Configure rclone for Cloudflare R2 | |
env: | |
R2_ACCESS_KEY: ${{ secrets.R2_ACCESS_KEY }} | |
R2_SECRET_KEY: ${{ secrets.R2_SECRET_KEY }} | |
run: | | |
mkdir -p ~/.config/rclone | |
cat <<EOF > ~/.config/rclone/rclone.conf | |
[cloudflare_r2] | |
type = s3 | |
provider = Cloudflare | |
access_key_id = $R2_ACCESS_KEY | |
secret_access_key = $R2_SECRET_KEY | |
endpoint = https://fb5f7d31bedfe4f3538ddfa6db491962.r2.cloudflarestorage.com | |
no_create_bucket = true | |
EOF | |
- name: Upload All Artifacts to Cloudflare R2 | |
env: | |
R2_BUCKET: "spooksapi" | |
R2_PATH: "GhostESPBins" | |
run: | | |
echo "Uploading artifacts to Cloudflare R2..." | |
for file in flat_artifacts/*; do | |
if [ -f "$file" ]; then | |
echo "Uploading $file..." | |
rclone copy "$file" "cloudflare_r2:${R2_BUCKET}/${R2_PATH}" --progress | |
else | |
echo "Skipping $file as it is not a valid file." | |
fi | |
done | |
echo "All artifacts uploaded successfully." | |
- name: Get the Latest Release ID (Including Pre-releases) | |
id: get_release | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
run: | | |
latest_release=$(curl -s \ | |
-H "Authorization: token $GITHUB_TOKEN" \ | |
-H "Accept: application/vnd.github.v3+json" \ | |
"https://api.github.com/repos/${{ github.repository }}/releases" | jq '[.[] | select(.draft == false)] | .[0]') | |
release_id=$(echo "$latest_release" | jq -r '.id') | |
echo "Latest release ID (including pre-releases) is $release_id" | |
echo "::set-output name=release_id::$release_id" | |
- name: Upload Artifacts to Latest Release | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
run: | | |
for file in flat_artifacts/*; do | |
if [ -f "$file" ] && [ -s "$file" ]; then | |
echo "Uploading $file to GitHub Release..." | |
curl -X POST \ | |
-H "Authorization: token $GITHUB_TOKEN" \ | |
-H "Content-Type: application/zip" \ | |
--data-binary @"$file" \ | |
"https://uploads.github.com/repos/${{ github.repository }}/releases/${{ steps.get_release.outputs.release_id }}/assets?name=$(basename $file)" | |
else | |
echo "Skipping $file as it is either empty or not a valid file." | |
fi | |
done | |
- name: Notify Discord of Successful Upload | |
if: success() | |
env: | |
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} | |
run: | | |
payload=$(cat <<EOF | |
{ | |
"embeds": [ | |
{ | |
"title": "🎉 New Build Artifacts Uploaded!", | |
"description": "All build artifacts have been successfully uploaded to Cloudflare R2 and GitHub Release.", | |
"color": 5814783, | |
"timestamp": "$(date -u +"%Y-%m-%dT%H:%M:%SZ")" | |
} | |
] | |
} | |
EOF | |
) | |
curl -X POST \ | |
-H "Content-Type: application/json" \ | |
-d "$payload" \ | |
"$DISCORD_WEBHOOK_URL" |