From f875d9eaca1c39b7e83265d788108640c490440a Mon Sep 17 00:00:00 2001 From: per1234 Date: Wed, 22 Sep 2021 02:50:12 -0700 Subject: [PATCH 01/15] Add library.properties to path filter of examples compilation workflow Some fields of the library.properties metadata file can affect compilation, so the workflow should run when it has been modified. --- .github/workflows/compile-examples.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/compile-examples.yml b/.github/workflows/compile-examples.yml index 9be8024..572286c 100644 --- a/.github/workflows/compile-examples.yml +++ b/.github/workflows/compile-examples.yml @@ -4,11 +4,13 @@ on: pull_request: paths: - ".github/workflows/compile-examples.yml" + - "library.properties" - "examples/**" - "src/**" push: paths: - ".github/workflows/compile-examples.yml" + - "library.properties" - "examples/**" - "src/**" From ccade737efa70e30c9571a60803043912543b00d Mon Sep 17 00:00:00 2001 From: per1234 Date: Wed, 22 Sep 2021 02:51:17 -0700 Subject: [PATCH 02/15] Add schedule trigger to sketch compile workflow Run the workflow weekly to catch compilation failures caused by external changes (e.g., Arduino Mbed OS Boards, ArduinoCore-API). --- .github/workflows/compile-examples.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/compile-examples.yml b/.github/workflows/compile-examples.yml index 572286c..0da93fb 100644 --- a/.github/workflows/compile-examples.yml +++ b/.github/workflows/compile-examples.yml @@ -1,5 +1,6 @@ name: Compile Examples +# See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows on: pull_request: paths: @@ -13,6 +14,9 @@ on: - "library.properties" - "examples/**" - "src/**" + schedule: + # Run every Tuesday at 8 AM UTC to catch breakage caused by changes to external resources (libraries, platforms). + - cron: "0 8 * * TUE" env: SKETCHES_REPORTS_PATH: sketches-reports From 1d73a02711222317ecca957ae8705e51525ddb82 Mon Sep 17 00:00:00 2001 From: per1234 Date: Wed, 22 Sep 2021 03:31:29 -0700 Subject: [PATCH 03/15] Add manual trigger events to sketch compile workflow The `workflow_dispatch` and `repository_dispatch` events allow manual triggering of the workflow. These can be useful to immediately check for impacts of changes to external resources. They do no harm when they are not needed, so there is no reason not to have them in place to be ready for when they might be needed. --- .github/workflows/compile-examples.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/compile-examples.yml b/.github/workflows/compile-examples.yml index 0da93fb..76bc24f 100644 --- a/.github/workflows/compile-examples.yml +++ b/.github/workflows/compile-examples.yml @@ -17,6 +17,8 @@ on: schedule: # Run every Tuesday at 8 AM UTC to catch breakage caused by changes to external resources (libraries, platforms). - cron: "0 8 * * TUE" + workflow_dispatch: + repository_dispatch: env: SKETCHES_REPORTS_PATH: sketches-reports From 47db50ca1f635a174d4929620af65437758707b5 Mon Sep 17 00:00:00 2001 From: per1234 Date: Wed, 22 Sep 2021 03:35:41 -0700 Subject: [PATCH 04/15] Use custom matrix job names in sketch compilation CI job The "Compile Examples" GitHub Actions workflow generates a matrix job for each board. The default job name is generated from the job's matrix object. This contains the complete board data, which results in a long and somewhat cryptic job name that can make the workflow run more difficult to interpret. The only necessary information is the FQBN. A custom job name allows for only using this information in the job name. --- .github/workflows/compile-examples.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/compile-examples.yml b/.github/workflows/compile-examples.yml index 76bc24f..39f4f8a 100644 --- a/.github/workflows/compile-examples.yml +++ b/.github/workflows/compile-examples.yml @@ -26,6 +26,7 @@ env: jobs: compile-test: + name: compile for ${{ matrix.fqbn }} runs-on: ubuntu-latest env: From 66b662472cb40dfe3b63715cdb8e5ac5022acb26 Mon Sep 17 00:00:00 2001 From: per1234 Date: Wed, 22 Sep 2021 03:35:53 -0700 Subject: [PATCH 05/15] Remove obsolete comment from sketch compile workflow This comment referred to a since removed line of the workflow that checked out the `namespace_arduino` branch of ArduinoCore-API, which has since become unnecessary. The comment was not removed when the configuration was updated and now might cause confusion. --- .github/workflows/compile-examples.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/compile-examples.yml b/.github/workflows/compile-examples.yml index 39f4f8a..80cf9c1 100644 --- a/.github/workflows/compile-examples.yml +++ b/.github/workflows/compile-examples.yml @@ -72,7 +72,6 @@ jobs: uses: actions/checkout@v2 with: repository: arduino/ArduinoCore-API - # as specified at https://github.com/arduino/ArduinoCore-mbed/blob/master/README.md#installation path: ${{ env.ARDUINOCORE_API_STAGING_PATH }} - name: Install ArduinoCore-API From f10759c30f4363b590f07b518a051379348fb87b Mon Sep 17 00:00:00 2001 From: per1234 Date: Wed, 22 Sep 2021 03:39:58 -0700 Subject: [PATCH 06/15] Always upload sketch compilation report artifact The `arduino/compile-sketches` action produces a report of the results of the compilations. The primary usage of this report is to generate the size deltas comment that is made to pull requests. Although that can only be done for pull requests, it might be that the compilation report is found useful for other purposes, in which case it is just as relevant when triggered by non-PR events. Always uploading the compilation report also makes the workflow a little more simple. --- .github/workflows/compile-examples.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/compile-examples.yml b/.github/workflows/compile-examples.yml index 80cf9c1..74fd895 100644 --- a/.github/workflows/compile-examples.yml +++ b/.github/workflows/compile-examples.yml @@ -100,7 +100,6 @@ jobs: verbose: 'true' - name: Save memory usage change report as artifact - if: github.event_name == 'pull_request' uses: actions/upload-artifact@v2 with: name: ${{ env.SKETCHES_REPORTS_ARTIFACT_NAME }} From a3f947aa83a29e69c3f753ffbe92e743bb501856 Mon Sep 17 00:00:00 2001 From: per1234 Date: Wed, 22 Sep 2021 03:44:35 -0700 Subject: [PATCH 07/15] Fail sketch compile workflow if report not found The "arduino/compile-sketches` GitHub Actions action generates a report of the results of the compilations as a JSON file. This file is uploaded as a workflow run artifact, which is later consumed by the `arduino/report-size-deltas` action. By default, the `actions/upload-artifact` used for the upload step does not require the target file to exist. In this usage, the report file should always exist. If not, it indicates something is seriously wrong and the workflow run should fail to bring this to our attention rather than silently ignoring it. --- .github/workflows/compile-examples.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/compile-examples.yml b/.github/workflows/compile-examples.yml index 74fd895..f78dc2c 100644 --- a/.github/workflows/compile-examples.yml +++ b/.github/workflows/compile-examples.yml @@ -103,6 +103,7 @@ jobs: uses: actions/upload-artifact@v2 with: name: ${{ env.SKETCHES_REPORTS_ARTIFACT_NAME }} + if-no-files-found: error path: ${{ env.SKETCHES_REPORTS_PATH }} report-size-deltas: From e8667d50d6450cfb5b0921f82dc3496621232ca8 Mon Sep 17 00:00:00 2001 From: per1234 Date: Wed, 22 Sep 2021 04:03:20 -0700 Subject: [PATCH 08/15] Simplify size deltas report job conditional The previous condition is necessary in repositories where the "Run workflows from fork pull requests" setting is enabled and the "Send write tokens to workflows from fork pull requests" setting is disabled, explained in more detail here: https://github.com/arduino/report-size-deltas#run-from-the-same-workflow-as-the-arduinocompile-sketches-action However, this repository does not have the "Run workflows from fork pull requests" setting enabled, so the extra condition is superflous and only makes the workflow more difficult to understand and maintain. --- .github/workflows/compile-examples.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/compile-examples.yml b/.github/workflows/compile-examples.yml index f78dc2c..ebd6648 100644 --- a/.github/workflows/compile-examples.yml +++ b/.github/workflows/compile-examples.yml @@ -108,8 +108,7 @@ jobs: report-size-deltas: needs: compile-test - # Only run the job when the workflow is triggered by a pull request from this repository (because arduino/report-size-deltas requires write permissions) - if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository + if: github.event_name == 'pull_request' runs-on: ubuntu-latest steps: - name: Download sketches reports artifact From 6ec0ef435d728497316f5e23da964ca85ca95ced Mon Sep 17 00:00:00 2001 From: per1234 Date: Wed, 22 Sep 2021 06:32:41 -0700 Subject: [PATCH 09/15] Make size deltas report even when some compilations failed The GitHub Actions workflow job that does a "smoke test" compilation of the library example sketches is a matrix, running a parallel job for each of the boards in the array. It may be that one job passes and another fails. In this case, there is memory usage change data available for the board that passed compilation. Previously the size deltas report only happened if all compilations passed. It may be useful for the contributor to get the size deltas feedback in addition to the compilation results even when one of the boards did not pass compilation so that they may have as much of the available information as possible to work with. --- .github/workflows/compile-examples.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/compile-examples.yml b/.github/workflows/compile-examples.yml index ebd6648..4cf96d3 100644 --- a/.github/workflows/compile-examples.yml +++ b/.github/workflows/compile-examples.yml @@ -108,15 +108,20 @@ jobs: report-size-deltas: needs: compile-test - if: github.event_name == 'pull_request' + # Run even if some compilations failed. + if: always() && github.event_name == 'pull_request' runs-on: ubuntu-latest steps: - name: Download sketches reports artifact + id: download-artifact + continue-on-error: true # If compilation failed for all boards then there are no artifacts uses: actions/download-artifact@v2 with: name: ${{ env.SKETCHES_REPORTS_ARTIFACT_NAME }} path: ${{ env.SKETCHES_REPORTS_PATH }} - uses: arduino/report-size-deltas@main + # If actions/download-artifact failed, there are no artifacts to report from. + if: steps.download-artifact.outcome == 'success' with: sketches-reports-source: ${{ env.SKETCHES_REPORTS_PATH }} From 38c01c5e1f36dbacda772dbd8064da5fa21315d8 Mon Sep 17 00:00:00 2001 From: per1234 Date: Wed, 22 Sep 2021 07:07:17 -0700 Subject: [PATCH 10/15] Use major version refs of `arduino/report-size-deltas` action The `arduino/report-size-deltas` GitHub Actions action is used to provide feedback about the impact of a proposed change on sketch memory usage. Previously, due to the lack of a release, the development version of the action was used. Using release versions provides a more stable CI system for the project. Use of the major version ref will cause the workflow to benefit from ongoing development to the actions up until such time as a new major release of an action is made, at which time we would need to evaluate whether any changes to the workflow are required by the breaking change that triggered the major release before updating the major ref (e.g., uses: `arduino/report-size-deltas@v2`). --- .github/workflows/compile-examples.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/compile-examples.yml b/.github/workflows/compile-examples.yml index 4cf96d3..7c3078a 100644 --- a/.github/workflows/compile-examples.yml +++ b/.github/workflows/compile-examples.yml @@ -120,7 +120,7 @@ jobs: name: ${{ env.SKETCHES_REPORTS_ARTIFACT_NAME }} path: ${{ env.SKETCHES_REPORTS_PATH }} - - uses: arduino/report-size-deltas@main + - uses: arduino/report-size-deltas@v1 # If actions/download-artifact failed, there are no artifacts to report from. if: steps.download-artifact.outcome == 'success' with: From be07d1d2fce8ec0f262b121c3b626e615a69d8b2 Mon Sep 17 00:00:00 2001 From: per1234 Date: Wed, 22 Sep 2021 07:09:36 -0700 Subject: [PATCH 11/15] Add descriptive name to size deltas report step The `name` key of a GitHub Actions workflow step is used to define the name used to identify that step to humans. When one is not defined, a more cryptic name is generated from the machine readable content of the step. A descriptive name will make it easier to understand the workflow run logs. --- .github/workflows/compile-examples.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/compile-examples.yml b/.github/workflows/compile-examples.yml index 7c3078a..e84ce3b 100644 --- a/.github/workflows/compile-examples.yml +++ b/.github/workflows/compile-examples.yml @@ -120,7 +120,8 @@ jobs: name: ${{ env.SKETCHES_REPORTS_ARTIFACT_NAME }} path: ${{ env.SKETCHES_REPORTS_PATH }} - - uses: arduino/report-size-deltas@v1 + - name: Comment size deltas report to PR + uses: arduino/report-size-deltas@v1 # If actions/download-artifact failed, there are no artifacts to report from. if: steps.download-artifact.outcome == 'success' with: From 8c06017416a281b7e9675ddb496e1b51ef82dced Mon Sep 17 00:00:00 2001 From: per1234 Date: Wed, 22 Sep 2021 07:19:57 -0700 Subject: [PATCH 12/15] Add a readme This will provide a quick overview of the project. The URLs in the "Compile Examples" workflow status badge are configured for the final location of the library, so they are expected to be broken while it is in the temporary development location. --- README.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..d32e156 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# `Arduino_Threads` library for Arduino + +[![Compile Examples status](https://github.com/arduino-libraries/Arduino_Threads/actions/workflows/compile-examples.yml/badge.svg)](https://github.com/arduino-libraries/Arduino_Threads/actions/workflows/compile-examples.yml) + +This library makes it easy to use the multi-threading capability of [Arduino](https://www.arduino.cc/) boards that use an [Mbed OS](https://os.mbed.com/docs/mbed-os/latest/introduction/index.html)-based core library. From 400c40417a30b721ac384fc456741a28d8c00a22 Mon Sep 17 00:00:00 2001 From: per1234 Date: Wed, 22 Sep 2021 07:22:37 -0700 Subject: [PATCH 13/15] Add CI workflow to do Arduino project-specific linting On every push, pull request, and periodically, run Arduino Lint to check for common problems not related to the project code. The URLs in the workflow status badge are configured for the final location of the library, so they are expected to be broken while it is in the temporary development location. --- .github/workflows/check-arduino.yml | 28 ++++++++++++++++++++++++++++ README.md | 1 + 2 files changed, 29 insertions(+) create mode 100644 .github/workflows/check-arduino.yml diff --git a/.github/workflows/check-arduino.yml b/.github/workflows/check-arduino.yml new file mode 100644 index 0000000..6e3035d --- /dev/null +++ b/.github/workflows/check-arduino.yml @@ -0,0 +1,28 @@ +name: Check Arduino + +# See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows +on: + push: + pull_request: + schedule: + # Run every Tuesday at 8 AM UTC to catch breakage caused by new rules added to Arduino Lint. + - cron: "0 8 * * TUE" + workflow_dispatch: + repository_dispatch: + +jobs: + lint: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Arduino Lint + uses: arduino/arduino-lint-action@v1 + with: + compliance: strict + # Change this to "update" once the library is added to the index. + library-manager: submit + # Always use this setting for official repositories. Remove for 3rd party projects. + official: true diff --git a/README.md b/README.md index d32e156..ec1532e 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # `Arduino_Threads` library for Arduino [![Compile Examples status](https://github.com/arduino-libraries/Arduino_Threads/actions/workflows/compile-examples.yml/badge.svg)](https://github.com/arduino-libraries/Arduino_Threads/actions/workflows/compile-examples.yml) +[![Check Arduino status](https://github.com/arduino-libraries/Arduino_Threads/actions/workflows/check-arduino.yml/badge.svg)](https://github.com/arduino-libraries/Arduino_Threads/actions/workflows/check-arduino.yml) This library makes it easy to use the multi-threading capability of [Arduino](https://www.arduino.cc/) boards that use an [Mbed OS](https://os.mbed.com/docs/mbed-os/latest/introduction/index.html)-based core library. From b079a0ed2fec9f9015c5e3f49da0623ee5216625 Mon Sep 17 00:00:00 2001 From: per1234 Date: Wed, 22 Sep 2021 07:28:11 -0700 Subject: [PATCH 14/15] Add CI workflow to check for commonly misspelled words On every push, pull request, and periodically, use the codespell-project/actions-codespell action to check for commonly misspelled words. In the event of a false positive, the problematic word should be added, in all lowercase, to the ignore-words-list field of ./.codespellrc. Regardless of the case of the word in the false positive, it must be in all lowercase in the ignore list. The ignore list is comma-separated with no spaces. The URLs in the workflow status badge are configured for the final location of the library, so they are expected to be broken while it is in the temporary development location. --- .codespellrc | 8 ++++++++ .github/workflows/spell-check.yml | 22 ++++++++++++++++++++++ README.md | 1 + 3 files changed, 31 insertions(+) create mode 100644 .codespellrc create mode 100644 .github/workflows/spell-check.yml diff --git a/.codespellrc b/.codespellrc new file mode 100644 index 0000000..5af8717 --- /dev/null +++ b/.codespellrc @@ -0,0 +1,8 @@ +# See: https://github.com/codespell-project/codespell#using-a-config-file +[codespell] +# In the event of a false positive, add the problematic word, in all lowercase, to a comma-separated list here: +ignore-words-list = inot +skip = ./.git +builtin = clear,informal,en-GB_to_en-US +check-filenames = +check-hidden = diff --git a/.github/workflows/spell-check.yml b/.github/workflows/spell-check.yml new file mode 100644 index 0000000..4601442 --- /dev/null +++ b/.github/workflows/spell-check.yml @@ -0,0 +1,22 @@ +name: Spell Check + +# See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows +on: + push: + pull_request: + schedule: + # Run every Tuesday at 8 AM UTC to catch new misspelling detections resulting from dictionary updates. + - cron: "0 8 * * TUE" + workflow_dispatch: + repository_dispatch: + +jobs: + spellcheck: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Spell check + uses: codespell-project/actions-codespell@master diff --git a/README.md b/README.md index ec1532e..5b40187 100644 --- a/README.md +++ b/README.md @@ -2,5 +2,6 @@ [![Compile Examples status](https://github.com/arduino-libraries/Arduino_Threads/actions/workflows/compile-examples.yml/badge.svg)](https://github.com/arduino-libraries/Arduino_Threads/actions/workflows/compile-examples.yml) [![Check Arduino status](https://github.com/arduino-libraries/Arduino_Threads/actions/workflows/check-arduino.yml/badge.svg)](https://github.com/arduino-libraries/Arduino_Threads/actions/workflows/check-arduino.yml) +[![Spell Check status](https://github.com/arduino-libraries/Arduino_Threads/actions/workflows/spell-check.yml/badge.svg)](https://github.com/arduino-libraries/Arduino_Threads/actions/workflows/spell-check.yml) This library makes it easy to use the multi-threading capability of [Arduino](https://www.arduino.cc/) boards that use an [Mbed OS](https://os.mbed.com/docs/mbed-os/latest/introduction/index.html)-based core library. From de7362eb1c92f7115ec12c07b80170bb40773606 Mon Sep 17 00:00:00 2001 From: per1234 Date: Wed, 22 Sep 2021 07:39:53 -0700 Subject: [PATCH 15/15] Fix typos in documentation --- examples/Blocks/data_writer.inot | 4 ++-- examples/SharedResources/SharedVariables.h | 2 +- examples/SharedResourcesVariousLibraries/SharedVariables.h | 2 +- examples/i2c_concurrent/SharedVariables.h | 2 +- library.properties | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/Blocks/data_writer.inot b/examples/Blocks/data_writer.inot index fbd6b5e..d3e0e70 100644 --- a/examples/Blocks/data_writer.inot +++ b/examples/Blocks/data_writer.inot @@ -1,7 +1,7 @@ /* * An 'int' SINK with a size of '0'. This kind of SINK has no buffer so the reading thread - * will block until the writing thread has written something, or viceversa. + * will block until the writing thread has written something, or vice versa. */ SINK(in, int, 0) @@ -10,7 +10,7 @@ void setup() { } void loop() { - // Read an 'int' from the SINK and discards it. Since there is basically no delay in the loop + // Read an 'int' from the SINK and discard it. Since there is basically no delay in the loop // this call will surely block until something comes from the connected SOURCE. In this case // the pace is dictated by the SOURCE that sends data every 100 ms. in.read(); diff --git a/examples/SharedResources/SharedVariables.h b/examples/SharedResources/SharedVariables.h index 07d64e2..51b8363 100644 --- a/examples/SharedResources/SharedVariables.h +++ b/examples/SharedResources/SharedVariables.h @@ -1,5 +1,5 @@ // The preprocessor should enforce that all variables belonging here are declared Shared -// There's no risk to spill other variables around since they are all private memeber of the automatic class +// There's no risk to spill other variables around since they are all private members of the automatic class struct i2cScanResults { uint8_t address[128]; diff --git a/examples/SharedResourcesVariousLibraries/SharedVariables.h b/examples/SharedResourcesVariousLibraries/SharedVariables.h index 0d4a76b..ca037c5 100644 --- a/examples/SharedResourcesVariousLibraries/SharedVariables.h +++ b/examples/SharedResourcesVariousLibraries/SharedVariables.h @@ -1,5 +1,5 @@ // The preprocessor should enforce that all variables belonging here are declared Shared -// There's no risk to spill other variables around since they are all private memeber of the automatic class +// There's no risk to spill other variables around since they are all private members of the automatic class struct i2cScanResults { uint8_t address[128]; diff --git a/examples/i2c_concurrent/SharedVariables.h b/examples/i2c_concurrent/SharedVariables.h index 07d64e2..51b8363 100644 --- a/examples/i2c_concurrent/SharedVariables.h +++ b/examples/i2c_concurrent/SharedVariables.h @@ -1,5 +1,5 @@ // The preprocessor should enforce that all variables belonging here are declared Shared -// There's no risk to spill other variables around since they are all private memeber of the automatic class +// There's no risk to spill other variables around since they are all private members of the automatic class struct i2cScanResults { uint8_t address[128]; diff --git a/library.properties b/library.properties index 464f2be..05de5ff 100644 --- a/library.properties +++ b/library.properties @@ -2,8 +2,8 @@ name=Arduino_Threads version=0.0.1 author=Arduino maintainer=Arduino -sentence=Easy multi-threading for your mbed based Arduino. -paragraph=This library allows an easy access to the multi-threading capability inherent in all mbed based Arduino boards. +sentence=Easy multi-threading for your Mbed OS-based Arduino. +paragraph=This library allows an easy access to the multi-threading capability inherent in all Mbed OS-based Arduino boards. category=Other url=https://github.com/bcmi-labs/Arduino_Threads architectures=mbed