That's a cool tutorial Dave, thanks for sharing. It's pretty clear and easy to follow. I have a couple of comments:
1) In step 0 you do some coding but you don't use Che. You could instead start the workspace first (without any project) and use Che to bootstrap your project.
2) Building a custom image is not really necessary. You can use an official gcc image as [1] or [2].
3) You selected C as the language for your test. And we do not have a language server yet. You could have used go, python, java, c#, _javascript_ or php instead (the issue [3] with the initial Che 7 stacks).
About your questions:
How can I lint devfiles to check if I have a valid file before passing it to Che?
I don't think we have a way to verify that currently. We have the command chectl devfile:generate. I think it's a good idea to have chectl devfile:verify. I have created an issue [4]
In "how to start a workspace from a devfile, I did not know if there was a way to upload a devfile as a Che instance admin to make it
available in the new project dashboard - can someone explain, if that's possible, how to do it, please?
The plan is to render the list of stacks that you see on the dashboard from the devfiles published in the devfile-registry. This task is not completed yet (see [5]) but when it will, you will be able to add a stack publishing a new devfile in the devfile-registry.
I would like to have the clangd language server running on the workspace. How do I do that?
I am afraid you need to wait for [6] to be completed or you can reach the language team on MM and help contributing to the doc
I did not find a way to push changes to github - is there a way to specify a private SSH key for my account to use with github, and to set
some git config settings (user.email and user.name at a minimum) for signing off and committing? That's something that annoys me as well and I am not sure we have a proper solution yet. At least until the GitHub pull-request plugin is going to land in the che-plugin-registry [7]. As of today you can generate a new SSH key, copy it in your workspace and adding it to your GH account.
What would be involved in running gdb to debug a C program, and being able to manage it from the IDE?
We need to have the C/C++ debug adapter running on the workspace. That's similar to your clangd question. Once this is done you can set a launch.json in your workspace (or devfile) to start your application in debug mode and control it from the IDE .
What's involved in running (say) SonarQube?
Do you mean sonarlint? If that's the case you can add the plugin sonarsource/sonarlint-vscode/latest in your devfile. If you want instead to run SonarQube (or whatever service that can run on a docker image) you can use a component of type dockerimage.