6 changed files with 235 additions and 28 deletions
@ -0,0 +1,77 @@ |
|||||||
|
name: Deploy metadata for all targets |
||||||
|
|
||||||
|
on: |
||||||
|
push: |
||||||
|
branches: |
||||||
|
- 'master' |
||||||
|
- 'release/*' |
||||||
|
- 'pr-metadata-test' |
||||||
|
|
||||||
|
jobs: |
||||||
|
enumerate_targets: |
||||||
|
runs-on: ubuntu-latest |
||||||
|
outputs: |
||||||
|
matrix: ${{ steps.set-matrix.outputs.matrix }} |
||||||
|
steps: |
||||||
|
- uses: actions/checkout@v1 |
||||||
|
with: |
||||||
|
token: ${{secrets.ACCESS_TOKEN}} |
||||||
|
- id: set-matrix |
||||||
|
run: echo "::set-output name=matrix::$(./Tools/generate_board_targets_json.py)" |
||||||
|
build: |
||||||
|
runs-on: ubuntu-latest |
||||||
|
needs: enumerate_targets |
||||||
|
strategy: |
||||||
|
matrix: ${{fromJson(needs.enumerate_targets.outputs.matrix)}} |
||||||
|
container: px4io/px4-dev-${{ matrix.container }}:2021-02-04 |
||||||
|
steps: |
||||||
|
- uses: actions/checkout@v1 |
||||||
|
with: |
||||||
|
token: ${{secrets.ACCESS_TOKEN}} |
||||||
|
|
||||||
|
- name: Prepare ccache timestamp |
||||||
|
id: ccache_cache_timestamp |
||||||
|
shell: cmake -P {0} |
||||||
|
run: | |
||||||
|
string(TIMESTAMP current_date "%Y-%m-%d-%H;%M;%S" UTC) |
||||||
|
message("::set-output name=timestamp::${current_date}") |
||||||
|
- name: ccache cache files |
||||||
|
uses: actions/cache@v2 |
||||||
|
with: |
||||||
|
path: ~/.ccache |
||||||
|
key: ${{matrix.target}}-ccache-${{steps.ccache_cache_timestamp.outputs.timestamp}} |
||||||
|
restore-keys: ${{matrix.target}}-ccache- |
||||||
|
- name: setup ccache |
||||||
|
run: | |
||||||
|
mkdir -p ~/.ccache |
||||||
|
echo "base_dir = ${GITHUB_WORKSPACE}" > ~/.ccache/ccache.conf |
||||||
|
echo "compression = true" >> ~/.ccache/ccache.conf |
||||||
|
echo "compression_level = 5" >> ~/.ccache/ccache.conf |
||||||
|
echo "max_size = 100M" >> ~/.ccache/ccache.conf |
||||||
|
ccache -s |
||||||
|
ccache -z |
||||||
|
|
||||||
|
- name: make ${{matrix.target}} |
||||||
|
run: make ${{matrix.target}} |
||||||
|
- name: ccache post-run |
||||||
|
run: ccache -s |
||||||
|
|
||||||
|
- name: parameter metadata |
||||||
|
run: | |
||||||
|
make ${{matrix.target}} ver_gen |
||||||
|
./src/lib/version/get_git_tag_or_branch_version.sh build/${{ matrix.target }} >> $GITHUB_ENV |
||||||
|
cd build/${{ matrix.target }} |
||||||
|
mkdir _metadata || true |
||||||
|
cp parameters.* _metadata |
||||||
|
|
||||||
|
- uses: jakejarvis/s3-sync-action@master |
||||||
|
with: |
||||||
|
args: --acl public-read |
||||||
|
env: |
||||||
|
AWS_S3_BUCKET: 'px4-travis' |
||||||
|
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} |
||||||
|
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} |
||||||
|
AWS_REGION: 'us-west-1' |
||||||
|
SOURCE_DIR: 'build/${{ matrix.target }}/_metadata/' |
||||||
|
DEST_DIR: 'Firmware/${{ env.version }}/${{ matrix.target }}/' |
||||||
|
|
@ -0,0 +1,92 @@ |
|||||||
|
#!/usr/bin/env python3 |
||||||
|
""" Script to generate a JSON config with all build targets (for CI) """ |
||||||
|
|
||||||
|
import argparse |
||||||
|
import os |
||||||
|
import sys |
||||||
|
import json |
||||||
|
import re |
||||||
|
|
||||||
|
source_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..') |
||||||
|
|
||||||
|
parser = argparse.ArgumentParser(description='Generate build targets') |
||||||
|
|
||||||
|
parser.add_argument('-v', '--verbose', dest='verbose', action='store_true', |
||||||
|
help='Verbose Output') |
||||||
|
parser.add_argument('-p', '--pretty', dest='pretty', action='store_true', |
||||||
|
help='Pretty output instead of a single line') |
||||||
|
|
||||||
|
args = parser.parse_args() |
||||||
|
verbose = args.verbose |
||||||
|
|
||||||
|
build_configs = [] |
||||||
|
excluded_manufacturers = ['atlflight'] |
||||||
|
excluded_platforms = ['qurt'] |
||||||
|
excluded_labels = ['stackcheck', 'nolockstep', 'replay', 'test'] |
||||||
|
|
||||||
|
def process_target(cmake_file, target_name): |
||||||
|
ret = None |
||||||
|
is_board_def = False |
||||||
|
platform = None |
||||||
|
toolchain = None |
||||||
|
for line in open(cmake_file, 'r'): |
||||||
|
if 'px4_add_board' in line: |
||||||
|
is_board_def = True |
||||||
|
if not is_board_def: |
||||||
|
continue |
||||||
|
|
||||||
|
re_platform = re.search('PLATFORM\s+([^\s]+)', line) |
||||||
|
if re_platform: platform = re_platform.group(1) |
||||||
|
|
||||||
|
re_toolchain = re.search('TOOLCHAIN\s+([^\s]+)', line) |
||||||
|
if re_toolchain: toolchain = re_toolchain.group(1) |
||||||
|
|
||||||
|
if is_board_def: |
||||||
|
assert platform, f"PLATFORM not found in {cmake_file}" |
||||||
|
|
||||||
|
if platform not in excluded_platforms: |
||||||
|
# get the container based on the platform and toolchain |
||||||
|
container = platform |
||||||
|
if platform == 'posix': |
||||||
|
container = 'base-focal' |
||||||
|
if toolchain: |
||||||
|
if toolchain.startswith('aarch64'): |
||||||
|
container = 'aarch64' |
||||||
|
elif toolchain == 'arm-linux-gnueabihf': |
||||||
|
container = 'armhf' |
||||||
|
else: |
||||||
|
if verbose: print(f'possibly unmatched toolchain: {toolchain}') |
||||||
|
elif platform == 'nuttx': |
||||||
|
container = 'nuttx-focal' |
||||||
|
|
||||||
|
ret = {'target': target_name, 'container': container} |
||||||
|
return ret |
||||||
|
|
||||||
|
for manufacturer in os.scandir(os.path.join(source_dir, 'boards')): |
||||||
|
if not manufacturer.is_dir(): |
||||||
|
continue |
||||||
|
if manufacturer.name in excluded_manufacturers: |
||||||
|
if verbose: print(f'excluding manufacturer {manufacturer.name}') |
||||||
|
continue |
||||||
|
|
||||||
|
for board in os.scandir(manufacturer.path): |
||||||
|
if not board.is_dir(): |
||||||
|
continue |
||||||
|
for files in os.scandir(board.path): |
||||||
|
if files.is_file() and files.name.endswith('.cmake'): |
||||||
|
label = files.name[:-6] |
||||||
|
target_name = manufacturer.name + '_' + board.name + '_' + label |
||||||
|
if label in excluded_labels: |
||||||
|
if verbose: print(f'excluding label {label} ({target_name})') |
||||||
|
continue |
||||||
|
target = process_target(files.path, target_name) |
||||||
|
if target is not None: |
||||||
|
build_configs.append(target) |
||||||
|
|
||||||
|
|
||||||
|
github_action_config = { 'include': build_configs } |
||||||
|
extra_args = {} |
||||||
|
if args.pretty: |
||||||
|
extra_args['indent'] = 2 |
||||||
|
print(json.dumps(github_action_config, **extra_args)) |
||||||
|
|
@ -0,0 +1,21 @@ |
|||||||
|
#!/usr/bin/env bash |
||||||
|
|
||||||
|
set -e |
||||||
|
|
||||||
|
# Script to extract PX4_GIT_TAG_OR_BRANCH_NAME to be used by CI |
||||||
|
|
||||||
|
build_dir="$1" |
||||||
|
if [ ! -d "$build_dir" ]; then |
||||||
|
echo "usage: $0 <build directory>" |
||||||
|
exit -1 |
||||||
|
fi |
||||||
|
|
||||||
|
version_file="$build_dir/src/lib/version/build_git_version.h" |
||||||
|
|
||||||
|
if [ ! -f "$version_file" ]; then |
||||||
|
echo "Version file not found. Did you run the target 'ver_gen'?" |
||||||
|
exit -1 |
||||||
|
fi |
||||||
|
|
||||||
|
sed -n 's/.*PX4_GIT_TAG_OR_BRANCH_NAME\s*"\(.*\)".*/version=\1/p' "$version_file" |
||||||
|
|
Loading…
Reference in new issue