For now we rely only on the current operations provided by Iceberg. The good part is that we could use them to build a release tool. We are still missing some operations that would make releaser more resilient. Now we get releases that fail because of the way we use Iceberg.
In short we use a dedicated release branch and we need to merge the master branch into the release branch. Now we checkout the release branch explicitly which changes the image code causing all sorts of troubles. For example, we cannot really create releases for the releaser project using releaser, as the running code can change during the release. Also releasing Bloc using a UI based on bloc does not work well.
What we are currently missing is to be able to configure a merge with a conflict resolution and checkout strategy. Then we could have merges that do not load code. There is another thread discussing this 
What would also be useful is to have more operations at the libgit level. For example, not sure how to use libgit now to make a merge. That would make it possible to experiment with other ways of doing a release, like just using low level libgit operations without changing any code in the image.