SonarQube Scanner and SonarQube Server Configuration in Jenkins
Hi Welcome back to Burmese Bytes
SonarQube Server á Scanner áá˛áˇ Quality Gate áááŻáˇáá˛áˇ work flow áááŻáááááąá¸áááşááąáŹáˇ ááŽáážáŹáĄáááşááŻáśá¸áá˝áŹá¸ááźááˇáşáááŻááşááŤáááşá
ááŽáĄáááŻááşá¸áážáŹááąáŹáˇ Application Source Code áá˝áąááᯠSonar Scanner áá˛áˇ Scan áááş ááźáŽá¸ SonarQube Server ááŽááᯠreport áĄááąáá˛áˇ áááŻáˇáá˛áˇ Step áá˝áąááᯠJenkins pipeline áá˛áˇ integrate ááŻááşááźáá˝áŹá¸áážáŹááŤá
áĄáąáŹááşá step áá˝áąááᯠáá áááşáááş áĄáááş ááŻáśá¸ perquisite áĄááąáá˛áˇ SonarQube Server install ááŹá¸áááŤáááşá
áááŻááşáááąá¸áááş ááŽáážáŹ ááźááˇáşááŻááşáááŻááşááŤáááşá
Jenkins pipeline job áá áşáᯠáážááááŤáááşá Jenkins áá˛áˇ ááááşááááşá¸ááŽá¸ááąá¸áááş CI/CD Tools áááŻáá˛áˇ Series áĄáąáŹááşáážáŹ Jenkins áá˛áˇ áááşáááşááźáŽá¸ Burmese Bytes áá˛áˇ Member áĄáááŻáá áşááąáŹááşááąá¸ááŹá¸ááŹáážáááŤáááşáJenkins áá˛áˇ ááááşááááşá¸ááŽá¸ááąá¸áááş áĄáááşá ááşá¸ááźááˇáşáááˇáşááŤáááşá
ááŤáááŻáááşááąáŹáˇ á áááŻáˇáááąáŹááşááźáŽáááşááŤáááş âŚ
áážááşááá˝ááşáĄáąáŹááş ááŻááşááááˇáş Step ááąá¸áá˝áąááᯠáĄáááşááŻáśá¸ Checklist ááąá¸áá˝áą ááťááąá¸ááźááˇáşááĄáąáŹááşá
Check List
Install and configure the SonarQube Scanner Plugin in the Jenkins Management Console.
Install and configure the SonarQube Scanner tools in the Jenkins Management Console.
Configure the SonarQube server connection in the Jenkins Management Console.
- Generate a SonarQube server authentication token and create a Jenkins credential with the token.
Create a project in the SonarQube Server Management Console.
1. Install and configure the SonarQube Scanner Plugin in the Jenkins Management Console.
áĄáááşááŻáśá¸ SonarQube Scanner Plugin ááᯠJenkins áá˛áˇ Plugins áá˛áááąáážáŹááźáŽá¸ install ááŻááşáááŤáááşá
Jenkins Management Console áááą Manage Jenkins > Plugins > Available plugins áááŻáá˝áŹá¸áááŻááşá፠ááźáŽá¸áááşááąáŹáˇ Search box áážáŹ SonarQube Scanner áááŻááźáŽá¸ááŻáśáážáŹááźááŹá¸áá˛áˇáĄáááŻááşá¸ install áááŻááşáááşáááŤááźáŽá
Plugin: https://plugins.jenkins.io/sonar/
SonarQube Scanner Plugin ááᯠinstall ááŻááşááźáŽá¸ááŹáá˛áˇ Jenkins Management Console áááą Manage Jenkins > Tools áá˛ááᯠáá˝áŹá¸ááźáŽá¸ áĄáąáŹááşáááşááᯠScroll áá˝á˛ááźááˇáşáá˛áˇáĄááŤáážáŹ SonarQube Scanner áá˛áˇáááşáááşáá˛áˇ Tools Configuration ááŻááşáááŻáˇááá˛áˇááąááŹáá áşáᯠááᯠáá˝áąáˇáááŤááááˇáşáááşáááşá
ááąáŹááşáá áşááŻáááąáŹáˇ Manage Jenkins > Systems áá˛ááᯠáá˝áŹá¸ááźáŽá¸ áĄáąáŹááşáááşááᯠscroll áá˝á˛ááźááˇáşáá˛áˇáĄááŤáážáŹ SonarQube Servers áá˛áˇáááşáááşáá˛áˇ Configuration ááŻááşáááŻáˇááá˛áˇááąááŹáá áşáᯠáá˝áąáˇáááŤááááˇáşáááşá
2. Install and configure the SonarQube Scanner tools in the Jenkins Management Console.
áĄáááşááŻáśá¸ SonarQube Scanner áá˛áˇ Tools configurations ááᯠáĄáááş á
ááŻááşááŤáááşá áĄá˛áˇááŽáážáŹ áááááŹá¸ááážáŹá áááŻááşá dotnet(Microsoft .NET) application áĄáá˝ááşáááŻáááşááąáŹáˇ SonarScanner for MSBuild
ááᯠinstall ááŻááşááąá¸ááážáŹ ááźá
áşááźáŽá¸ áááźáŹá¸ Application áááŻáááşááąáŹáˇ ááŹááŹááş SonarQube Scanner
áááŻáᲠinstall ááŻááşááážáŹááŤá
SonarQube Scanner
áááŻáᲠááŻáśá¸áááşáááŻáááşááąáŹáˇ Jenkins console áááą Manage Jenkins > Tools áá˛ááᯠááźááşáá˝áŹá¸ááźáŽá¸áááş ááŻáśáážáŹááźááŹá¸áá˛áˇáĄáááŻááşá¸ Scanner installations áááŻááźáŽá¸áážáŹáááŻáˇáá˝áąáˇáááŻááşááŤáááşáAdd SonarQube Scanner ááᯠáážáááşááźáŽá¸ ááŽáááŻááşá¸ááąá¸áá˝áąá¸ááąá¸áááŻááşáááşáááŤááźáŽá áᎠtools ááąá¸áááą ááŽááááŻáˇáá˛áˇ Source Code áá˝áąááᯠScanner áááşááąá¸áážáŹááŤá Name áááŻááąáŹáˇ ááŽáážáŹ Sonar áááŻáˇáᲠááąá¸ááŹá¸áááŻááşááŤáááşá
Manage Jenkins > Tools > SonarQube Scanner installations
3. Configure the SonarQube server connection in the Jenkins Management Console.
ááąáŹááşáá áşááŻáááąáŹáˇ Scanner ááááşáááŻáˇááá˛áˇ scanning reports áá˝áąááᯠSonarQube Server ááŽááᯠáááŻáˇáááŻááşáááŻáˇ Connection áĄáá˝ááş SonarQube Server Configurations ááᯠJenkins System áá˛áážáŹ ááŻááşáááŤáááşá SonarQube server connection áĄáá˝ááş configuration áááŻááşáááşáážáŹ áááŻáĄááşááŹáá˝áąáááŻáĄáááşááŻáśá¸ááŻááşáááŤáááşá áĄá˛áˇááŹáá˝áąáááąáŹáˇ
SonarQube Scanner ááŽáááą SonarQube Server ááŽááᯠscanning reports áá˝áąáááŻáˇáá˛áˇáĄá፠authenticate ááŻááşáááŻáˇáĄáá˝ááş access token áá áşááŻáááŻááŤáááşá Access token ááᯠSonarQube Server áážáŹ Generate ááŻááşáááŤáááşáááźáŽá¸áááşááąáŹáˇ áááŹáá˛áˇ access token ááᯠJenkins áážáŹ Credential áá áşááŻáĄááąáá˛áˇ Create ááŻááşáááŤáááşá áᎠstep ááąá¸áá˝áąá ááŻááşááźááĄáąáŹááş âŚ
3.1 Generate authentication access token in SonarQube Server
SonarQube Server Console áááŻáá˝áŹá¸ááŤáááşá ááźáŽáááş ááŹáááş áĄááąáŤáşááąáŤááˇáşááąá¸áážáŹáážááá˛áˇ Account ááŻáśá
áś icon ááąá¸áááŻáážáááşááźáŽá¸ My Account áá˛áááŻáá˝áŹá¸ááŤá (ááŽáážáŹááąáŹáˇ admin account áááŻáá˛ááŻáśá¸ááźááŹá¸ááŤáááş)(ááŽáááŻááşá¸áááşá¸áá˝áŹá¸áááŻááşááŤáááş http://sonar-qube-url/account
)
ááźáŽá¸áááşááąáŹáˇ Security Tab áááŻáá˝áŹá¸ááŤá áĄáąáŹááşáážáŹááźááŹá¸áá˛áˇáĄáááŻááşá¸ Token name, Type Token Expire Date áááŻáˇááᯠáááşáážááşááźáŽá¸ Generate ááŻááşáááŻáˇáááŤááźáŽá type ááᯠGlobal Analysis Token áááŻáˇáᲠáá˝áąá¸ááŹá¸ááŤáááşá
Generate ááŻááşáááŻááşááźáŽáááŻááŹáá˛áˇ ááŽááᯠtoken ááąá¸ááᯠáĄáąáŹááşáááŻáśáĄáááŻááşá¸áá˝áąááážáŹááŤá Copy áá°á¸áá˛áˇá፠ááťáąáŹááşáá˝áŹá¸áážáŹá ááŻá¸áááş notepad áážáŹ ááźá áşááźá áş áá paste ááŻááşááŹá¸ááŤá ááźáŽá¸áááşááąáŹáˇ áĄá˛áˇáᎠtoken ááᯠJenkins áážáŹ credential áĄááąáá˛áˇ create á ááŻááşááŤáááşá
ááŽáá áşááŤáážáŹááąáŹáˇ áĄááŻá áááŹáá˛áˇ token ááᯠJenkins Credential áĄááąáá˛áˇ create ááŻááşáááŻáˇáĄáá˝ááş Jenkins Management Console áááŻááźááşáá˝áŹá¸ááŤáááşá ááźáŽá¸áááş Manage Jenkins > Credentials áá˛áááŻáá˝áŹá¸ááŤáááş Security áĄáąáŹááşáážáŹáážáááŤáááşá ááźáŽá¸áááşááąáŹáˇ Global áááŻáážáááşááźáŽá¸áááşáá˝áŹá¸áááŻááşááŤá
Add Credentials ááᯠáážáááşááźáŽá¸ Credential áĄáá áşáá áşáᯠá ááźáŽá¸ Create ááŻááşáááŻáˇáááŤááźáŽá
ááŽááąááŹáážáŹ Secret text áááŻáá˝áąá¸ááŤáááşá
ááźáŽá¸áááşááąáŹáˇ Secret ááąááŹáážáŹ áĄááŻá Copy ááŻááşáá˛áˇ áá˛áˇ Token áááŻáááˇáşááŤáááşá ID ááąááŹáážáŹááąáŹáˇ ááźááşáá°ááŻáśá¸áááˇáş ááŹáááşáá áşááŻááąá¸áááŻááşááźáŽá¸ Create áááŻááşáááşáááŤááźáŽá
áĄááŻáááŻáááşááąáŹáˇ áĄááąáŤáşáážáŹááźáąáŹáá˛áˇáá˛áˇ Jenkins System áá˛áážáŹ SonarQube Server áĄáá˝ááş Configuration á ááŻááşáááŻáˇáááŻáĄááşáá˛áˇ Access Token áá˛áˇ Credential áá˝áąáááŤááźáŽá
SonarQube Server áĄáá˝ááş Configuration á ááŻááşáááŻáˇ Jenkins Console áááŻááźááşáá˝áŹá¸áááŻááşááŤá ááźáŽá¸áááşááąáŹáˇ
Manage Jenkins > Systems áá˛áááŻáá˝áŹá¸ááźáŽá¸ SonarQube Installations áá˛áˇ áĄáąáŹááşáážáŹ Add SonarQube áááŻáážáááşááŤá
Server URL áááąáŹáˇ SonarQube Server URL Address ááᯠáááˇáşááážáŹááŤá ááŽáážáŹááąáŹáˇ SonarQube Server áá˛áˇ Private IP áááŻáᲠáĄááŻáśá¸ááźáŻááąá¸áááŻááşááŤáááşá
Server authentication token ááąááŹáážáŹáááąáŹáˇ Jenkins áážáŹ Access Token áá˛áˇ create ááŻááşáá˛áˇáá˛áˇ Credential ááᯠáĄááŻáśá¸ááźáŻááážáŹááŤá ááźáŽá¸áááşááąáŹáˇ áááŤááźáŽá Apply > Save áááŻáážáááşááźáŽá¸áá˝ááşáááŻááşááŤá
áĄááŻáááŻáááşááąáŹáˇ SonarQube Server áá˛áˇ Sonar Scanner áááŻáˇáá˛áˇ Installation and configurations ááźáŽá¸áá˝áŹá¸ááŤááźáŽá Source code áá˝áąááᯠScan áááşáááŻáˇáááźáŽááŹá¸ Server ááŽááᯠreport áá˝áą áááŻáˇáááŻáˇáááźáŽááŹá¸ áááŻáˇ á ááźáŽá¸ á ááşá¸ááźááĄáąáŹááşááŤáá áŹáĄáááşá¸áážááşáá˝áŹá¸áážáŹá ááŻá¸áááŻáˇ Quality Gate áááŻááąáŹáˇ ááąáŹááşáááş post áá áşááŻáĄááąáá˛áˇ áááşááąá¸ááŹá¸ááŤáááşá
4. Create a project in the SonarQube Server Management Console.
SonarQube Server áá˛áˇ Sonar Scanner ááᯠá ááşá¸áááŻáˇáĄáá˝ááş SonarQube Server ááŽáááŻáĄáááşáá˝áŹá¸ááŤáááşáááźáŽá¸áááş Project áĄáá áşáá áşáᯠá ááźáŽá¸ Create ááŻááşááŤáááşá
Create a local project áááŻáá˝áąá¸ááźáŽá¸áᲠCreate ááŻááşááŤáááşá
Project Name, Project Key áá˛áˇ default git branch name áááŻáˇááᯠáááˇáşááŤáááş ááźáŽá¸áááş Next áááşáá˝áŹá¸áááŻááşááŤá
Global setting áá˛ááŻáśá¸ááŤáááşá
ááźáŽá¸áááşááąáŹáˇ Jenkins pipeline áá˛áážáŹ ááŻáśá¸áážáŹááááŻáˇ With Jenkins áááŻáá˝áąá¸áááŻááşááŤá
áĄáᯠJenkins pipeline áážáŹááŻáśá¸ááŹá¸áá˛áˇ Code áá˝áąá GitHub áážáŹ áážáááŹááááŻáˇ GitHub áááŻáá˛áá˝áąá¸ááŤáááşá
GitHub ááᯠáá˝áąá¸áááŻááşááŹáá˛áˇ áĄáąáŹááşáááşáážáŹ step 4 áᯠááťááŹááŤááááˇáşáááşá
SonarQube Scanner plugin for Jenkins
Create a Pipeline Job in Jenkins
Create a GitHub Webhook
Create a Jenkinsfile
ááśááŤááş á áĄáááˇáş áááąáŹáˇ áĄááąáŤáşáážáŹ install ááŻááşááźáŽá¸ááŹá¸ááŤá ááśááŤááş á,á áááąáŹáˇááŽáážáŹ áᎠArticle áážáŹ áááˇáşáááźááąáŹáˇááŤáá°á¸ á áŹáĄáááşá¸áážááşáá˝áŹá¸áážáŹá ááŻá¸áááŻáˇááŤá Jenkins pipeline create ááŻááşááŹáá˛áˇ GitHub webhook configuration ááŻááşááŹáá˝áąááᯠáᎠpost áá˝áąáážáŹ áá˝áŹá¸ááźááˇáşáááŻááşááŤáááşá
áĄá˛áˇááŽááąáŹáˇ ááśááŤááş á áĄáááˇáşáááŻáááşá¸áá˝áŹá¸ááźáŽá¸ Jenkinsfile ááᯠupdate ááŻááşááŤáááşá ááśááŤááş á áĄáááˇáşáážáŹ áá°ááąá¸ááŹá¸áá˛áˇáĄáááŻááşá¸áááŻááşááŻááşááźááˇáşááŤáááşá áĄáááşááŻáśá¸ á
ááşá¸áááˇáş application ááᯠááŽáá react ááŻáśá¸ááŹá¸áᏠááźá
áşáááŻáˇ other ááᯠáᲠáá˝áąá¸ááŤáááş ááźáŽá¸áááşááąáŹáˇ áĄáąáŹááşá áĄáááˇáşáážáŹááźáąáŹááŹá¸áá˛áˇáĄáááŻááşá¸ application source code áážááá˛áˇ project folder áá˛áážáŹ sonar-project.properties
áááŻáá˛áˇáááŻááşáá˛áážáŹ project key áááŻáááˇáşááŤáááşá
echo "sonar.projectKey=react-jenkins" > sonar-project.properties
ááźáŽá¸áááşááąáŹáˇ áĄáąáŹááşááŻáśá¸áĄáááˇáşáážáŹ ááźááŹá¸áá˛áˇáĄáááŻááşá¸ Jenkins áááŻááşáá˛áážáŹ update ááŻááşáááŤáááşá áĄá˛áˇáá˛ááĄáááŻááşá¸ áááşá¸ copy áááˇáşáááŻááşáááşááąáŹáˇ error áááşáážáŹááŤá tools locations áááááŹáááŻáˇ Jenkinsfile syntax áážáŹá¸ááŹáááŻáˇááźá áşáááşááŤáááşá áááşá¸áááşá¸ááźááşááźáŽá¸ update ááŻááşáááŻááşááŤáááşá
Jenkins áááŻááşáážáŹááąáŹáˇ ááŹáážáá°á¸áá°á¸ááźáŹá¸ááźáŹá¸áááˇáşáááŹá¸ááŤáá°á¸á ááŤáááąáŹáˇ update áááŻááşáááş Jenkinsfile ááŤ
ááŤáááąáŹáˇ Sonar Scanner áĄáá˝ááş stage áĄáá áşáá áşáᯠupdate ááŻááşááźáŽá¸ááŹá¸áááŻááşááŤ
pipeline {
agent any
stages {
stage('Checkout Source') {
steps {
checkout scm
}
}
stage('SonarQube Analysis') {
steps {
script{
def scannerHome = tool name: 'Sonar', type: 'hudson.plugins.sonar.SonarRunnerInstallation';
withSonarQubeEnv() {
sh "${scannerHome}/bin/sonar-scanner"
}
}
}
}
stage('Build') {
steps {
echo 'Building....'
echo 'Build completed.'
}
}
stage('Deploy') {
steps {
echo 'Deploying....'
echo 'Deploy completed.'
}
}
}
}
ááŻáśáá˛áážáŹ select ááŻááşááŹá¸áá˛áˇ line number 12 áážáŹááŤáá˛áˇ tool name áááŻáˇ type áááŻáˇá áááşá ááá˛áááŻááŹáá áşááťááşááźááŤáááşá Create ááŻááşááŹá¸áá˛áˇ Jenkins pipeline job áá˛áááŻáá˝áŹá¸áááŻááşá፠ááźáŽá¸áááş áááşáááş áĄáąáŹááşááŻáśá¸ááŹá¸ááąá¸áážáŹ Pipeline syntax áááŻáᏠáážáááŤáááşá áĄá˛áˇááŽáá˛áááŻáááşáááŻááşááŤá
ááźáŽá¸áááşááąáŹáˇ áĄáąáŹááşáááŻáś ááŻáśáážáŹ ááźááŹá¸áá˛áˇáĄáááŻááşá¸ Snippet Generator áá˛áážáŹ Tool ááᯠáá˝áąá¸á፠ááźáŽá¸áááş áᏠtools áá˛áááŻáᏠtype áážáŹ áá˝áąá¸ááŤá áĄááąáŤáşáážáŹ Jenkins áá˛áˇ Manage Jenkins > Tools áá˛áážáŹ install ááŻááşáá˛áˇáá˛áˇ Sonar Scanner áá˛áˇ Name ááąá¸ ááąáŤáşááŹááŤááááˇáşáááşá ááźáŽá¸áááş Generate ááŻááşáááŻááşá፠áĄáąáŹááşáážáŹ ááťááŹááŹááąá¸ Copy áá°á¸ááźáŽá¸ááŻáśá¸áááŻááşáááşáááŤááźáŽá
áĄá˛áˇááŽááąáŹáˇ áĄááąáŤáşáážáŹááźááŹá¸áá˛áˇ Jenkinsfile áĄáááŻááşá¸ update ááŻááşááźáŽá¸ááźáŽáááŻááąáŹáˇ GitHub repo ááŽááᯠáĄáá áş push ááŻááşáááŻááşááŤáááşá ááźáŽá¸áááşááąáŹáˇ pipeline áááŻá áąáŹááˇáşááźááˇáşááźááŹááąáŤáˇá
git commit -a -m "SonarQube update" && git push origin master
áĄááŻáááŻáááşááąáŹáˇ SonarQube Scanner á Scan áááşááźáŽá¸ááąáŹáˇ SonarQube Server ááŽááᯠreport áá˝áąáááŻáˇáááŻááşáá˝áŹá¸ááŤááźáŽá Pipeline Overview áážáŹ ááźááˇáşááźááˇáşáááŻááşááŤáááşá
Blue Ocean áážáŹáááşá¸ ááźááˇáşáááŻáˇáááŤáááşá
Blue Ocean áááŻáááááąá¸áááşááąáŹáˇááŽáážáŹáááşááźááˇáşáááŻááşááŤáááşá
ááŤáááąáŹáˇ SonarQube Server ááŽááᯠááąáŹááşáážáááŹáá˛áˇ Report áá˝áąááᯠServer áááą report áĄááąáá˛áˇááŻááşááźááąááŹá፠ááŽáážáŹááŻáśá¸ááŹá¸áá˛áˇ Code áá˝áąá clean ááźá áşááąááŹááááŻáˇ ááŹááž áááźáᲠ0 áá˝áąááźá áşááąááŹááŤá
áĄáᯠbugs ááŤáá˛áˇ Code áá áşáᯠáážáŹáááˇáşááźáŽ pipeline áááŻááźááş run ááźááˇáşáááŻááşááŤáááşá áᎠPython Django application ááąá¸ááᯠscan ááŻááşááźááˇáşáá˛áˇáĄááŤáážáŹ ááťáŹá¸á á˝áŹááąáŹ bugs áá˝áą security vulnerabilities áá˝áąááᯠááážáŹááŤá
áᎠrepo ááᯠapplication project folder áá˛áážáŹáᲠclone ááźáŽá¸ scan áááşááźáŽá¸á ááşá¸ááźááˇáşáááŻááşááŤáááşá https://github.com/kayyum1905/ananymous_voting_platform.git
áĄááá ááŽááąááŹáážáŹááźáąáŹááťááşááŹáááąáŹáˇ Applications Source Code áá˝áąááᯠJenkins pipeline áá˛áááą ááááˇáş SonarQube Scanner áá˛áˇ Scan áááşááźáŽá¸ SonarQube Server ááŽááᯠâááąáŹááşááŹááźáŽá¸ Dashboard áĄááąáá˛áˇ ááźááşááá˛áˇ áĄááźáąáĄááą áááŻááźáąáŹááťááşááŹááŤá Server ááŽáážáŹ report ááźááşáááźáŽáááŻááŹáá˛áˇ áááźáŹá¸ Tab áá˝áą ááŽáá˝áŹá¸ááŹááźá áşááźá áş Bugs áá˝áą áááźáŹá¸ Issues áá˝áąááᯠáážáááşááźááˇáşááźáŽá¸ ááźááˇáşááźááˇáşáááŻááşááŤáááşá
ááŽáĄááźáąáĄááą áážáŹ pipeline ááᯠááááşá¸ááŹá¸áᏠááŹááž áááŤááąá¸ááŤáá°á¸ Sonar Scanner áá˛áˇ Scan áááşáááş SonarQube Server áᎠreport áááŻáˇáááş ááŽááąáŹááşááŤáá˛á Pipeline áááąáŹáˇ SonarQube Server áážáŹ Failed áááŻáˇ ááźáá˛áˇáááˇáşáááŻááşáĄáąáŹááş ááąáŹááş step áá˝áąááŽááᯠContinuous áááşáá˝áŹá¸ááąáŚá¸áážáŹááŤá
ááŤááᯠááááşá¸áááŻáˇ áááŻáááş Jenkins áᲠáážáŹ Quality Gate ááᯠáááˇáşáááŤáááşá Quality Gate áĄááźáąáŹááşá¸áááŻááąáŹáˇ ááąáŹááş post áá áşáᯠáážáŹ ááąá¸ááŹá¸ááŤáááşá
SonarQube Scanner áá˛áˇ SonarQube Server áĄáá˝ááşáááąáŹáˇ ááŽááąáŹááşááᯠáĄáááşááźáąááźáááşáááŻáˇ ááťážáąáŹáşáááˇáşááŤáááşá áĄáŹá¸ááŻáśá¸áááŻááťáąá¸áá°á¸áááşááŤáááşá
Quality Gate áĄááźáąáŹááşá¸áááŻááąáŹáˇ ááŽáážáŹ áááşáááşááźááˇáşáááŻááşááŤáááşá
Subscribe to my newsletter
Read articles from Kadaie Kyiphyu directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by