Skip to content

Additional changes for review #1387

Additional changes for review

Additional changes for review #1387

Workflow file for this run

# Build library and examples, and generate releases.
name: FusionEngine Client Build
on:
push:
# Build on a push to any branch.
branches:
- '*'
# Build on a push of any tag named v* (v1.0, etc.) and generate a release.
tags:
- 'v*'
jobs:
# Check code style.
check_style:
name: Check Style
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
# Check Python formatting.
- name: Check Python Formatting
id: autopep8
uses: peter-evans/autopep8@v1
with:
args: --in-place python/fusion_engine_client python/examples python/bin python/tests
- name: Test Python Result
if: steps.autopep8.outputs.exit-code == 2
run: exit 1
# Check C++ formatting.
- name: Check C++ Formatting
uses: jidicula/[email protected]
with:
clang-format-version: '13'
check-path: '.'
# Build the library and example applications (Bazel). Currently Linux only.
build_bazel:
name: Bazel Build
runs-on: ${{ matrix.os }}
strategy:
matrix:
include:
- os: ubuntu-latest
compiler: gcc
version: 9
- os: ubuntu-latest
compiler: gcc
version: 10
- os: ubuntu-latest
compiler: clang
version: 11
steps:
- uses: actions/checkout@v2
# Compile.
- name: Install Bazel 4.2.2
uses: abhinavsingh/setup-bazel@v3
with:
version: 4.2.2
- name: Setup Environment (Linux)
if: matrix.os == 'ubuntu-latest'
run: |
if [[ "${{ matrix.compiler }}" == "gcc" ]]; then
sudo apt install gcc-${{ matrix.version }} g++-${{ matrix.version }}
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-${{ matrix.version }} 100 \
--slave /usr/bin/g++ g++ /usr/bin/g++-${{ matrix.version }} \
--slave /usr/bin/gcov gcov /usr/bin/gcov-${{ matrix.version }}
sudo update-alternatives --set gcc /usr/bin/gcc-${{ matrix.version }}
echo "CC=/usr/bin/g++-${{ matrix.version }}" >> $GITHUB_ENV
else
sudo apt install clang-${{ matrix.version }}
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-${{ matrix.version }} 100
sudo update-alternatives --set clang /usr/bin/clang-${{ matrix.version }}
echo "CC=/usr/bin/clang++-${{ matrix.version }}" >> $GITHUB_ENV
fi
- name: Build Library
run: |
bazel build -c opt //:*
- name: Build Examples
run: |
cd examples &&
bazel build -c opt //:*
- name: Install Test Files
run: |
mkdir test
cp examples/bazel-bin/message_decode/message_decode ./test/
cp examples/bazel-bin/generate_data/generate_data ./test/
cp examples/message_decode/example_data.p1log ./test/
# Run unit tests.
- name: Test Message Decoding
run: |
cd test
./message_decode example_data.p1log
- name: Test Message Encoding
run: |
cd test
./generate_data new_data.p1log &&
./message_decode new_data.p1log
# Build the library and example applications (CMake).
build_cmake:
name: CMake Build
runs-on: ${{ matrix.os }}
strategy:
matrix:
include:
- os: ubuntu-latest
compiler: gcc
version: 9
- os: ubuntu-latest
compiler: gcc
version: 10
- os: ubuntu-latest
compiler: clang
version: 11
- os: windows-latest
compiler: msvc
defaults:
run:
shell: bash
steps:
- uses: actions/checkout@v2
# Compile.
- name: Install CMake 3.16.x
uses: jwlawson/[email protected]
with:
cmake-version: '3.16.x'
- name: Configure VS Toolchain (Windows)
if: matrix.os == 'windows-latest'
uses: ilammy/msvc-dev-cmd@v1
- name: Setup Environment (Windows)
if: matrix.os == 'windows-latest'
run: |
echo "EXT=.exe" >> $GITHUB_ENV
- name: Setup Environment (Linux)
if: matrix.os == 'ubuntu-latest'
run: |
if [[ "${{ matrix.compiler }}" == "gcc" ]]; then
sudo apt install gcc-${{ matrix.version }} g++-${{ matrix.version }}
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-${{ matrix.version }} 100 \
--slave /usr/bin/g++ g++ /usr/bin/g++-${{ matrix.version }} \
--slave /usr/bin/gcov gcov /usr/bin/gcov-${{ matrix.version }}
sudo update-alternatives --set gcc /usr/bin/gcc-${{ matrix.version }}
echo "CC=/usr/bin/gcc-${{ matrix.version }}" >> $GITHUB_ENV
echo "CXX=/usr/bin/g++-${{ matrix.version }}" >> $GITHUB_ENV
else
sudo apt install clang-${{ matrix.version }}
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-${{ matrix.version }} 100
sudo update-alternatives --set clang /usr/bin/clang-${{ matrix.version }}
echo "CC=/usr/bin/clang-${{ matrix.version }}" >> $GITHUB_ENV
echo "CXX=/usr/bin/clang++-${{ matrix.version }}" >> $GITHUB_ENV
fi
echo "EXT=" >> $GITHUB_ENV
- name: Setup Build
run: |
mkdir cmake_build
cd cmake_build
cmake -DCMAKE_INSTALL_PREFIX=install ..
- name: Build Library And Examples (Linux)
if: matrix.os == 'ubuntu-latest'
run: |
cd cmake_build
make
make install
- name: Install Test Files (Linux)
if: matrix.os == 'ubuntu-latest'
run: |
mkdir test
cp cmake_build/examples/message_decode/message_decode ./test/
cp cmake_build/examples/generate_data/generate_data ./test/
cp examples/message_decode/example_data.p1log ./test/
- name: Build Library And Examples (Windows)
if: matrix.os == 'windows-latest'
run: |
cd cmake_build
nmake
nmake install
- name: Install Test Files (Windows)
if: matrix.os == 'windows-latest'
run: |
mkdir test
cp cmake_build/fusion_engine_client.dll ./test/
cp cmake_build/examples/message_decode/message_decode.exe ./test/
cp cmake_build/examples/generate_data/generate_data.exe ./test/
cp examples/message_decode/example_data.p1log ./test/
- name: Build External Project Example (CMake, Linux)
if: matrix.os == 'ubuntu-latest'
run: |
mkdir examples/external_cmake_project/build
cd examples/external_cmake_project/build
cmake ..
make
# Run unit tests.
- name: Test Message Decoding
run: |
cd test
./message_decode${EXT} example_data.p1log
- name: Test Message Encoding
run: |
cd test
./generate_data${EXT} new_data.p1log
./message_decode${EXT} new_data.p1log
# Build the documentation.
build_doxygen:
name: Documentation Build
runs-on: ubuntu-latest
strategy:
matrix:
doxygen: [1_8_18]
steps:
- uses: actions/checkout@v2
with:
# Note: Checking out with full tag history for version query below.
fetch-depth: 0
- name: Setup Doxygen Cache
uses: actions/cache@v2
id: cache-doxygen
with:
path: |
doxygen
key: doxygen-source-${{ matrix.doxygen }}
- name: Install CMake 3.16.x
uses: jwlawson/[email protected]
with:
cmake-version: '3.16.x'
- name: Build Doxygen
if: steps.cache-doxygen.outputs.cache-hit != 'true'
run: |
sudo apt install -y flex bison
git clone --depth 1 --branch Release_${{ matrix.doxygen }} https://github.com/doxygen/doxygen.git
mkdir doxygen/build
cd doxygen/build
cmake ..
make -j4
- name: Install Doxygen
run: |
cd doxygen/build
sudo make install
- name: Extract Tag Name
if: startsWith(github.ref, 'refs/tags/') || endsWith(github.ref, '/master')
run: echo "GIT_TAG=${GITHUB_REF##*/}" >> $GITHUB_ENV
- name: Extract Commit Hash
if: "!(startsWith(github.ref, 'refs/tags/') || endsWith(github.ref, '/master'))"
run: echo "GIT_TAG=${GITHUB_SHA}" >> $GITHUB_ENV
- name: Build Documentation
run: |
echo "Setting documentation version to: ${GIT_TAG}"
pip install packaging
python3 docs/update_versions.py ${GIT_TAG}
doxygen Doxyfile.version
cp docs/include_header.js docs/html/
tar czf fusion-engine-client-docs.tar.gz docs/html --transform 's|^docs/html|fusion-engine-client/docs/html|'
tar czf version-docs.tar.gz docs/include_header.js docs/versions.html
- name: Upload Artifact
uses: actions/upload-artifact@v1
with:
name: fusion-engine-client-docs.tar.gz
path: fusion-engine-client-docs.tar.gz
- name: Upload Versioned Files
uses: actions/upload-artifact@v1
with:
name: version-docs.tar.gz
path: version-docs.tar.gz
# Upload release (v*) or master documentation to S3.
upload_doxygen:
name: Upload Documentation
if: startsWith(github.ref, 'refs/tags/') || endsWith(github.ref, '/master')
needs: [build_doxygen]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-east-1
- name: Extract Tag Name
run: |
echo "GIT_TAG=${GITHUB_REF##*/}" >> $GITHUB_ENV
echo "Setting tag to: ${GIT_TAG}"
- name: Get Documentation Artifact
uses: actions/download-artifact@v2
with:
name: fusion-engine-client-docs.tar.gz
- name: Get Versioned Files
uses: actions/download-artifact@v2
with:
name: version-docs.tar.gz
- name: Upload Documentation To Web (S3)
run: |
tar xvzf fusion-engine-client-docs.tar.gz --strip-components=1
tar xvzf version-docs.tar.gz
aws s3 sync --delete --acl public-read docs/html s3://docs.pointonenav.com/fusion-engine/${GIT_TAG}
aws s3 cp --acl public-read docs/include_header.js s3://docs.pointonenav.com/fusion-engine/
aws s3 cp --acl public-read docs/versions.html s3://docs.pointonenav.com/fusion-engine/
aws s3 cp --acl public-read docs/index.html s3://docs.pointonenav.com/fusion-engine/
aws s3 cp --acl public-read docs/error.html s3://docs.pointonenav.com/fusion-engine/
aws s3 cp --acl public-read docs/favicon.ico s3://docs.pointonenav.com/fusion-engine/
aws s3 cp --acl public-read docs/point_one_logo.png s3://docs.pointonenav.com/fusion-engine/
# Run Python unit tests.
test_python:
name: Python Unit Tests
runs-on: ubuntu-latest
defaults:
run:
working-directory: python
steps:
- uses: actions/checkout@v2
- name: Setup Python
uses: actions/setup-python@v2
with:
python-version: '3.x'
- name: Install Python Requirements
run: |
pip install -r requirements.txt
pip install pytest
- name: Run Unit Tests
run: |
python -m pytest
- name: Build A Python Distribution
run: |
pip install build twine
python -m build
twine check dist/*
- name: Upload Artifact
uses: actions/upload-artifact@v1
with:
name: python_dist
path: python/dist
# Create a release only on a tag (not on a branch push).
release:
name: Create Release
if: startsWith(github.ref, 'refs/tags/')
needs: [check_style, build_bazel, build_cmake, build_doxygen, upload_doxygen, test_python]
runs-on: ubuntu-latest
outputs:
upload_url: ${{ steps.create_release.outputs.upload_url }}
steps:
- name: Get Documentation Artifact
uses: actions/download-artifact@v2
with:
name: fusion-engine-client-docs.tar.gz
- name: Get Python Distribution Artifact
uses: actions/download-artifact@v2
with:
name: python_dist
path: python/dist
- name: Create Release
id: create_release
uses: actions/create-release@latest
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.ref }}
release_name: Release ${{ github.ref }}
draft: false
prerelease: false
- name: Upload Documentation To Release
if: steps.create_release.conclusion == 'success'
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: fusion-engine-client-docs.tar.gz
asset_name: fusion-engine-client-docs.tar.gz
asset_content_type: application/tar+gzip
- name: Upload The Python Distribution To PyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
password: ${{ secrets.PYPI_API_TOKEN }}
packages_dir: python/dist/