For a long time now, I had a script where I was passing --no-build
to a dotnet test
command, because otherwise it got stuck in a very weird way. The tests never started running (in fact the build never finished), and if I hit Ctrl-C
to stop it, even though it apparently stopped, something kept running in the background and printing warnings to my console, on top of whatever else I was doing.
I googled keywords from the warning and couldn’t find anything relevant. Today I had to deal with this script again and decided to fix it once and for all.
For context, this is a bash script that runs on Windows (with Git Bash) and basically does the following:
– Start a test environment with several containers using docker-compose
.
– Figure out which ports were exposed on the host for some of those containers and export them as environment variables (so the project being run with dotnet test
sees them).
– Run dotnet test
to execute the tests in a project.
– Use docker-compose
to remove the environment we spun up earlier.
So I started troubleshooting my dotnet test
command.
It ran fine outside the script, and also by itself inside an .sh
file. So I started adding all the other pieces of the script little by little, until I found the one that made dotnet test
hang. It was a line pretty much identical to this:
TMP=$(docker port ${PROJECT_NAME}_myservice_1 80)
That’s (part of) how I get the port that was exposed for a particular container, but I refused to believe that executing docker port
had anything to do with the problem. So I tried renaming TMP
to TMP_PORT_INFO
… and what do you know, the script didn’t get stuck anymore!
I couldn’t find any official documentation about this, but it seems like dotnet build
(which dotnet test
runs implicitly) depends on the TMP
variable to be a path to a temporary storage location for the system. A bit of research made me think that in UNIX, the relevant variable is TMPDIR
, but in Windows it’s TMP
.
So there you have it. If you want to avoid some painful troubleshooting, just don’t use TMP
as a variable name in your scripts.