Some very interesting ideas there, thanks a lot for sharing. My ecosystem is a bit different, but i guess some will definitely help. As for config files, after thinking about it, i agree and came to the conclusion, that it is not really more effort to inherit a class and keep defaults for a simple new tool rather than write a YAML config file…actually au contraire it would be more hassle to have yet another “language” in the mix there.
So i’d like to lay out in more detail what i want to accomplish and what i am currently planning. Maybe this is interesting for some, and maybe you guys have some more input.
On the development side i plan to distinguish between products and the pipeline/toolsets. Mainly because they are developed, deployed and used differently. The pipeline and toolset would contain all the day-to-day used scripts, plugins and tools. Products are defined either by being sold/licensed to clients or by beeing complex enough to be developed like a product rather than part of the toolset (even tho both might be in use in production obviously). I am currently mainly concerned with the pipeline and toolset part. As a sidenote a product would be developed with more elaborate planning, have a release cycle, milestones etc. Whereas the pipeline and toolset is treated more like a single big project/product than many small ones.
What is part of the production toolset?
On the application side i have to support 3d Studio Max (usually min. 2 different Versions at any given time), Nuke (also usually min. 2 Versions), VRay (used to be one Versionlock per Max Version, will be more free with the new approach i am aiming for), Photoshop (yuck) and a load of internal tools ranging from small app-specific 3-liners to products beeing licensed to clients and SaaS products.
We have our own internal production tracking system to handle all task- and time-tracking and a lot more. Its local client app should also handle opening the correct apps in the correct environment in the future.
Development and deployment strategies
As said i plan on having different approaches for products and pipeline. Products will be more traditional, whereas pipeline will be more along the lines of http://scottchacon.com/2011/08/31/github-flow.html with some twists. Basically i plan on having two main branches (i’ll call them master and dev for now). Both of these branches should always be in a deployable state. So no real development is happening there. A typical feature cycle would be as follows. You create a new named branch for a feature to work on. You tweak until you are ready to test. Then you issue a pull request, have someone review quickly and merge into dev. This triggers unittests (via jenkins) and deployment to the dev environment (also via Jenkins). At this point users (usually supes and TDs and alike) would launch their tools in the dev environment to test the new stuff. When approved you’d merge your changes to master. This would trigger unittests on master, and deployment to the production environment (again both via Jenkins).
We only run unittests on a bunch of our products. In the future i would like to make unit-tests required for at least everything that can be re-used (anything that has an API or is a library i guess).
Enviroments
So this is the point where the original question comes into play. Basically i am looking for an easy way to launch tools from dev/production and to be able to select different versions of tools within both of them (e.g. different VRay Versions). So an Environment in that sense could consist of the following for a 3D Artist:
- 3D Studio Max, 2011, VRay nightly built, our production toolset
Or for a 2D Artist
- Nuke, 6.3v8, our current dev toolset
etc.
One thing i am not really aiming for is having different toolsets for the different versions of the tools, only combining different versions of the toolset with different versions of the apps (no per host version selection or anything. Tools are meant to work on all deployed versions or have proper abstraction).
So for now i would say i am going to have some kind of an abstract Tool class, that has methods for setting up, tearing down, launching etc. And for each tool i’d simply inherit and then auto-discover all inherited classes to be able to populate launchers etc.
One of these might still be a SimpleTool class or similar that allows adding commandline tools by simply having a bunch of simple config files that anyone can write. Will have to see if there is a use for that first.
Any input is very welcome. Feel free to roast me
Kind regards,
Thorsten