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 commit be5e7aa708.
			
			
				pull/31958/head
			
			
		
							parent
							
								
									9feb027de5
								
							
						
					
					
						commit
						c3bbc58a85
					
				
				 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