diff mbox series

[2/3] utils/test-pkg: add ability to fail when skipped

Message ID 20211201230827.35080-2-matthew.weber@collins.com
State Rejected
Headers show
Series [1/3] utils/test-pkg: add support for externals | expand

Commit Message

Matthew Weber Dec. 1, 2021, 11:08 p.m. UTC
Add flag to allow the return value to be incremented when a skip
happens, treating the overall run as a failure.

This flag could be used when using test-pkg for local validation of
downstream packages, for example in a user's br2-external. An example of
this could be a user choosing to use test-pkg as part of a CI
infrastructure where the fragment and toolchains are tightly controlled
to test a package against multiple toolchains easily.

In this case, the user would want to lower the rate of false-positives
of that fragment/toolchain configuration if a build is instead skipped
(which may happen in the case of buildroot version bumps where
dependencies could change).

Signed-off-by: Matthew Weber <matthew.weber@collins.com>
---
 utils/test-pkg | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

Comments

Yann E. MORIN Jan. 1, 2022, 9:08 p.m. UTC | #1
Matthew, All,

On 2021-12-01 17:08 -0600, Matthew Weber via buildroot spake thusly:
> Add flag to allow the return value to be incremented when a skip
> happens, treating the overall run as a failure.
> 
> This flag could be used when using test-pkg for local validation of
> downstream packages, for example in a user's br2-external. An example of
> this could be a user choosing to use test-pkg as part of a CI
> infrastructure where the fragment and toolchains are tightly controlled
> to test a package against multiple toolchains easily.
> 
> In this case, the user would want to lower the rate of false-positives
> of that fragment/toolchain configuration if a build is instead skipped
> (which may happen in the case of buildroot version bumps where
> dependencies could change).

I am a bit skeptical about this use-case.

As I understand it, wht is most interesting in a CI setup for internal
development, is that *all* internal packages do build togetrher and form
a working sysem *as a whole*.

As such, a CI setup would build the defconfig file(s) for a project (and
run the integration test-suite), rather than build each package
individually

Building each package individually with test-pkg would have the
disadvantage that it takes more time overall, as all the common deps are
build as many times as there are packages to test, and package are also
dependencies one of the others, so most packages would be built more
than once as well...

So, I am really not convinced...

Regards,
Yann E. MORIN.

> Signed-off-by: Matthew Weber <matthew.weber@collins.com>
> ---
>  utils/test-pkg | 18 +++++++++++++++---
>  1 file changed, 15 insertions(+), 3 deletions(-)
> 
> diff --git a/utils/test-pkg b/utils/test-pkg
> index d0472f176b..97957008fa 100755
> --- a/utils/test-pkg
> +++ b/utils/test-pkg
> @@ -18,8 +18,8 @@ main() {
>      local -a toolchains
>      local pkg_br_name
>  
> -    o='hakc:d:n:p:r:t:e:'
> -    O='help,all,keep,prepare-only,config-snippet:,build-dir:,number:,package:,random:,toolchains-csv:,externals:,'
> +    o='hakc:d:n:p:r:t:e:f'
> +    O='help,all,keep,prepare-only,config-snippet:,build-dir:,number:,package:,random:,toolchains-csv:,externals:,fail-on-skip'
>      opts="$(getopt -n "${my_name}" -o "${o}" -l "${O}" -- "${@}")"
>      eval set -- "${opts}"
>  
> @@ -29,6 +29,7 @@ main() {
>      number=0
>      mode=0
>      prepare_only=0
> +    fail_on_skip=0
>      toolchains_csv="${TOOLCHAINS_CSV}"
>      while [ ${#} -gt 0 ]; do
>          case "${1}" in
> @@ -65,6 +66,9 @@ main() {
>          (-e|--externals)
>              BR2_EXTERNALS="${2}"; shift 2
>              ;;
> +        (-f|--fail-on-skip)
> +            fail_on_skip=1; shift 1
> +            ;;
>          (--)
>              shift; break
>              ;;
> @@ -147,7 +151,12 @@ main() {
>      printf "%d builds, %d skipped, %d build failed, %d legal-info failed\n" \
>          ${nb} ${nb_skip} ${nb_fail} ${nb_legal}
>  
> -    return $((nb_fail + nb_legal))
> +    nb_result=$((nb_fail + nb_legal))
> +    if [ ${fail_on_skip} ]; then
> +        nb_result=$((nb_result + nb_skip))
> +    fi
> +
> +    return $nb_result
>  }
>  
>  build_one() {
> @@ -279,6 +288,9 @@ Options:
>          Externals to be used as part of the build process. Packages from
>          within these externals may be tested.
>  
> +    -f, --fail-on-skip
> +        If any builds are skipped, return a negative exit value.
> +
>  Example:
>  
>      Testing libcec would require a config snippet that contains:
> -- 
> 2.17.1
> 
> _______________________________________________
> buildroot mailing list
> buildroot@buildroot.org
> https://lists.buildroot.org/mailman/listinfo/buildroot
Arnout Vandecappelle Jan. 31, 2022, 8:54 p.m. UTC | #2
On 01/01/2022 22:08, Yann E. MORIN wrote:
> Matthew, All,
> 
> On 2021-12-01 17:08 -0600, Matthew Weber via buildroot spake thusly:
>> Add flag to allow the return value to be incremented when a skip
>> happens, treating the overall run as a failure.
>>
>> This flag could be used when using test-pkg for local validation of
>> downstream packages, for example in a user's br2-external. An example of
>> this could be a user choosing to use test-pkg as part of a CI
>> infrastructure where the fragment and toolchains are tightly controlled
>> to test a package against multiple toolchains easily.
>>
>> In this case, the user would want to lower the rate of false-positives
>> of that fragment/toolchain configuration if a build is instead skipped
>> (which may happen in the case of buildroot version bumps where
>> dependencies could change).
> 
> I am a bit skeptical about this use-case. >
> As I understand it, wht is most interesting in a CI setup for internal
> development, is that *all* internal packages do build togetrher and form
> a working sysem *as a whole*.
> 
> As such, a CI setup would build the defconfig file(s) for a project (and
> run the integration test-suite), rather than build each package
> individually

  I don't think the intention is necessarily to build each package individually. 
Although it actually does make a whole lot of sense to do that, because it helps 
to check if the dependencies are set correctly.

  So, the obvious way to take the approach that Yann proposes is to have a list 
of defconfigs that enable all the packages in the external with the various 
toolchains. However, that still doesn't solve the issue that Matt faces, because 
any package can silently disappear from the config if its dependencies are no 
longer met.

  But indeed, it would make a *whole* lot of sense to add a check to %_defconfig 
that everything in the defconfig still appears in the generated .config file. If 
it doesn't, there is something really wrong...

  So yeah, I tend to agree that this is not the approach we should have upstream.

  Note that in CI it's very easy to check the output of test-pkg and search for 
SKIPPED lines. So it's not that this feature is really *needed* to land upstream.


  Therefore, I've marked the series as Rejected.

  As always, you're welcome to argue why we should include it after all.

  Regards,
  Arnout


> 
> Building each package individually with test-pkg would have the
> disadvantage that it takes more time overall, as all the common deps are
> build as many times as there are packages to test, and package are also
> dependencies one of the others, so most packages would be built more
> than once as well...
> 
> So, I am really not convinced...
> 
> Regards,
> Yann E. MORIN.
> 
>> Signed-off-by: Matthew Weber <matthew.weber@collins.com>
>> ---
>>   utils/test-pkg | 18 +++++++++++++++---
>>   1 file changed, 15 insertions(+), 3 deletions(-)
>>
>> diff --git a/utils/test-pkg b/utils/test-pkg
>> index d0472f176b..97957008fa 100755
>> --- a/utils/test-pkg
>> +++ b/utils/test-pkg
>> @@ -18,8 +18,8 @@ main() {
>>       local -a toolchains
>>       local pkg_br_name
>>   
>> -    o='hakc:d:n:p:r:t:e:'
>> -    O='help,all,keep,prepare-only,config-snippet:,build-dir:,number:,package:,random:,toolchains-csv:,externals:,'
>> +    o='hakc:d:n:p:r:t:e:f'
>> +    O='help,all,keep,prepare-only,config-snippet:,build-dir:,number:,package:,random:,toolchains-csv:,externals:,fail-on-skip'
>>       opts="$(getopt -n "${my_name}" -o "${o}" -l "${O}" -- "${@}")"
>>       eval set -- "${opts}"
>>   
>> @@ -29,6 +29,7 @@ main() {
>>       number=0
>>       mode=0
>>       prepare_only=0
>> +    fail_on_skip=0
>>       toolchains_csv="${TOOLCHAINS_CSV}"
>>       while [ ${#} -gt 0 ]; do
>>           case "${1}" in
>> @@ -65,6 +66,9 @@ main() {
>>           (-e|--externals)
>>               BR2_EXTERNALS="${2}"; shift 2
>>               ;;
>> +        (-f|--fail-on-skip)
>> +            fail_on_skip=1; shift 1
>> +            ;;
>>           (--)
>>               shift; break
>>               ;;
>> @@ -147,7 +151,12 @@ main() {
>>       printf "%d builds, %d skipped, %d build failed, %d legal-info failed\n" \
>>           ${nb} ${nb_skip} ${nb_fail} ${nb_legal}
>>   
>> -    return $((nb_fail + nb_legal))
>> +    nb_result=$((nb_fail + nb_legal))
>> +    if [ ${fail_on_skip} ]; then
>> +        nb_result=$((nb_result + nb_skip))
>> +    fi
>> +
>> +    return $nb_result
>>   }
>>   
>>   build_one() {
>> @@ -279,6 +288,9 @@ Options:
>>           Externals to be used as part of the build process. Packages from
>>           within these externals may be tested.
>>   
>> +    -f, --fail-on-skip
>> +        If any builds are skipped, return a negative exit value.
>> +
>>   Example:
>>   
>>       Testing libcec would require a config snippet that contains:
>> -- 
>> 2.17.1
>>
>> _______________________________________________
>> buildroot mailing list
>> buildroot@buildroot.org
>> https://lists.buildroot.org/mailman/listinfo/buildroot
>
diff mbox series

Patch

diff --git a/utils/test-pkg b/utils/test-pkg
index d0472f176b..97957008fa 100755
--- a/utils/test-pkg
+++ b/utils/test-pkg
@@ -18,8 +18,8 @@  main() {
     local -a toolchains
     local pkg_br_name
 
-    o='hakc:d:n:p:r:t:e:'
-    O='help,all,keep,prepare-only,config-snippet:,build-dir:,number:,package:,random:,toolchains-csv:,externals:,'
+    o='hakc:d:n:p:r:t:e:f'
+    O='help,all,keep,prepare-only,config-snippet:,build-dir:,number:,package:,random:,toolchains-csv:,externals:,fail-on-skip'
     opts="$(getopt -n "${my_name}" -o "${o}" -l "${O}" -- "${@}")"
     eval set -- "${opts}"
 
@@ -29,6 +29,7 @@  main() {
     number=0
     mode=0
     prepare_only=0
+    fail_on_skip=0
     toolchains_csv="${TOOLCHAINS_CSV}"
     while [ ${#} -gt 0 ]; do
         case "${1}" in
@@ -65,6 +66,9 @@  main() {
         (-e|--externals)
             BR2_EXTERNALS="${2}"; shift 2
             ;;
+        (-f|--fail-on-skip)
+            fail_on_skip=1; shift 1
+            ;;
         (--)
             shift; break
             ;;
@@ -147,7 +151,12 @@  main() {
     printf "%d builds, %d skipped, %d build failed, %d legal-info failed\n" \
         ${nb} ${nb_skip} ${nb_fail} ${nb_legal}
 
-    return $((nb_fail + nb_legal))
+    nb_result=$((nb_fail + nb_legal))
+    if [ ${fail_on_skip} ]; then
+        nb_result=$((nb_result + nb_skip))
+    fi
+
+    return $nb_result
 }
 
 build_one() {
@@ -279,6 +288,9 @@  Options:
         Externals to be used as part of the build process. Packages from
         within these externals may be tested.
 
+    -f, --fail-on-skip
+        If any builds are skipped, return a negative exit value.
+
 Example:
 
     Testing libcec would require a config snippet that contains: