Skip to content
This repository has been archived by the owner on Jul 9, 2024. It is now read-only.

chore(deps): update dependency @nordicsemiconductor/asset-tracker-clo… #760

chore(deps): update dependency @nordicsemiconductor/asset-tracker-clo…

chore(deps): update dependency @nordicsemiconductor/asset-tracker-clo… #760

name: Build and Release
on:
push:
paths:
- "**.c"
- "**.h"
- "**.feature"
- "Kconfig"
- ".github/workflows/build-and-release.yaml"
- "west.yml"
- "*.conf"
- "!package.json"
- "!package-lock.json"
repository_dispatch:
types:
- source-update
workflow_dispatch:
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_REGION: ${{ secrets.AWS_REGION }}
AWS_DEFAULT_REGION: ${{ secrets.AWS_REGION }}
STACK_NAME: ${{ secrets.STACK_NAME }}
CI: 1
FORCE_COLOR: 3
jobs:
# This generates a unique build id (which is also different for re-runs) to
# be used in the artifact names to be able to distinguish them when
# downloading the artifact files.
build-id:
name: Generate build ID
runs-on: ubuntu-22.04
outputs:
id: ${{ steps.id.outputs.id }}
steps:
- name: Generate build ID
id: id
run: |
ID=`uuidgen`
echo "id=${ID}" >> $GITHUB_OUTPUT
# This generates a string containing the current date which is used in
# in artifact names to simpify locating and distinguishing them once they have
# been downloaded
date-string:
name: Generate string containing the current date
runs-on: ubuntu-22.04
outputs:
dateAsString: ${{ steps.dateAsString.outputs.dateAsString }}
steps:
- name: Generate date string
id: dateAsString
run: echo "dateAsString=$(date +'%Y%m%d%H%M%S')" >> $GITHUB_OUTPUT
broker:
name: Determine broker hostname
runs-on: ubuntu-22.04
steps:
- name: Determine the AWS IoT broker hostname
id: broker-hostname
run: |
BROKER_HOSTNAME=`AWS_ACCESS_KEY_ID=${{ env.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY=${{ env.AWS_SECRET_ACCESS_KEY }} AWS_DEFAULT_REGION=${{ env.AWS_REGION }} aws iot describe-endpoint --endpoint-type iot:Data-ATS | jq '.endpointAddress' -r | tr -d '\n'`
echo ${BROKER_HOSTNAME}
if [ -z "$BROKER_HOSTNAME" ]; then echo "Failed to discover broker hostname."; exit 1; fi
echo ${BROKER_HOSTNAME} > broker.conf
- uses: actions/upload-artifact@v3
with:
if-no-files-found: error
name: broker
path: broker.conf
release-version:
name: Determine next release version
runs-on: ubuntu-22.04
outputs:
nextRelease: ${{ steps.version.outputs.nextRelease }}
steps:
- uses: actions/checkout@v4
- name: Determine next release version
uses: nordicsemiconductor/cloud-get-next-version-action@saga
id: version
with:
branch: saga
defaultVersion: "0.0.0-development-${{ github.sha }}"
- run: echo ${{ steps.version.outputs.nextRelease }}
build:
runs-on: ubuntu-22.04
needs: [broker, release-version, date-string]
strategy:
matrix:
board: [thingy91_nrf9160_ns, nrf9160dk_nrf9160_ns]
loglevel: [debug, debugWithMemfault, nodebug]
steps:
- uses: actions/checkout@v4
with:
path: firmware
- name: Configure Version
working-directory: firmware
run: |
APP_VERSION=${{ needs.release-version.outputs.nextRelease }}-${{ matrix.board }}-${{ matrix.loglevel }}
echo "CONFIG_ASSET_TRACKER_V2_APP_VERSION=\"${APP_VERSION}\"" >> firmware.conf
echo "APP_VERSION=${APP_VERSION}" >> $GITHUB_ENV
- uses: actions/download-artifact@v3
with:
name: broker
- name: Configure the AWS IoT broker hostname
working-directory: firmware
run: |
BROKER_HOSTNAME=`cat ../broker.conf`
echo "CONFIG_AWS_IOT_BROKER_HOST_NAME=\"${BROKER_HOSTNAME}\"" >> firmware.conf
- run: cat firmware.conf
working-directory: firmware
- name: Build with debug enabled
working-directory: firmware
if: matrix.loglevel == 'debug'
run: |
docker run --rm -v ${PWD}:/workdir/project nordicplayground/nrfconnect-sdk:main west build -p always -b ${{ matrix.board }} --build-dir /workdir/project/build -- -DOVERLAY_CONFIG="overlay-aws.conf;overlay-pgps.conf;overlay-debug.conf;asset-tracker-cloud-firmware-aws.conf;firmware.conf" -DEXTRA_CFLAGS="-Werror"
- name: Build with debug and Memfault enabled
if: matrix.loglevel == 'debugWithMemfault'
working-directory: firmware
run: |
echo "CONFIG_NRF_MODEM_LIB_TRACE_ENABLED=y" >> firmware.conf
echo "CONFIG_DEBUG_MODULE_MEMFAULT_USE_EXTERNAL_TRANSPORT=y" >> firmware.conf
echo "CONFIG_DEBUG_MODULE_MEMFAULT_HEARTBEAT_INTERVAL_SEC=3600" >> firmware.conf
echo "CONFIG_MEMFAULT_NCS_FW_VERSION_STATIC=y" >> firmware.conf
echo "CONFIG_MEMFAULT_NCS_FW_VERSION=\"${{ env.APP_VERSION }}\"" >> firmware.conf
echo "CONFIG_MEMFAULT_NCS_FW_TYPE=\"asset_tracker_v2\"" >> firmware.conf
echo "CONFIG_MEMFAULT_NCS_PROJECT_KEY=\"${{ secrets.MEMFAULT_PROJECT_KEY }}\"" >> firmware.conf
docker run --rm -v ${PWD}:/workdir/project nordicplayground/nrfconnect-sdk:main west build -p always -b ${{ matrix.board }} --build-dir /workdir/project/build -- -DOVERLAY_CONFIG="overlay-aws.conf;overlay-pgps.conf;overlay-debug.conf;overlay-memfault.conf;asset-tracker-cloud-firmware-aws.conf;firmware.conf" -DEXTRA_CFLAGS="-Werror"
- name: Upload symbols file to Memfault
if: matrix.loglevel == 'debugWithMemfault'
working-directory: firmware
run: |
pip3 install memfault-cli
memfault \
--org-token ${{ secrets.MEMFAULT_ORGANIZATION_TOKEN }} \
--org ${{ secrets.MEMFAULT_ORGANIZATION_SLUG }} \
--project ${{ secrets.MEMFAULT_PROJECT_SLUG }} \
upload-mcu-symbols \
--software-type asset_tracker_v2 \
--software-version ${{ env.APP_VERSION }} \
build/zephyr/zephyr.elf
- name: Build with debug disabled
working-directory: firmware
if: matrix.loglevel == 'nodebug'
run: |
docker run --rm -v ${PWD}:/workdir/project nordicplayground/nrfconnect-sdk:main west build -p always -b ${{ matrix.board }} --build-dir /workdir/project/build -- -DOVERLAY_CONFIG="overlay-aws.conf;overlay-pgps.conf;asset-tracker-cloud-firmware-aws.conf;firmware.conf" -DEXTRA_CFLAGS="-Werror"
- name: Copy firmware
working-directory: firmware
run: |
cp build/zephyr/merged.hex ../
cp build/zephyr/app_signed.hex ../
cp build/zephyr/app_update.bin ../
cp build/zephyr/zephyr.elf ../
cp firmware.conf ../
- uses: actions/upload-artifact@v3
with:
if-no-files-found: error
name:
${{ matrix.board }}-${{ matrix.loglevel }}-${{
needs.date-string.outputs.dateAsString }}-${{ github.sha }}
path: |
merged.hex
app_signed.hex
app_update.bin
firmware.conf
zephyr.elf
e2e-credentials:
name: Create device credentials for end-to-end test
runs-on: ubuntu-22.04
if: ${{ !contains(toJSON(github.event.commits.*.message), '[skip-e2e]') }}
needs: [build-id]
strategy:
matrix:
board: [nrf9160dk_nrf9160_ns]
network: [ltem]
steps:
- name: Generate device ID
run: |
DEVICE_ID=`uuidgen`
echo "DEVICE_ID=${DEVICE_ID}" >> $GITHUB_ENV
- uses: actions/setup-node@v3
with:
node-version: "18.x"
- uses: actions/checkout@v4
- name: Clone nRF Asset Tracker for AWS
run: |
git clone `cat package.json | jq -r '.cloud.repository'` cloud
- name: Install dependencies
run: |
cd cloud
npm ci
- name: Compile TypeScript
run: |
cd cloud
npx tsc
- name: Keep CA certificates around
uses: actions/cache@v3
with:
path: cloud/certificates
key: certificates
- name: Check if CA certificate exists
run: |
ls ./cloud/certificates/*/currentCA 1> /dev/null 2>&1
echo "SKIP_CERT_GENERATION=1" >> $GITHUB_ENV
continue-on-error: true
- name: Create CA certificate
if: env.SKIP_CERT_GENERATION != '1'
run: |
cd cloud
./cli.sh create-ca --tags ci=firmware,repository=${{ github.repository }}
- name: Create device credentials
run: |
cd cloud
./cli.sh create-simulator-cert -d ${{ env.DEVICE_ID }}
- name: Copy credentials
run: |
mkdir e2e-credentials
cp cloud/certificates/*/device-${{ env.DEVICE_ID }}* e2e-credentials
- uses: actions/upload-artifact@v3
with:
if-no-files-found: error
name:
e2e-credentials-${{ matrix.board }}-${{ needs.build-id.outputs.id }}
path: |
e2e-credentials/*
- name: Remove device certificates
run: rm -vf ./cloud/certificates/*/device*
e2e-firmware:
name: Build firmware for end-to-end test
runs-on: ubuntu-22.04
if: ${{ !contains(toJSON(github.event.commits.*.message), '[skip-e2e]') }}
needs: [e2e-credentials, broker, build-id]
strategy:
matrix:
board: [nrf9160dk_nrf9160_ns]
network: [ltem]
steps:
- uses: actions/checkout@v4
with:
path: firmware
- uses: actions/download-artifact@v3
with:
name:
e2e-credentials-${{ matrix.board }}-${{ needs.build-id.outputs.id }}
path:
e2e-credentials-${{ matrix.board }}-${{ needs.build-id.outputs.id }}
- name: Set device id
run: |
echo "DEVICE_ID=`find e2e-credentials-${{ matrix.board }}-${{
needs.build-id.outputs.id }} -name \*.json | head -n 1 | xargs cat | jq -r '.clientId'`" >> $GITHUB_ENV
- name: Configure Version
working-directory: firmware
env:
APP_VERSION:
${{ github.sha }}-${{ matrix.board }}-${{ env.DEVICE_ID }}
run: |
echo "CONFIG_ASSET_TRACKER_V2_APP_VERSION=\"${{ env.APP_VERSION }}-original\"" >> firmware.conf
- uses: actions/download-artifact@v3
with:
name: broker
- name: Configure the AWS IoT broker hostname
working-directory: firmware
run: |
BROKER_HOSTNAME=`cat ../broker.conf`
echo "CONFIG_AWS_IOT_BROKER_HOST_NAME=\"${BROKER_HOSTNAME}\"" >> firmware.conf
- name: Set MQTT client ID to test device
working-directory: firmware
run: |
echo "CONFIG_CLOUD_CLIENT_ID_USE_CUSTOM=y" >> firmware.conf
echo "CONFIG_AWS_IOT_CLIENT_ID_MAX_LEN=40" >> firmware.conf
echo "CONFIG_CLOUD_CLIENT_ID=\"${{ env.DEVICE_ID }}\"" >> firmware.conf
- run: cat firmware.conf
working-directory: firmware
- name: Build
working-directory: firmware
run: |
docker run --rm -v ${PWD}:/workdir/project nordicplayground/nrfconnect-sdk:main west build -p always -b ${{ matrix.board }} --build-dir /workdir/project/build -- -DOVERLAY_CONFIG="overlay-aws.conf;overlay-pgps.conf;overlay-debug.conf;asset-tracker-cloud-firmware-aws.conf;firmware.conf;e2e.conf" -DEXTRA_CFLAGS="-Werror"
cp build/zephyr/merged.hex ../firmware.hex
cp build/zephyr/app_update.bin ../firmware.bin
cp firmware.conf ../firmware.conf
- name: Build with changed version for FOTA test
working-directory: firmware
env:
APP_VERSION:
${{ github.sha }}-${{ matrix.board }}-${{ env.DEVICE_ID }}
run: |
echo "CONFIG_ASSET_TRACKER_V2_APP_VERSION=\"${{ env.APP_VERSION }}-upgraded\"" >> firmware.conf
docker run --rm -v ${PWD}:/workdir/project nordicplayground/nrfconnect-sdk:main west build -p always -b ${{ matrix.board }} --build-dir /workdir/project/build -- -DOVERLAY_CONFIG="overlay-aws.conf;overlay-pgps.conf;overlay-debug.conf;asset-tracker-cloud-firmware-aws.conf;firmware.conf;e2e.conf" -DEXTRA_CFLAGS="-Werror"
cp build/zephyr/app_update.bin ../fota-upgrade.bin
cp firmware.conf ../fota-upgrade.conf
- uses: actions/upload-artifact@v3
with:
if-no-files-found: error
name:
e2e-firmware-${{ matrix.board }}-${{ needs.build-id.outputs.id }}
path: |
firmware.hex
firmware.bin
firmware.conf
fota-upgrade.hex
fota-upgrade.bin
fota-upgrade.conf
e2e-device:
name: Run the firmware for the end-to-end tests on a real device
runs-on: [self-hosted, firmware-ci]
if: ${{ !contains(toJSON(github.event.commits.*.message), '[skip-e2e]') }}
env:
# Disables TLS certificate verification on Node.js which might be not
# possible if behind a (corporate) firewall
NODE_TLS_REJECT_UNAUTHORIZED: 0
outputs:
connected: ${{ steps.device.outputs.connected }}
needs:
- e2e-firmware
- e2e-credentials
- broker
- build-id
# While not needed, don't run expensive e2e tests if "build" steps fails
- build
strategy:
matrix:
board: [nrf9160dk_nrf9160_ns]
network: [ltem]
steps:
- uses: actions/download-artifact@v3
with:
name:
e2e-firmware-${{ matrix.board }}-${{ needs.build-id.outputs.id }}
- uses: actions/download-artifact@v3
with:
name:
e2e-credentials-${{ matrix.board }}-${{ needs.build-id.outputs.id }}
path:
e2e-credentials-${{ matrix.board }}-${{ needs.build-id.outputs.id }}
- name: Set device id
run: |
echo "DEVICE_ID=`find e2e-credentials-${{ matrix.board }}-${{
needs.build-id.outputs.id }} -name \*.json | head -n 1 | xargs cat | jq -r '.clientId'`" >> $GITHUB_ENV
- uses: actions/download-artifact@v3
with:
name: broker
- name: Configure the AWS IoT broker hostname
run: |
BROKER_HOSTNAME=`cat broker.conf`
echo "BROKER_HOSTNAME=${BROKER_HOSTNAME}" >> $GITHUB_ENV
- name: Run firmware on real device
uses: NordicSemiconductor/cloud-aws-firmware-ci-device-action@saga
id: device
env:
APP_VERSION:
${{ github.sha }}-${{ matrix.board }}-${{ env.DEVICE_ID }}
with:
device id: ${{ env.DEVICE_ID }}
app version: ${{ env.APP_VERSION }}
aws access key id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws secret access key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws region: ${{ secrets.AWS_REGION }}
broker hostname: ${{ env.BROKER_HOSTNAME }}
stack name: ${{ secrets.STACK_NAME }}
hex file: firmware.hex
fota file: fota-upgrade.bin
abort on: |
aws_fota: Error (-7) when trying to start firmware download
aws_iot_integration: aws_iot_hub_init, error
end on: |
CLOUD_WRAP_EVT_PGPS_DATA_RECEIVED
aws_iot_integration: cloud_wrap_init: Version: ${{ env.APP_VERSION }}-upgraded
"appV"
"${{ env.APP_VERSION }}-upgraded"
cloud_module: cloud_wrap_event_handler: CLOUD_WRAP_EVT_DATA_ACK
CLOUD_WRAP_EVT_AGPS_DATA_RECEIVED
timeout in minutes: 20
sec tag: 42
certificate location:
./e2e-credentials-${{ matrix.board }}-${{ needs.build-id.outputs.id
}}
target: ${{ matrix.board }}
ci runner package: "@nordicsemiconductor/firmware-ci-runner-aws@>=7.0.359"
- uses: actions/upload-artifact@v3
with:
if-no-files-found: error
name: e2e-run-${{ matrix.board }}-${{ needs.build-id.outputs.id }}
path: |
device.log
flash.log
job.json
e2e-credentials-${{ matrix.board }}-${{
needs.build-id.outputs.id }}
firmware.hex
fota-upgrade.bin
e2e-tests:
name: Run the end-to-end test
runs-on: ubuntu-22.04
if:
${{ needs.e2e-device.outputs.connected == 'true' &&
!contains(toJSON(github.event.commits.*.message), '[skip-e2e]') }}
needs:
- e2e-firmware
- e2e-device
- broker
- build-id
# Wait for build step here, otherwise entire workflow will not pass, so running the expensive e2e test is pointless
- build
strategy:
matrix:
board: [nrf9160dk_nrf9160_ns]
network: [ltem]
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v3
with:
name:
e2e-credentials-${{ matrix.board }}-${{ needs.build-id.outputs.id }}
path:
e2e-credentials-${{ matrix.board }}-${{ needs.build-id.outputs.id }}
- uses: actions/download-artifact@v3
with:
name: e2e-run-${{ matrix.board }}-${{ needs.build-id.outputs.id }}
path: e2e-run-${{ matrix.board }}-${{ needs.build-id.outputs.id }}
- name: Set device id
run: |
echo "DEVICE_ID=`find e2e-credentials-${{ matrix.board }}-${{
needs.build-id.outputs.id }} -name \*.json | head -n 1 | xargs cat | jq -r '.clientId'`" >> $GITHUB_ENV
- uses: actions/download-artifact@v3
with:
name: broker
- name: Configure the AWS IoT broker hostname
run: |
BROKER_HOSTNAME=`cat broker.conf`
echo "BROKER_HOSTNAME=${BROKER_HOSTNAME}" >> $GITHUB_ENV
- name: Run feature tests
env:
APP_VERSION:
${{ github.sha }}-${{ matrix.board }}-${{ env.DEVICE_ID }}
uses: NordicSemiconductor/cloud-aws-firmware-ci-feature-runner-action@saga
with:
device id: ${{ env.DEVICE_ID }}
app version: ${{ env.APP_VERSION }}
aws access key id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws secret access key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws region: ${{ secrets.AWS_REGION }}
broker hostname: ${{ env.BROKER_HOSTNAME }}
stack name: ${{ secrets.STACK_NAME }}
feature dir: features
log dir: e2e-run-${{ matrix.board }}-${{ needs.build-id.outputs.id }}
target: ${{ matrix.board }}
- name: Remove test device
if:
${{ !contains(toJSON(github.event.commits.*.message),
'[skip-cleanup]') }}
continue-on-error: true
run: |
CERT_ARN=`aws iot list-thing-principals --thing-name ${{ env.DEVICE_ID }} | jq -r '.principals[0]'`
CERT_ID=`echo $CERT_ARN | cut -d'/' -f2`
aws iot detach-thing-principal --thing-name ${{ env.DEVICE_ID }} --principal $CERT_ARN
aws iot update-certificate --certificate-id $CERT_ID --new-status INACTIVE
aws iot delete-certificate --certificate-id $CERT_ID
aws iot delete-thing --thing-name ${{ env.DEVICE_ID }}
release:
name: Release
runs-on: ubuntu-22.04
if:
github.ref == 'refs/heads/saga' && (github.event_name == 'push' ||
github.event_name == 'workflow_dispatch' || github.event_name ==
'repository_dispatch')
needs: [build, e2e-tests]
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v3
- uses: actions/setup-node@v3
with:
node-version: "18.x"
- run: npx semantic-release