mirror of
https://github.com/sunnypilot/sunnypilot.git
synced 2026-02-24 15:03:54 +08:00
207 lines
7.9 KiB
YAML
207 lines
7.9 KiB
YAML
name: Build Single Tinygrad Model and Push
|
|
|
|
on:
|
|
workflow_dispatch:
|
|
inputs:
|
|
runner_type:
|
|
description: 'Runner type'
|
|
required: false
|
|
default: '[self-hosted, james-mac]'
|
|
type: choice
|
|
options:
|
|
- ubuntu-latest
|
|
- '[self-hosted, james-mac]'
|
|
build_model_ref:
|
|
description: 'Branch to use for build-model workflow'
|
|
required: false
|
|
default: 'master-new'
|
|
type: string
|
|
upstream_branch:
|
|
description: 'Upstream commit to build from'
|
|
required: true
|
|
type: string
|
|
custom_name:
|
|
description: 'Custom name for the model (no date, only name)'
|
|
required: false
|
|
type: string
|
|
recompiled_dir:
|
|
description: 'Existing recompiled directory number (e.g. 3 for recompiled3)'
|
|
required: true
|
|
type: number
|
|
json_version:
|
|
description: 'driving_models version number to update (e.g. 5 for driving_models_v5.json)'
|
|
required: true
|
|
type: number
|
|
model_folder:
|
|
description: 'Model folder'
|
|
required: true
|
|
type: choice
|
|
options:
|
|
- Simple Plan Models
|
|
- TR Models
|
|
- DTR Models
|
|
- Custom Merge Models
|
|
- FOF series models
|
|
- Other
|
|
custom_model_folder:
|
|
description: 'Custom model folder name (if "Other" selected)'
|
|
required: false
|
|
type: string
|
|
generation:
|
|
description: 'Model generation'
|
|
required: false
|
|
type: number
|
|
version:
|
|
description: 'Minimum selector version'
|
|
required: false
|
|
type: number
|
|
|
|
jobs:
|
|
build-single:
|
|
runs-on: ${{ github.event.inputs.runner_type }}
|
|
env:
|
|
RECOMPILED_DIR: recompiled${{ github.event.inputs.recompiled_dir }}
|
|
JSON_FILE: docs/docs/driving_models_v${{ github.event.inputs.json_version }}.json
|
|
steps:
|
|
- name: Set up SSH
|
|
uses: webfactory/ssh-agent@v0.9.0
|
|
with:
|
|
ssh-private-key: ${{ secrets.GITLAB_SSH_PRIVATE_KEY }}
|
|
|
|
- name: Add GitLab.com SSH key to known_hosts
|
|
run: |
|
|
mkdir -p ~/.ssh
|
|
ssh-keyscan -H gitlab.com >> ~/.ssh/known_hosts
|
|
|
|
- name: Clone GitLab docs repo
|
|
env:
|
|
GIT_SSH_COMMAND: 'ssh -o UserKnownHostsFile=~/.ssh/known_hosts'
|
|
run: |
|
|
echo "Cloning GitLab"
|
|
git clone --depth 1 --filter=tree:0 --sparse git@gitlab.com:sunnypilot/public/docs.sunnypilot.ai2.git gitlab_docs
|
|
cd gitlab_docs
|
|
echo "checkout models/${RECOMPILED_DIR}"
|
|
git sparse-checkout set --no-cone models/${RECOMPILED_DIR}
|
|
git checkout main
|
|
cd ..
|
|
|
|
- name: Checkout docs repo
|
|
uses: actions/checkout@v4
|
|
with:
|
|
repository: sunnypilot/sunnypilot-docs
|
|
ref: gh-pages
|
|
path: docs
|
|
ssh-key: ${{ secrets.CI_SUNNYPILOT_DOCS_PRIVATE_KEY }}
|
|
|
|
- name: Validate recompiled dir and JSON version
|
|
run: |
|
|
if [ ! -d "gitlab_docs/models/$RECOMPILED_DIR" ]; then
|
|
echo "Recompiled dir $RECOMPILED_DIR does not exist in GitLab repo"
|
|
exit 1
|
|
fi
|
|
if [ ! -f "$JSON_FILE" ]; then
|
|
echo "JSON file $JSON_FILE does not exist!"
|
|
exit 1
|
|
fi
|
|
|
|
- name: Install dependencies
|
|
run: |
|
|
sudo apt-get update
|
|
sudo apt-get install -y jq gh
|
|
|
|
- name: Build model
|
|
env:
|
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
run: |
|
|
START_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
gh workflow run sunnypilot-build-model.yaml \
|
|
--repo sunnypilot/sunnypilot \
|
|
--ref "${{ github.event.inputs.build_model_ref }}" \
|
|
-f upstream_branch="${{ github.event.inputs.upstream_branch }}" \
|
|
-f custom_name="${{ github.event.inputs.custom_name }}"
|
|
|
|
for i in {1..24}; do
|
|
RUN_ID=$(gh run list --repo sunnypilot/sunnypilot --workflow=sunnypilot-build-model.yaml --branch="${{ github.event.inputs.build_model_ref }}" --created ">$START_TIME" --limit=1 --json databaseId --jq '.[0].databaseId')
|
|
if [ -n "$RUN_ID" ]; then
|
|
break
|
|
fi
|
|
sleep 5
|
|
done
|
|
|
|
if [ -z "$RUN_ID" ]; then
|
|
echo "Could not find the triggered workflow run."
|
|
exit 1
|
|
fi
|
|
|
|
echo "Watching run ID: $RUN_ID"
|
|
gh run watch "$RUN_ID" --repo sunnypilot/sunnypilot
|
|
CONCLUSION=$(gh run view "$RUN_ID" --repo sunnypilot/sunnypilot --json conclusion --jq '.conclusion')
|
|
echo "Run concluded with: $CONCLUSION"
|
|
if [[ "$CONCLUSION" != "success" ]]; then
|
|
echo "Workflow run failed with conclusion: $CONCLUSION"
|
|
exit 1
|
|
fi
|
|
|
|
- name: Download and extract model artifact
|
|
env:
|
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
run: |
|
|
ARTIFACT_DIR="gitlab_docs/models/$RECOMPILED_DIR"
|
|
RUN_ID=$(gh run list --repo sunnypilot/sunnypilot --workflow=sunnypilot-build-model.yaml --branch="${{ github.event.inputs.build_model_ref }}" --limit=1 --json databaseId --jq '.[0].databaseId')
|
|
ARTIFACT_NAME=$(gh api repos/sunnypilot/sunnypilot/actions/runs/$RUN_ID/artifacts --jq '.artifacts[] | select(.name | startswith("model-")) | .name')
|
|
echo "Downloading artifact: $ARTIFACT_NAME from run: $RUN_ID"
|
|
mkdir -p "$ARTIFACT_DIR/$ARTIFACT_NAME"
|
|
echo "Created directory: $ARTIFACT_DIR/$ARTIFACT_NAME"
|
|
gh run download "$RUN_ID" --repo sunnypilot/sunnypilot -n "$ARTIFACT_NAME" --dir "$ARTIFACT_DIR/$ARTIFACT_NAME"
|
|
echo "Downloaded artifact zip(s) to: $ARTIFACT_DIR/$ARTIFACT_NAME"
|
|
ZIP_PATH=$(find "$ARTIFACT_DIR/$ARTIFACT_NAME" -type f -name '*.zip' | head -n1)
|
|
if [ -n "$ZIP_PATH" ]; then
|
|
echo "Unzipping $ZIP_PATH to $ARTIFACT_DIR/$ARTIFACT_NAME"
|
|
unzip -o "$ZIP_PATH" -d "$ARTIFACT_DIR/$ARTIFACT_NAME"
|
|
rm -f "$ZIP_PATH"
|
|
echo "Unzipped and removed $ZIP_PATH"
|
|
else
|
|
echo "No zip file found in $ARTIFACT_DIR/$ARTIFACT_NAME"
|
|
fi
|
|
echo "Done processing $ARTIFACT_NAME"
|
|
|
|
- name: Push recompiled dir to GitLab
|
|
env:
|
|
GITLAB_SSH_PRIVATE_KEY: ${{ secrets.GITLAB_SSH_PRIVATE_KEY }}
|
|
run: |
|
|
cd gitlab_docs
|
|
git checkout main
|
|
for d in models/"$RECOMPILED_DIR"/*/; do
|
|
git sparse-checkout add "$d"
|
|
done
|
|
git add models/"$RECOMPILED_DIR"
|
|
git config --global user.name "GitHub Action"
|
|
git config --global user.email "action@github.com"
|
|
git commit -m "Update $RECOMPILED_DIR with new/updated model from build-single-tinygrad-model" || echo "No changes to commit"
|
|
git push origin main
|
|
|
|
- name: Run json_parser.py to update JSON
|
|
run: |
|
|
FOLDER="${{ github.event.inputs.model_folder }}"
|
|
if [ "$FOLDER" = "Other" ]; then
|
|
FOLDER="${{ github.event.inputs.custom_model_folder }}"
|
|
fi
|
|
ARGS=""
|
|
[ -n "$FOLDER" ] && ARGS="$ARGS --model-folder \"$FOLDER\""
|
|
[ -n "${{ github.event.inputs.generation }}" ] && ARGS="$ARGS --generation \"${{ github.event.inputs.generation }}\""
|
|
[ -n "${{ github.event.inputs.version }}" ] && ARGS="$ARGS --version \"${{ github.event.inputs.version }}\""
|
|
eval python3 docs/json_parser.py \
|
|
--json-path "$JSON_FILE" \
|
|
--recompiled-dir "gitlab_docs/models/$RECOMPILED_DIR" \
|
|
$ARGS
|
|
|
|
- name: Push updated JSON to GitHub docs repo
|
|
run: |
|
|
cd docs
|
|
git config --global user.name "GitHub Action"
|
|
git config --global user.email "action@github.com"
|
|
git checkout gh-pages
|
|
git add docs/"$(basename $JSON_FILE)"
|
|
git commit -m "Update $(basename $JSON_FILE) after recompiling model" || echo "No changes to commit"
|
|
git push origin gh-pages
|