Skip to content

Commit

Permalink
Merge pull request #56 from espressif/autotest-ci
Browse files Browse the repository at this point in the history
[test] CI pipeline for automated tests.
  • Loading branch information
Fabricio-ESP authored Oct 4, 2024
2 parents ea895b1 + b353e10 commit ae39a67
Show file tree
Hide file tree
Showing 12 changed files with 782 additions and 223 deletions.
297 changes: 297 additions & 0 deletions .github/workflows/build_and_test.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,297 @@
name: Autotest

on:
pull_request:
branches:
- autotest
workflow_dispatch:

jobs:
build:
name: Build for multiple platforms
runs-on: ${{ matrix.os }}
strategy:
matrix:
# os: [ubuntu-latest, windows-latest, macos-latest, macos-12]
os: [ubuntu-latest, windows-latest]

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set up Rust
uses: actions-rs/toolchain@v1
with:
toolchain: stable
override: true

- name: Install OpenSSL (Windows)
if: runner.os == 'Windows'
shell: powershell
run: |
echo "VCPKG_ROOT=$env:VCPKG_INSTALLATION_ROOT" | Out-File -FilePath $env:GITHUB_ENV -Append
vcpkg install openssl:x64-windows-static-md
- name: Install OpenSSL (Macos)
if: matrix.os == 'macos-latest'
run: brew install openssl

- name: Cache cargo registry
uses: actions/cache@v4
with:
path: ~/.cargo/registry
key: ${{ runner.os }}-cargo-registry
restore-keys: |
${{ runner.os }}-cargo-registry
- name: Cache cargo index
uses: actions/cache@v4
with:
path: ~/.cargo/git
key: ${{ runner.os }}-cargo-index
restore-keys: |
${{ runner.os }}-cargo-index
- name: Build
run: cargo build --release

# - name: Run tests
# run: cargo test --release

- name: Create release directory
run: mkdir -p release

- name: Create release system directory
run: mkdir -p release/${{ matrix.os }}

- name: Copy binary to release directory Windows
if: matrix.os == 'windows-latest'
run: cp target/release/idf-im-cli.exe release/${{ matrix.os }}/eim.exe

- name: Copy binary to release directory POSIX
if: matrix.os != 'windows-latest'
run: |
cp target/release/idf-im-cli release/${{ matrix.os }}/eim
chmod +x release/${{ matrix.os }}/eim
- name: Codesign macOS eim executables
if: startsWith(matrix.os, 'macos')
env:
MACOS_CERTIFICATE: ${{ secrets.MACOS_CERTIFICATE }}
MACOS_CERTIFICATE_PWD: ${{ secrets.MACOS_CERTIFICATE_PWD }}
run: |
echo $MACOS_CERTIFICATE | base64 --decode > certificate.p12
/usr/bin/security create-keychain -p espressif build.keychain
/usr/bin/security default-keychain -s build.keychain
/usr/bin/security unlock-keychain -p espressif build.keychain
/usr/bin/security import certificate.p12 -k build.keychain -P $MACOS_CERTIFICATE_PWD -T /usr/bin/codesign
/usr/bin/security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k espressif build.keychain
/usr/bin/codesign --entitlements eim.entitlement --options runtime --force -s "ESPRESSIF SYSTEMS (SHANGHAI) CO., LTD. (QWXF6GB4AV)" release/${{ matrix.os }}/eim -v
/usr/bin/codesign -v -vvv --deep release/${{ matrix.os }}/eim
- name: Zip eim executable for notarization
if: startsWith(matrix.os, 'macos')
run: |
cd release/${{ matrix.os }}
zip -r eim.zip eim
- name: Notarization of macOS eim executables
# && github.ref == 'refs/heads/master'
if: startsWith(matrix.os, 'macos')
env:
NOTARIZATION_USERNAME: ${{ secrets.NOTARIZATION_USERNAME }}
NOTARIZATION_PASSWORD: ${{ secrets.NOTARIZATION_PASSWORD }}
NOTARIZATION_TEAM_ID: ${{ secrets.NOTARIZATION_TEAM_ID }}
run: |
echo "Create notary keychain"
/usr/bin/security create-keychain -p espressif notary.keychain
/usr/bin/security default-keychain -s notary.keychain
/usr/bin/security unlock-keychain -p espressif notary.keychain
echo "Create keychain profile"
xcrun notarytool store-credentials "eim-notarytool-profile" --apple-id $NOTARIZATION_USERNAME --team-id $NOTARIZATION_TEAM_ID --password $NOTARIZATION_PASSWORD
xcrun notarytool submit release/${{ matrix.os }}/eim.zip --keychain-profile "eim-notarytool-profile" --wait
echo "Unzipping the executable"
unzip -o release/${{ matrix.os }}/eim.zip -d release/${{ matrix.os }}
# echo "Attach staple for eim executable"
# xcrun stapler staple release/${{ matrix.os }}/eim
- name: Zip artifacts (Windows)
if: matrix.os == 'windows-latest'
run: |
cd release/${{ matrix.os }}
7z a -tzip eim.zip eim.exe
- name: Zip artifacts (POSIX)
if: matrix.os != 'windows-latest'
run: |
cd release/${{ matrix.os }}
zip -r eim.zip eim
- name: Upload build artifacts
uses: actions/upload-artifact@v4
with:
name: eim-${{ github.run_id }}-${{ matrix.os }}
path: release/${{ matrix.os }}/eim.zip

- name: Upload artifact for tag
if: startsWith(github.ref, 'refs/tags/')
uses: actions/upload-artifact@v4
with:
name: eim-${{ github.ref_name }}-${{ matrix.os }}
path: release/${{ matrix.os }}/eim.zip

- name: Upload Release Asset
if: github.event_name == 'release' && github.event.action == 'created'
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ github.event.release.upload_url }}
asset_path: release/${{ matrix.os }}/eim.zip
asset_name: eim-${{ github.ref_name }}-${{ matrix.os }}.zip
asset_content_type: application/zip

- name: Create aarch64-linux build
if: matrix.os == 'ubuntu-latest'
run: |
rustup target add aarch64-unknown-linux-gnu
cargo install cross
cross build --target aarch64-unknown-linux-gnu --release
mkdir -p release/aarch64-unknown-linux-gnu
cp target/aarch64-unknown-linux-gnu/release/idf-im-cli release/aarch64-unknown-linux-gnu/eim
chmod +x release/aarch64-unknown-linux-gnu/eim
cd release/aarch64-unknown-linux-gnu
zip -r eim.zip eim
- name: Upload build artifacts for aarch64-linux
uses: actions/upload-artifact@v4
if: matrix.os == 'ubuntu-latest'
with:
name: eim-${{ github.run_id }}-linux-arm64
path: release/aarch64-unknown-linux-gnu/eim.zip

- name: Upload artifact for tag on aarch64-linux
if: startsWith(github.ref, 'refs/tags/') && runner.os == 'Linux'
uses: actions/upload-artifact@v4
with:
name: eim-${{ github.ref_name }}-linux-arm64
path: release/aarch64-unknown-linux-gnu/eim.zip

- name: Upload Release Asset on aarch64-linux
if: github.event_name == 'release' && github.event.action == 'created' && runner.os == 'Linux'
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ github.event.release.upload_url }}
asset_path: release/aarch64-unknown-linux-gnu/eim.zip
asset_name: eim-${{ github.ref_name }}-linux-arm64.zip
asset_content_type: application/zip

test:
name: Automated test scripts
needs: build
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Install dependencies (Ubuntu)
if: runner.os == 'Linux'
run: |
sudo apt-get install -y git cmake ninja-build wget flex bison gperf ccache libffi-dev libssl-dev dfu-util libusb-1.0-0-dev python3 python3-venv python3-pip
- name: Install dependencies (Windows)
if: runner.os == 'windows'
run: |
choco install ninja -y
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: "20"

- name: Download artifacts
uses: actions/download-artifact@v4
with:
path: ./artifacts

- name: Extract artifact (non-Windows)
if: runner.os != 'Windows'
run: |
mkdir -p test-bin
unzip ./artifacts/eim-${{ github.run_id }}-${{ matrix.os }}/eim.zip -d test-bin
# unzip ./test-bin/eim.zip -d test-bin
- name: Extract artifact (Windows)
if: runner.os == 'Windows'
run: |
mkdir -p test-bin
7z x ./artifacts/eim-${{ github.run_id }}-${{ matrix.os }}/eim.zip -otest-bin
# 7z x ./test-bin/eim.zip -otest-bin
- name: Set executable permissions (non-Windows)
if: runner.os != 'Windows'
run: |
chmod +x ./test-bin/eim
chmod +x ./tests/run_test.sh
- name: Set executable permissions (Windows)
if: runner.os == 'Windows'
run: |
icacls .\tests\run_test.ps1 /grant:r Everyone:F
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
$PSVersionTable
[System.Environment]::OSVersion.Version
- name: Run test script (non-Windows)
if: runner.os != 'Windows'
run: |
export EIM_FILE_PATH="../../test-bin/eim"
export EIM_VERSION="idf-im-cli 0.1.0"
cd tests/script
npm ci
npx mocha --exit --reporter mocha-junit-reporter --reporter-options mochaFile=../results.xml main.test.js
- name: Run test script (Windows)
if: runner.os == 'Windows'
run: |
$env:EIM_FILE_PATH = "..\..\test-bin\eim.exe"
$env:EIM_VERSION = "idf-im-cli 0.1.0"
7z x ./tests/script/node_modules.zip -otests/script/node_modules
Set-Location -Path "./tests/script"
npx mocha --exit --reporter mocha-junit-reporter --reporter-options mochaFile=../results.xml main.test.js
- name: Upload test results
uses: actions/upload-artifact@v4
if: always()
with:
name: test-results-${{ matrix.os }}.zip
path: ./tests/results.xml

publish-test-results:
name: Automated Test Results
needs: test
runs-on: ubuntu-latest
if: always()

steps:
- name: Download Artifacts
uses: actions/download-artifact@v4
with:
path: ./artifacts

- name: Publish Test Results
uses: EnricoMi/publish-unit-test-result-action@v2
with:
action_fail: true
files: "./artifacts/**/*.xml"
11 changes: 5 additions & 6 deletions tests/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@ The pre-requisites tests have been commented out of the test scripts.
## Commands summary

Navigate to the idf-im-cli folder, where the repository was cloned.
Navigate to the test folder inside the repository and execute the commands below to run the automated tests.
The scripts should be executed passing as arguments the path to the `eim` application and the version of the file being tested.

#### Windows
Expand All @@ -64,21 +63,21 @@ Open Powershell, and enable script execution:
`Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass`

To execute tests on windows, use the script
`.\run_test.ps1 "<PATH TO EIM.EXE>" "<Version being tested>"`
`.\tests\run_test.ps1 "<PATH TO EIM.EXE>" "<Version being tested>"`

Default arguments are:
`.\run_test.ps1 "$env:USERPROFILE\espressif\eim.exe" "idf-im-cli 0.1.0"`
`.\tests\run_test.ps1 "$env:USERPROFILE\espressif\eim.exe" "idf-im-cli 0.1.0"`

#### Linux

(if needed) Give execution permission to the test script
`chmod +x run_test.sh`
`chmod +x ./tests/run_test.sh`

To execute tests on linux, use the script:
`. ./run_test.sh "<PATH TO EIM>" "<Version being tested>"`
`. ./tests/run_test.sh "<PATH TO EIM>" "<Version being tested>"`

Default arguments are:
`. ./run_test.sh "$HOME/espressif/eim" "idf-im-cli 0.1.0"`
`. ./tests/run_test.sh "$HOME/espressif/eim" "idf-im-cli 0.1.0"`

#### MacOS

Expand Down
2 changes: 1 addition & 1 deletion tests/run_test.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ $env:EIM_FILE_PATH = $Path_to_eim
$env:EIM_VERSION = $Version

# Navigate to the AutoTest directory
Set-Location -Path "./script"
Set-Location -Path "./tests/script"

#Expand Node modules folder
Expand-Archive node_modules.zip
Expand Down
2 changes: 1 addition & 1 deletion tests/run_test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ export EIM_FILE_PATH="$1"
export EIM_VERSION="$2"

#Enter test folder
cd script
cd tests/script

# install node modules
npm ci
Expand Down
3 changes: 2 additions & 1 deletion tests/script/commandLineArguments.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,9 @@ if (process.env.EIM_VERSION) {
} else {
eimVersion = "idf-im-cli 0.1.0";
}

export function runLineArgumentsTests() {
describe("CLI Line Arguments Tests", function () {
describe("CLI Arguments Tests", function () {
let testRunner;

before(function () {
Expand Down
Loading

0 comments on commit ae39a67

Please sign in to comment.