Today I discovered a new (for me) FAKE feature called FinalTarget. I worked on integration with our new product ReportPortal (in beta right now) that collects and visualizes test results and faced a problem …
The integration process is the following:
- Start a new launch (test session) on the server
- Execute all tests: unit & integration tests (in my scenario).
- Close a launch on the server
As you see, I need to close a launch even in the case when tests failed. So I cannot stop an execution of build script directly on the failure. Unexpectedly, but FAKE provides an elegant solution for this scenario – FinalTarget (target that will be executed in any case if you activate it).
FAKE dependencies look like this in my script:
"Clean" ==> "RestorePackages" ==> "Build" =?> ("RP_StartNewLaunch", not <| hasBuildParam "skipTests") =?> ("RunUnitTests", not <| hasBuildParam "skipTests") =?> ("RunIntegrationTests", hasBuildParam "allTests") =?> ("RP_FinishLaunch", not <| hasBuildParam "skipTests") ==> "All"
Targets look like this:
Target "RP_StartNewLaunch" (fun _ -> ... ActivateFinalTarget "RP_FinishLaunch" ) FinalTarget "RP_FinishLaunch" (fun _ -> ... ) Target "RunUnitTests" (fun _ -> ... ) Target "RunIntegrationTests" (fun _ -> ... )
As you see, I defined FinalTarget instead of usual Target for “RP_FinishLaunch” and activated it on start of a new launch.
FAKE is awesome😉