actions / toolkit

The GitHub ToolKit for developing GitHub Actions.
https://github.com/features/actions
MIT License
4.93k stars 1.42k forks source link

Multiline support for Toolkit Annotations #193

Open svartalf opened 4 years ago

svartalf commented 4 years ago

This is a follow-up issue started at https://github.com/actions/toolkit/issues/186#issuecomment-546772099.

It is unclear from the recently added Annotation docs if ::debug/::warning/::error messages support multiline text in the {message} placeholder.

Why it is important? These Annotations can be used by various code linters and other similar tools, but their output easily could be spanned to multiple lines, for example:

pylint output:

W:108: Operator not followed by a space
     print >>sys.stderr, 'Unable to match %r', line
            ^

Rust compiler output:

warning: comparison is useless due to type limits
  --> example/src/lib.rs:20:8
   |
20 |     if pid < 0 {
   |        ^^^^^^^
   |
   = note: `#[warn(unused_comparisons)]` on by default

It would be nice to clarify if it is possible to use multiline strings over there and it is expected to be working correctly in the future.

danechitoaie commented 4 years ago

+1 At least some kind of initial feedback. Is it possible or not? And then maybe follow up with updating the docs.

EricWF commented 4 years ago

+1. This is one of the last blocking issues blocking me from moving to Github Actions. The output of my test suites failures are much longer than a single line, and I have no way to display them nicely.

BrianHenryIE commented 4 years ago

It can be achieved by using urlencoded newline %0A in place of \n.

I learned it from a comment by @PoisonousJohn at https://github.com/actions/starter-workflows/issues/68#issuecomment-581479448

I've confirmed it working for PHPUnit output and have a PR: https://github.com/mheap/phpunit-github-actions-printer/pull/14/files

And here's a screenshot of the outcome: https://i.imgur.com/nnSCPTG.png

Zero documentation anywhere, thank you @PoisonousJohn !

EricWF commented 4 years ago

I just discovered this, Cheers! I can confirm it works and have used it successfully in a workflow.

PS. @BrianHenryIE Have you discovered a way to make problem matchers work with multi-line messages?

Profpatsch commented 2 years ago

Wow, such an important feature and the only way to solve it is via an undocumented hack.

Why not just use a json object printed on one line, which can be readily produced with e.g. jq? Is this the quality standard the Github Actions team wants to stay at?

Fleshgrinder commented 2 years ago

The same trick can be used in echo "::warning::multi%0Aline" commands within a workflow. This creates a multiline annotation, but only the first line in the build log is going to be highlighted, all that follows show up as normal.

rhaschke commented 1 year ago

The same trick can be used in echo "::warning::multi%0Aline" commands within a workflow.

Unfortunately, this trick doesn't work anymore: image

rhaschke commented 1 year ago

The Command class (still) uses this escaping: https://github.com/actions/toolkit/blob/7b617c260dff86f8d044d5ab0425444b29fa0d18/packages/core/src/command.ts#L80-L85

muzimuzhi commented 9 months ago

@rhaschke It seems the %0A trick still works, see https://github.com/pgf-tikz/pgf/actions/runs/7294270657.

rhaschke commented 9 months ago

It seems the %0A trick still works, see https://github.com/pgf-tikz/pgf/actions/runs/7294270657.

For me, the multi-line output is only shown correctly when clicking "show more". Without that expansion, everything shows up in a single line, doesn't it? In my example (with a shorter line) it doesn't work: https://github.com/rhaschke/test/actions/runs/5961263674 As the line(s) are too short, there is no "show more" button provided.

muzimuzhi commented 9 months ago

@rhaschke Yes, you observation is right.

justinmchase commented 7 months ago

The new lines (escaped with %0A) don't appear to be respected in the annotation view of the errors...

new lines are not displayed

Screenshot 2024-03-05 at 9 09 07 AM

raw logs show newlines correctly

Screenshot 2024-03-05 at 9 09 26 AM

Also, I definitely expected it to respect markdown but it does not, which is surprising.

tsigouris007 commented 6 months ago

Is there any actual way that works here? %0A does not work for me as well now.

Ximaz commented 5 months ago

I search for something similar but unable to find. I'd like to display valgrind's logs for memory leaks as an Error annotation, but it's multiline. I tried to do so :

-   name: "Analyze valgrind report"
    run: |
        status=0
        block=""
        while IFS= read -r line; do
            if [[ "${block}" != "" ]]; then
                if [[ $(echo "${line}" | grep '^==.*== $') ]]; then
                    echo "::error title=\"Valgrind Error\"::${block}"
                    block=""
                    status=1
                else
                    block="${block}
        ${line}"
                fi
            fi
            if [[ $(echo "${line}" | grep '^==.*== .* bytes in .* blocks are definitely lost in loss record .* of .*$') ]]; then
                block="${line}"
            fi
        done < valgrind-reports.log
        rm -f valgrind-reports.log
        exit "${status}"

And you can see that I'm leaving a line, without having to specify %0A, but the result is quite similar to the one above.

image image

I think it would be cool to have a sort of ::group:: ::endgroup:: but making it working for error, warning and so on, so it also gets displayed on the workflow summary.

In fact, it appeared that %0A works, I mean, at least regarding the summary :

image

But when clicking on the details, other logs are still shown outside of the error scope.