node {
	environment {
        static_BUILD_NUMBER = '9'
        //dotnet = 'C:/Program Files/dotnet/sdk/3.0.100-preview8-013656/dotnet.exe'
        }
	
stage 'Checkout'		
	checkout scm

stage 'Build'
	// clean artifacts folder, otherwise version file from previous build may still there.
	dir('sln_build/LiteFccCore3') {    			
		deleteDir()
	}
	
	def jkBuildNumber = env.BUILD_NUMBER	
	def buildTimeStr = new Date().format('yyyy-MM-dd_HH-mm-ss')
	echo "Jenkins env.BUILD_NUMBER: " + jkBuildNumber + ", buildTimeStr: " + buildTimeStr

	def manualVersionFromFile = readFile("version.txt")
	manualVersionFromFile = manualVersionFromFile.replaceAll(~/\n/, "").trim()
	echo "Manual Version read from file version.txt is: " + manualVersionFromFile
		
	currentBuild.description = "manual Ver: " + manualVersionFromFile		
	
	def assemblyVersionStr = manualVersionFromFile + "." + jkBuildNumber
	echo "AssemblyVersionStr (manualVersion + JenkinsBuildNumber) set to: " + assemblyVersionStr
	
	//bat 'dotnet restore LiteFccCore.sln'
	//bat 'dotnet build -c release LiteFccCoreMain/LiteFccCoreMain.csproj'
	//def dotnetPublishCommandText = "dotnet publish /p:AssemblyVersion=\"${env.BUILD_NUMBER}\" -c release LiteFccCoreMain/LiteFccCoreMain.csproj"
	       
	def dotnetPublishCommandText_win_x64 = "dotnet publish -f netcoreapp3.1 -r win-x64 --self-contained false /p:AssemblyVersion=\"${assemblyVersionStr}\" /p:Version=\"${assemblyVersionStr}\" /p:FileVersion=\"${assemblyVersionStr}\" -c release LiteFccCore.sln -o sln_build/LiteFccCore3/win_x64"
	bat dotnetPublishCommandText_win_x64
	
	def dotnetPublishCommandText_win_x86 = "dotnet publish -f netcoreapp3.1 -r win-x86 --self-contained false /p:AssemblyVersion=\"${assemblyVersionStr}\" /p:Version=\"${assemblyVersionStr}\" /p:FileVersion=\"${assemblyVersionStr}\" -c release LiteFccCore.sln -o sln_build/LiteFccCore3/win_x86"
	bat dotnetPublishCommandText_win_x86
	
	def dotnetPublishCommandText_linux_arm = "dotnet publish -f netcoreapp3.1 -r linux-arm --self-contained false /p:AssemblyVersion=\"${assemblyVersionStr}\" /p:Version=\"${assemblyVersionStr}\" /p:FileVersion=\"${assemblyVersionStr}\" -c release LiteFccCore.sln -o sln_build/LiteFccCore3/linux_armhf"
	bat dotnetPublishCommandText_linux_arm
	
	def dotnetPublishCommandText_linux_arm_64 = "dotnet publish -f netcoreapp3.1 -r linux-arm64 --self-contained false /p:AssemblyVersion=\"${assemblyVersionStr}\" /p:Version=\"${assemblyVersionStr}\" /p:FileVersion=\"${assemblyVersionStr}\" -c release LiteFccCore.sln -o sln_build/LiteFccCore3/linux_arm64"
	bat dotnetPublishCommandText_linux_arm_64
	
	//def dotnetPublishCommandText_linux_arm_self_contained = "dotnet publish -f netcoreapp3.1 -r linux-arm --self-contained true /p:AssemblyVersion=\"${assemblyVersionStr}\" /p:Version=\"${assemblyVersionStr}\" /p:FileVersion=\"${assemblyVersionStr}\" -c release LiteFccCore.sln -o sln_build/LiteFccCore3/linux_arm_self_contained"
	//bat dotnetPublishCommandText_linux_arm_self_contained
  
stage 'UnitTests'
	bat returnStatus: true, script: "dotnet test \"${workspace}/LiteFccCore.sln\" --logger \"trx;LogFileName=unit_tests.xml\" "
	step([$class: 'MSTestPublisher', testResultsFile:"**/unit_tests.xml", failOnError: true, keepLongStdio: true])
    
stage 'Archive'	
	def releaseNoteFileName = manualVersionFromFile + "." + jkBuildNumber + "_(" + buildTimeStr + ")_ReleaseNote.txt"
	echo "ReleaseNote file name will be set to (ManualVersion + JenkinsBuildNumber + buildTime): " + releaseNoteFileName		

	releaseNoteFileContentHeader = "BUILD_NUMBER: " + env.BUILD_NUMBER + ", BUILD_ID: " + env.BUILD_ID + ", BUILD_URL: " + env.BUILD_URL + ", NODE_NAME: " + env.NOTDE_NAME + ", JOB_NAME: " + env.JOB_NAME

	//echo releaseNoteFileContentHeader
	echo "ReleaseNoteFileContentHeader: " + releaseNoteFileContentHeader
	latestCommit = bat(returnStdout: true, script: "git log -n 80")
	releaseNoteFileContent = releaseNoteFileContentHeader + "\r\n\r\n\r\n" + latestCommit
	// echo shortCommit
	// prepare a release note file in artifacts root folder
	writeFile(file: releaseNoteFileName, text: releaseNoteFileContent, encoding: "UTF-8") 

	// write the releaseNote file into publish folder, need modify, will break for other net core version (from 2.1)
	writeFile(file: "sln_build/LiteFccCore3/" + releaseNoteFileName, text: releaseNoteFileContent, encoding: "UTF-8") 
	archiveArtifacts artifacts: 'sln_build/LiteFccCore3/**', casesensitive: false
	archiveArtifacts artifacts: releaseNoteFileName, casesensitive: false

}



def sendmail(jobName,committer){
	def mailRecipients = "YourEmail1@company.com YourEmail2@company.com YourEmail3@company.com"
	emailext body: '''${JELLY_SCRIPT,template="PlaygroundMerge"}''',
                mimeType: 'text/html',
                subject: "Merge job create by ${committer} status - ${currentBuild.result}",
                to: "${mailRecipients};${committer}",
                replyTo: "${mailRecipients}",
                recipientProviders: [[$class: 'CulpritsRecipientProvider']]
}



def changelist() {
    def changes = ""
    currentBuild.changeSets.each { set ->
        set.each { entry ->
            changes += "${entry.commitId} by ${entry.author.fullName}\n"
        }
    }
    return changes
}

def notifyBitbucket(String state) {
	println "Notify Bitbucket With " + state + ", Commit = " + "${Commit}"
    if('SUCCESS' == state || 'FAILED' == state) {
        currentBuild.result = state         // Set result of currentBuild !Important!
	}
	
	notifyBitbucket commitSha1: '${Commit}', 
					credentialsId: 'Bitbucket_PG_Global_For_Notification_User_Pass', 
					disableInprogressNotification: false, 
					considerUnstableAsSuccess: false, 
					ignoreUnverifiedSSLPeer: true, 
					includeBuildNumberInKey: false, 
					prependParentProjectKey: false, 
					projectKey: '', 
					stashServerBaseUrl: 'http://www.your_BitBucket_Server:7990'

}