mirror of
				https://github.com/eledio-devices/thirdparty-littlefs.git
				synced 2025-10-31 08:42:40 +01:00 
			
		
		
		
	Mostly taken from .travis.yml, biggest changes were around how to get the status updates to work. We can't use a token on PRs the same way we could in Travis, so instead we use a second workflow that checks every pull request for "status" artifacts, and create the actual statuses in the "workflow_run" event, where we have full access to repo secrets.
		
			
				
	
	
		
			239 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
			
		
		
	
	
			239 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
| name: test
 | |
| on: [push, pull_request]
 | |
| 
 | |
| env:
 | |
|   CFLAGS: -Werror
 | |
|   MAKEFLAGS: -j
 | |
| 
 | |
| jobs:
 | |
|   # run tests
 | |
|   test:
 | |
|     runs-on: ubuntu-latest
 | |
|     strategy:
 | |
|       fail-fast: false
 | |
|       matrix:
 | |
|         arch: [x86_64, thumb, mips, powerpc]
 | |
| 
 | |
|     steps:
 | |
|       - uses: actions/checkout@v2
 | |
|       - name: install
 | |
|         run: |
 | |
|           # need toml, also pip3 isn't installed by default?
 | |
|           sudo apt-get update
 | |
|           sudo apt-get install python3 python3-pip
 | |
|           sudo pip3 install toml
 | |
|           mkdir status
 | |
|       # cross-compile with ARM Thumb (32-bit, little-endian)
 | |
|       - name: install-thumb
 | |
|         if: matrix.arch == 'thumb'
 | |
|         run: |
 | |
|           sudo apt-get install \
 | |
|             gcc-arm-linux-gnueabi \
 | |
|             libc6-dev-armel-cross \
 | |
|             qemu-user
 | |
|           echo "CC=arm-linux-gnueabi-gcc -mthumb --static" >> $GITHUB_ENV
 | |
|           echo "EXEC=qemu-arm" >> $GITHUB_ENV
 | |
|           arm-linux-gnueabi-gcc --version
 | |
|           qemu-arm -version
 | |
|       # cross-compile with MIPS (32-bit, big-endian)
 | |
|       - name: install-mips
 | |
|         if: matrix.arch == 'mips'
 | |
|         run: |
 | |
|           sudo apt-get install \
 | |
|             gcc-mips-linux-gnu \
 | |
|             libc6-dev-mips-cross \
 | |
|             qemu-user
 | |
|           echo "CC=mips-linux-gnu-gcc --static" >> $GITHUB_ENV
 | |
|           echo "EXEC=qemu-mips" >> $GITHUB_ENV
 | |
|           mips-linux-gnu-gcc --version
 | |
|           qemu-mips -version
 | |
|       # cross-compile with PowerPC (32-bit, big-endian)
 | |
|       - name: install-powerpc
 | |
|         if: matrix.arch == 'powerpc'
 | |
|         run: |
 | |
|           sudo apt-get install \
 | |
|             gcc-powerpc-linux-gnu \
 | |
|             libc6-dev-powerpc-cross \
 | |
|             qemu-user
 | |
|           echo "CC=powerpc-linux-gnu-gcc --static" >> $GITHUB_ENV
 | |
|           echo "EXEC=qemu-ppc" >> $GITHUB_ENV
 | |
|           powerpc-linux-gnu-gcc --version
 | |
|           qemu-ppc -version
 | |
|       # test configurations
 | |
|       # make sure example can at least compile
 | |
|       - name: test-example
 | |
|         run: |
 | |
|           sed -n '/``` c/,/```/{/```/d; p}' README.md > test.c && \
 | |
|           make all CFLAGS+=" \
 | |
|             -Duser_provided_block_device_read=NULL \
 | |
|             -Duser_provided_block_device_prog=NULL \
 | |
|             -Duser_provided_block_device_erase=NULL \
 | |
|             -Duser_provided_block_device_sync=NULL \
 | |
|             -include stdio.h"
 | |
| #      # normal+reentrant tests
 | |
| #      - name: test-default
 | |
| #        run: make test SCRIPTFLAGS+="-nrk"
 | |
| #      # NOR flash: read/prog = 1 block = 4KiB
 | |
| #      - name: test-nor
 | |
| #        run: make test SCRIPTFLAGS+="-nrk
 | |
| #          -DLFS_READ_SIZE=1 -DLFS_BLOCK_SIZE=4096"
 | |
| #      # SD/eMMC: read/prog = 512 block = 512
 | |
| #      - name: test-emmc
 | |
| #        run: make test SCRIPTFLAGS+="-nrk
 | |
| #          -DLFS_READ_SIZE=512 -DLFS_BLOCK_SIZE=512"
 | |
| #      # NAND flash: read/prog = 4KiB block = 32KiB
 | |
| #      - name: test-nand
 | |
| #        run: make test SCRIPTFLAGS+="-nrk
 | |
| #          -DLFS_READ_SIZE=4096 -DLFS_BLOCK_SIZE=\(32*1024\)"
 | |
| #      # other extreme geometries that are useful for various corner cases
 | |
| #      - name: test-no-intrinsics
 | |
| #        run: make test SCRIPTFLAGS+="-nrk
 | |
| #          -DLFS_NO_INTRINSICS"
 | |
| #      - name: test-byte-writes
 | |
| #        run: make test SCRIPTFLAGS+="-nrk
 | |
| #          -DLFS_READ_SIZE=1 -DLFS_CACHE_SIZE=1"
 | |
| #      - name: test-block-cycles
 | |
| #        run: make test SCRIPTFLAGS+="-nrk
 | |
| #          -DLFS_BLOCK_CYCLES=1"
 | |
| #      - name: test-odd-block-count
 | |
| #        run: make test SCRIPTFLAGS+="-nrk
 | |
| #          -DLFS_BLOCK_COUNT=1023 -DLFS_LOOKAHEAD_SIZE=256"
 | |
| #      - name: test-odd-block-size
 | |
| #        run: make test SCRIPTFLAGS+="-nrk
 | |
| #          -DLFS_READ_SIZE=11 -DLFS_BLOCK_SIZE=704"
 | |
| 
 | |
|       # update results
 | |
|       - uses: actions/checkout@v2
 | |
|         if: github.ref != 'refs/heads/master'
 | |
|         continue-on-error: true
 | |
|         with:
 | |
|           ref: master
 | |
|           path: master
 | |
| 
 | |
|       - name: results-code
 | |
|         continue-on-error: true
 | |
|         run: |
 | |
|           export OBJ="$(ls lfs*.c | sed 's/\.c/\.o/' | tr '\n' ' ')"
 | |
|           export CFLAGS+=" \
 | |
|             -DLFS_NO_ASSERT \
 | |
|             -DLFS_NO_DEBUG \
 | |
|             -DLFS_NO_WARN \
 | |
|             -DLFS_NO_ERROR"
 | |
|           if [ -d master ]
 | |
|           then
 | |
|             make -C master clean code OBJ="$OBJ" \
 | |
|               SCRIPTFLAGS+="-qo code.csv" \
 | |
|               && export SCRIPTFLAGS+="-d master/code.csv"
 | |
|           fi
 | |
|           make clean code OBJ="$OBJ" \
 | |
|             SCRIPTFLAGS+="-o code.csv"
 | |
|       - name: results-code-readonly
 | |
|         continue-on-error: true
 | |
|         run: |
 | |
|           export OBJ="$(ls lfs*.c | sed 's/\.c/\.o/' | tr '\n' ' ')"
 | |
|           export CFLAGS+=" \
 | |
|             -DLFS_NO_ASSERT \
 | |
|             -DLFS_NO_DEBUG \
 | |
|             -DLFS_NO_WARN \
 | |
|             -DLFS_NO_ERROR \
 | |
|             -DLFS_READONLY"
 | |
|           if [ -d master ]
 | |
|           then
 | |
|             make -C master clean code OBJ="$OBJ" \
 | |
|               SCRIPTFLAGS+="-qo code-readonly.csv" \
 | |
|               && export SCRIPTFLAGS+="-d master/code-readonly.csv"
 | |
|           fi
 | |
|           # TODO remove this OBJ
 | |
|           make clean code OBJ="$OBJ" \
 | |
|             SCRIPTFLAGS+="-o code-readonly.csv"
 | |
|       - name: results-code-threadsafe
 | |
|         continue-on-error: true
 | |
|         run: |
 | |
|           export OBJ="$(ls lfs*.c | sed 's/\.c/\.o/' | tr '\n' ' ')"
 | |
|           export CFLAGS+=" \
 | |
|             -DLFS_NO_ASSERT \
 | |
|             -DLFS_NO_DEBUG \
 | |
|             -DLFS_NO_WARN \
 | |
|             -DLFS_NO_ERROR \
 | |
|             -DLFS_THREADSAFE"
 | |
|           if [ -d master ]
 | |
|           then
 | |
|             make -C master clean code OBJ="$OBJ" \
 | |
|               SCRIPTFLAGS+="-qo code-threadsafe.csv" \
 | |
|               && export SCRIPTFLAGS+="-d master/code-threadsafe.csv"
 | |
|           fi
 | |
|           make clean code OBJ="$OBJ" \
 | |
|             SCRIPTFLAGS+="-o code-threadsafe.csv"
 | |
|       - name: results-code-migrate
 | |
|         continue-on-error: true
 | |
|         run: |
 | |
|           export OBJ="$(ls lfs*.c | sed 's/\.c/\.o/' | tr '\n' ' ')"
 | |
|           export CFLAGS+=" \
 | |
|             -DLFS_NO_ASSERT \
 | |
|             -DLFS_NO_DEBUG \
 | |
|             -DLFS_NO_WARN \
 | |
|             -DLFS_NO_ERROR \
 | |
|             -DLFS_MIGRATE"
 | |
|           if [ -d master ]
 | |
|           then
 | |
|             make -C master clean code OBJ="$OBJ" \
 | |
|               SCRIPTFLAGS+="-qo code-migrate.csv" \
 | |
|               && export SCRIPTFLAGS+="-d master/code-migrate.csv"
 | |
|           fi
 | |
|           make clean code OBJ="$OBJ" \
 | |
|             SCRIPTFLAGS+="-o code-migrate.csv"
 | |
|       # limit reporting to Thumb, otherwise there would be too many numbers
 | |
|       # flying around for the results to be easily readable
 | |
|       - name: collect-status
 | |
|         continue-on-error: true
 | |
|         if: matrix.arch == 'thumb'
 | |
|         run: |
 | |
|           mkdir -p status
 | |
|           shopt -s nullglob
 | |
|           for f in code*.csv
 | |
|           do
 | |
|               export STEP="results-code$(
 | |
|                 echo $f | sed -n 's/code-\(.*\).csv/-\1/p')"
 | |
|               export CONTEXT="results / code$(
 | |
|                 echo $f | sed -n 's/code-\(.*\).csv/ (\1)/p')"
 | |
|               export DESCRIPTION="Code size is $(
 | |
|                 ./scripts/code.py -i $f -S $(
 | |
|                   [ -e master/$f ] && echo "-d master/$f"))"
 | |
|               jq -nc '{
 | |
|                 state: "success",
 | |
|                 context: env.CONTEXT,
 | |
|                 description: env.DESCRIPTION,
 | |
|                 target_job: "test (${{matrix.arch}})",
 | |
|                 target_step: env.STEP}' \
 | |
|                 > status/code$(echo $f | sed -n 's/code-\(.*\).csv/-\1/p').json
 | |
|           done
 | |
|       - name: upload-status
 | |
|         continue-on-error: true
 | |
|         if: matrix.arch == 'thumb'
 | |
|         uses: actions/upload-artifact@v2
 | |
|         with:
 | |
|           name: status
 | |
|           path: status
 | |
|           retention-days: 1
 | |
| 
 | |
|   # run under Valgrind to check for memory errors
 | |
|   valgrind:
 | |
|     runs-on: ubuntu-latest
 | |
| 
 | |
|     steps:
 | |
|       - uses: actions/checkout@v2
 | |
|       - name: install
 | |
|         run: |
 | |
|           # need toml, also pip3 isn't installed by default?
 | |
|           sudo apt-get update
 | |
|           sudo apt-get install python3 python3-pip
 | |
|           sudo pip3 install toml
 | |
|       - name: install-valgrind
 | |
|         run: |
 | |
|           sudo apt-get update
 | |
|           sudo apt-get install valgrind
 | |
|           valgrind --version
 | |
| #      # normal tests, we don't need to test all geometries
 | |
| #      - name: test-valgrind
 | |
| #        run: make test SCRIPTFLAGS+="-k --valgrind"
 |