Hi!
 
Thanks for the patch!
LGTM, except for comments by Sergey and a few of mine:

> + # We use a trick here: define the concurrency group as 'workflow
> + # run ID' + # 'workflow run attempt' because it is a unique
> + # combination for any run. So it effectively discards grouping.
> + #
> + # XXX: we cannot use `github.sha` as a unique identifier because
> + # pushing a tag may cancel a run that works on a branch push
> + # event.
> + group: ${{ (
> + github.ref == 'refs/heads/tarantool' ||
> + startsWith(github.ref, 'refs/heads/tarantool-')) &&
> + format('{0}-{1}', github.run_id, github.run_attempt) ||
> + format('{0}-{1}', github.workflow, github.ref) }}
> + cancel-in-progress: true
IMO, it’s better to use a combination of `github.sha` + `github.event`,
since all you want is to suppress cancelation caused by tag push.
It is essentially the same, but at least it preserves the semantics.

So maybe we can use matrix to cover all these workflows as showing
here[5], using environment variables to determine setup step for the
particular OS (macOS or Linux)?

But maybe I am overcomplicating things, so feel free to ignore. :)
I think that in our case it is actually better to have a lot of workflow configs.
From time to time we encounter some issues only on certain operating
systems, so it is great to have the ability to fine-tune workflow config only for
one particular OS.
 
Best regards,
Maxim Kokryashkin