1. I'd like to add to @Nicole Aaron answer, that moving code is done in two separate steps:

  • On developer machine the code is created, written to files and commited into source control system
  • CI/CD server (in your case TFS) is triggered on repository push and executes CI script - which is OS-level commands in our particular case and would be the same between GitLab or TFS.

Interesting questions.

  1. There are several ways to achieve clean and pseudo-clean builds:
    • Containers. Clean builds every time. Next articles in the series explore how containers can be used for CI/CD.
    • Hooks. Curently I implemented one-time and every-time hooks before and after build. They can be used to do deletion, configuration, etc.
    • Recreate. Add action to delete before build:
      • DBs
      • Namespaces
      • Roles
      • WebApps
      • Anything else you created
  2. I agree with @Ben Spead here. System default settings are the way to go. If you're working outside of  Ensemble architecture, you can create a small settings class which gets the data from global/table and use that. Example.

Thank you, ended up extracting this method:

ClassMethod GetPrivateProp(oref, propName) As %String
{
    Set value = ""
    Set cd=$system.CLS.DumpContext(oref,0)
    Set inst=$piece(cd,"^",8)
    For j=1:1:inst {
        Set pd=$system.CLS.Property(j,oref,0)
        Set ivar=$piece(pd,"^")
        CONTINUE:ivar'=propName
        Set slot=$piece(pd,"^",2)
        Set value = $zobjval(oref,slot,0,3,slot)
        Quit
    }
    
    Quit value
}

UPD: Simplified code, thanks to @Dmitry Maslennikov suggestion:

ClassMethod GetPrivateProp(oref, propName) As %String
{
    Set pd=$system.CLS.Property(propName,oref,0)
    Set slot=$piece(pd,"^",2)
    Set value = $zobjval(oref,slot,0,3,slot)
    Quit value
}

1. I definitely recommend using CLS and not XML for general readability and also sane blame/diff output.

2. There should not be any differences to usual Git development (as described in the series of articles you mention). One of our customers is using TFS for Ensemble development. Are you using Studio or Atelier? VSCode? If Studio, you'll need a source control hook, Atelier works as is and you'll need a plugin for VS Code.

3.Check this article for info on CI/CD on TFS.

I'd also recommend to remove or change this line:

if ($$$ISERR(tStatus)) quit

because your method signature has a promise to return a %Status:

Method OnProcessInput(pInput As %FileCharacterStream, pOutput As %RegisteredObject) As %Statu

however above mentioned line quits nothing.

You can rewrite it like this (to return status):

if $$$ISERR(tStatus) quit tStatus

or my personal preference like this using postconditionals:

quit:$$$ISERR(tStatus) tStatus

Well in this exact case you need to remove the line altogether because you no longer get status for ReadLine, but it's just some food for thought.

You need to specify where you want to send your request. Something like this should work.

Method OnD03Alert(req As User.Alert, Output resp As Ens.StreamContainer) As %Status
{
    #Dim sc As %Status = $$$OK      
    #Dim test As %Integer = 0
    
    Set httprequest = ##class(%Net.HttpRequest).%New()   
    Set httprequest.Server =  "www.usamobility.net"
    Set httprequest.Location = "cgi-bin/wwwpage.exe"
    
    Do httprequest.SetParam("PIN", ..PIN)
    Do httprequest.SetParam("MSSG", "motogplay")
    
    Set sc = httprequest.Post(, test, $$$NO)
    
    If $$$ISOK(sc) {
        Set stream = httprequest.HttpResponse.Data
        Set resp = ##class(Ens.StreamContainer).%New(stream)
    }
    Quit sc
}

Also Ensemble operations must return persistent objects so I replaced string with Ens.StreamResponse.