build nightly casync build in jenkins (#31880)
* casync in jenkins * rename some stuff, add a readme * slightly better names * clean * more cleanup * cleaner * release3 staging too * always rm the signed version * cleanups * in build dir * better name * simpler * more * divider * built * build * and contains * add channel description * and git branches * and build required * move this up * these are terms * updates * 3/3x * bullets * wording * version metadata * git type * more channel -> release * more build * just release * more channel to release * also fix jenkins * use build_metadata * fix normailzed * also normalized * and here * use build_metadata * dont commit that * don't touch the git stuff * branch * don't need that * or that * improved names * build_metadata * use this instead * fix * build * test nightly build again * fix * fixes * Revert "test nightly build again" This reverts commitpull/32199/headbe5e7aa708
. old-commit-hash:c3bbc58a85
parent
8a43c4f45c
commit
ad3ae98a19
8 changed files with 220 additions and 6 deletions
@ -0,0 +1,44 @@ |
|||||||
|
# openpilot releases |
||||||
|
|
||||||
|
|
||||||
|
## terms |
||||||
|
|
||||||
|
- `channel` - a named version of openpilot (git branch, casync caidx) which receives updates |
||||||
|
- `build` - a release which is already built for the comma 3/3x and contains only required files for running openpilot and identifying the release |
||||||
|
|
||||||
|
- `build_style` - type of build, either `debug` or `release` |
||||||
|
- `debug` - build with `ALLOW_DEBUG=true`, can test experimental features like longitudinal on alpha cars |
||||||
|
- `release` - build with `ALLOW_DEBUG=false`, experimental features disabled |
||||||
|
|
||||||
|
|
||||||
|
## openpilot channels |
||||||
|
|
||||||
|
| channel | build_style | description | |
||||||
|
| ----------- | ----------- | ---------- | |
||||||
|
| release | `release` | stable release of openpilot | |
||||||
|
| staging | `release` | release candidate of openpilot for final verification | |
||||||
|
| nightly | `release` | generated nightly from last commit passing CI tests | |
||||||
|
| master | `debug` | current master commit with experimental features enabled | |
||||||
|
| git branches | `debug` | installed manually, experimental features enabled, build required | |
||||||
|
|
||||||
|
|
||||||
|
## creating casync build |
||||||
|
|
||||||
|
`create_casync_build.sh` - creates a casync openpilot build, ready to upload to `openpilot-releases` |
||||||
|
|
||||||
|
```bash |
||||||
|
# run on a tici, within the directory you want to create the build from. |
||||||
|
# creates a prebuilt version of openpilot into BUILD_DIR and outputs the caidx |
||||||
|
# and other casync files into CASYNC_DIR for uploading to openpilot-releases. |
||||||
|
BUILD_DIR=/data/openpilot_build \ |
||||||
|
CASYNC_DIR=/data/casync \ |
||||||
|
OPENPILOT_CHANNEL=nightly \ |
||||||
|
release/create_casync_build.sh |
||||||
|
``` |
||||||
|
|
||||||
|
`upload_casync_release.sh` - helper for uploading a casync build to `openpilot-releases` |
||||||
|
|
||||||
|
|
||||||
|
## release builds |
||||||
|
|
||||||
|
to create a release build, set `RELEASE=1` environment variable when running the build script |
@ -0,0 +1,15 @@ |
|||||||
|
#!/bin/bash |
||||||
|
|
||||||
|
SOURCE_DIR=$1 |
||||||
|
TARGET_DIR=$2 |
||||||
|
|
||||||
|
if [ -f /TICI ]; then |
||||||
|
FILES_SRC="release/files_tici" |
||||||
|
else |
||||||
|
echo "no release files set" |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
|
||||||
|
cd $SOURCE_DIR |
||||||
|
cp -pR --parents $(cat release/files_common) $BUILD_DIR/ |
||||||
|
cp -pR --parents $(cat $FILES_SRC) $TARGET_DIR/ |
@ -0,0 +1,21 @@ |
|||||||
|
#!/usr/bin/bash |
||||||
|
|
||||||
|
set -ex |
||||||
|
|
||||||
|
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" |
||||||
|
|
||||||
|
CASYNC_DIR="${CASYNC_DIR:=/tmp/casync}" |
||||||
|
SOURCE_DIR="$(git -C $DIR rev-parse --show-toplevel)" |
||||||
|
BUILD_DIR="${BUILD_DIR:=$(mktemp -d)}" |
||||||
|
|
||||||
|
echo "Creating casync release from $SOURCE_DIR to $CASYNC_DIR" |
||||||
|
|
||||||
|
mkdir -p $CASYNC_DIR |
||||||
|
rm -rf $BUILD_DIR |
||||||
|
mkdir -p $BUILD_DIR |
||||||
|
|
||||||
|
release/copy_build_files.sh $SOURCE_DIR $BUILD_DIR |
||||||
|
release/create_prebuilt.sh $BUILD_DIR |
||||||
|
|
||||||
|
cd $SOURCE_DIR |
||||||
|
release/create_casync_release.py $BUILD_DIR $CASYNC_DIR $OPENPILOT_CHANNEL |
@ -0,0 +1,25 @@ |
|||||||
|
#!/usr/bin/env python |
||||||
|
|
||||||
|
import argparse |
||||||
|
import pathlib |
||||||
|
|
||||||
|
from openpilot.system.updated.casync.common import create_caexclude_file, create_casync_release, create_build_metadata_file |
||||||
|
from openpilot.system.version import get_build_metadata |
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__": |
||||||
|
parser = argparse.ArgumentParser(description="creates a casync release") |
||||||
|
parser.add_argument("target_dir", type=str, help="target directory to build channel from") |
||||||
|
parser.add_argument("output_dir", type=str, help="output directory for the channel") |
||||||
|
parser.add_argument("channel", type=str, help="what channel this build is") |
||||||
|
args = parser.parse_args() |
||||||
|
|
||||||
|
target_dir = pathlib.Path(args.target_dir) |
||||||
|
output_dir = pathlib.Path(args.output_dir) |
||||||
|
|
||||||
|
create_build_metadata_file(target_dir, get_build_metadata(), args.channel) |
||||||
|
create_caexclude_file(target_dir) |
||||||
|
|
||||||
|
digest, caidx = create_casync_release(target_dir, output_dir, args.channel) |
||||||
|
|
||||||
|
print(f"Created casync release from {target_dir} to {caidx} with digest {digest}") |
@ -0,0 +1,34 @@ |
|||||||
|
#!/usr/bin/bash -e |
||||||
|
|
||||||
|
# runs on tici to create a prebuilt version of a release |
||||||
|
|
||||||
|
set -ex |
||||||
|
|
||||||
|
BUILD_DIR=$1 |
||||||
|
|
||||||
|
cd $BUILD_DIR |
||||||
|
|
||||||
|
# Build |
||||||
|
export PYTHONPATH="$BUILD_DIR" |
||||||
|
|
||||||
|
rm -f panda/board/obj/panda.bin.signed |
||||||
|
rm -f panda/board/obj/panda_h7.bin.signed |
||||||
|
|
||||||
|
if [ -n "$RELEASE" ]; then |
||||||
|
export CERT=/data/pandaextra/certs/release |
||||||
|
fi |
||||||
|
|
||||||
|
scons -j$(nproc) |
||||||
|
|
||||||
|
# Cleanup |
||||||
|
find . -name '*.a' -delete |
||||||
|
find . -name '*.o' -delete |
||||||
|
find . -name '*.os' -delete |
||||||
|
find . -name '*.pyc' -delete |
||||||
|
find . -name 'moc_*' -delete |
||||||
|
find . -name '__pycache__' -delete |
||||||
|
rm -rf .sconsign.dblite Jenkinsfile release/ |
||||||
|
rm selfdrive/modeld/models/supercombo.onnx |
||||||
|
|
||||||
|
# Mark as prebuilt release |
||||||
|
touch prebuilt |
@ -0,0 +1,9 @@ |
|||||||
|
#!/bin/bash |
||||||
|
|
||||||
|
CASYNC_DIR="${CASYNC_DIR:=/tmp/casync}" |
||||||
|
|
||||||
|
OPENPILOT_RELEASES="https://commadist.blob.core.windows.net/openpilot-releases/" |
||||||
|
|
||||||
|
SAS="$(python -c 'from tools.lib.azure_container import get_container_sas;print(get_container_sas("commadist","openpilot-releases"))')" |
||||||
|
|
||||||
|
azcopy cp "$CASYNC_DIR*" "$OPENPILOT_RELEASES?$SAS" --recursive |
@ -0,0 +1,53 @@ |
|||||||
|
import dataclasses |
||||||
|
import json |
||||||
|
import pathlib |
||||||
|
import subprocess |
||||||
|
|
||||||
|
from openpilot.system.version import BUILD_METADATA_FILENAME, BuildMetadata |
||||||
|
|
||||||
|
|
||||||
|
CASYNC_ARGS = ["--with=symlinks", "--with=permissions"] |
||||||
|
CASYNC_FILES = [BUILD_METADATA_FILENAME, ".caexclude"] |
||||||
|
|
||||||
|
|
||||||
|
def run(cmd): |
||||||
|
return subprocess.check_output(cmd) |
||||||
|
|
||||||
|
|
||||||
|
def get_exclude_set(path) -> set[str]: |
||||||
|
exclude_set = set(CASYNC_FILES) |
||||||
|
|
||||||
|
for file in path.rglob("*"): |
||||||
|
if file.is_file() or file.is_symlink(): |
||||||
|
|
||||||
|
while file.resolve() != path.resolve(): |
||||||
|
exclude_set.add(str(file.relative_to(path))) |
||||||
|
|
||||||
|
file = file.parent |
||||||
|
|
||||||
|
return exclude_set |
||||||
|
|
||||||
|
|
||||||
|
def create_caexclude_file(path: pathlib.Path): |
||||||
|
with open(path / ".caexclude", "w") as f: |
||||||
|
# exclude everything except the paths already in the release |
||||||
|
f.write("*\n") |
||||||
|
f.write(".*\n") |
||||||
|
|
||||||
|
for file in sorted(get_exclude_set(path)): |
||||||
|
f.write(f"!{file}\n") |
||||||
|
|
||||||
|
|
||||||
|
def create_build_metadata_file(path: pathlib.Path, build_metadata: BuildMetadata, channel: str): |
||||||
|
with open(path / BUILD_METADATA_FILENAME, "w") as f: |
||||||
|
build_metadata_dict = dataclasses.asdict(build_metadata) |
||||||
|
build_metadata_dict["channel"] = channel |
||||||
|
build_metadata_dict["openpilot"].pop("is_dirty") # this is determined at runtime |
||||||
|
f.write(json.dumps(build_metadata_dict)) |
||||||
|
|
||||||
|
|
||||||
|
def create_casync_release(target_dir: pathlib.Path, output_dir: pathlib.Path, channel: str): |
||||||
|
caidx_file = output_dir / f"{channel}.caidx" |
||||||
|
run(["casync", "make", *CASYNC_ARGS, caidx_file, target_dir]) |
||||||
|
digest = run(["casync", "digest", *CASYNC_ARGS, target_dir]).decode("utf-8").strip() |
||||||
|
return digest, caidx_file |
Loading…
Reference in new issue