Files
edx-platform/scripts/Jenkinsfiles/quality
Feanil Patel 5d7bdf91b1 Revert requirements changes due to memory issues.
Some change in the requirements here may be responsible for increased
CPU and memory usage.  This is causing production LMS for edx.org to run
into lots of performance issues.  Reverting for now until we can narrow
it down to which change caused the issue.
2019-10-09 16:47:26 -04:00

259 lines
12 KiB
Plaintext

def runQualityTests() {
sshagent(credentials: ['jenkins-worker'], ignoreMissing: true) {
// Determine git refspec, branch, and clone type
git_shallow_clone = true
git_extensions = []
if (env.ghprbActualCommit) {
git_branch = "${ghprbActualCommit}"
refspec = "+refs/pull/${ghprbPullId}/*:refs/remotes/origin/pr/${ghprbPullId}/*"
if (SHARD == "4") {
git_shallow_clone = false
git_extensions.add([$class: 'WipeWorkspace'])
refspec = refspec + " +refs/heads/${TARGET_BRANCH}:refs/remotes/origin/${TARGET_BRANCH}"
}
} else {
git_branch = "${BRANCH_NAME}"
refspec = "+refs/heads/${BRANCH_NAME}:refs/remotes/origin/${BRANCH_NAME}"
}
git_extensions.add([$class: 'CloneOption', honorRefspec: true, noTags: true, shallow: git_shallow_clone ])
checkout changelog: false, poll: false, scm: [$class: 'GitSCM', branches: [[name: git_branch]],
doGenerateSubmoduleConfigurations: false, extensions: git_extensions, submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'jenkins-worker',
refspec: refspec, url: "git@github.com:edx/${REPO_NAME}.git"]]]
sh "bash scripts/all-tests.sh"
stash includes: '**/reports/**/*', name: "${TEST_SUITE}-${SHARD}-reports"
}
}
def getTargetBranch(job_name) {
if (env.ghprbTargetBranch) {
return env.ghprbTargetBranch
} else {
return "${BRANCH_NAME}"
}
}
def qualityTestCleanup() {
archiveArtifacts allowEmptyArchive: true, artifacts: '**/reports/**/*,test_root/log/**/*.log,*.log'
sendSplunkFile excludes: '', includes: '**/timing*.log', sizeLimit: '10MB'
junit 'reports/quality_junitxml/*.xml'
}
pipeline {
agent { label "jenkins-worker" }
options {
sendSplunkConsoleLog()
timestamps()
timeout(120)
}
stages {
stage('Mark build as pending on Github') {
when {
// Only run github-build-status for master builds
expression { env.ghprbActualCommit == null }
}
steps {
script {
commit_sha = sh(returnStdout: true, script: 'git rev-parse HEAD').trim()
build job: 'github-build-status',
parameters: [
string(name: 'GIT_SHA', value: commit_sha),
string(name: 'GITHUB_ORG', value: 'edx'),
string(name: 'GITHUB_REPO', value: "${REPO_NAME}"),
string(name: 'TARGET_URL', value: "${BUILD_URL}"),
string(name: 'DESCRIPTION', value: 'Pending'),
string(name: 'CONTEXT', value: "${GITHUB_CONTEXT}"),
string(name: 'CREATE_DEPLOYMENT', value: 'false'),
string(name: 'BUILD_STATUS', value: 'pending')
],
propagate: false, wait: false
}
}
}
stage('Run Tests') {
parallel {
stage("commonlib pylint") {
agent { label "jenkins-worker" }
environment {
TEST_SUITE = "quality"
SHARD = 1
}
steps {
script {
runQualityTests()
}
}
post {
always {
script {
qualityTestCleanup()
}
}
}
}
stage("lms pylint") {
agent { label "jenkins-worker" }
environment {
TEST_SUITE = "quality"
SHARD = 2
}
steps {
script {
runQualityTests()
}
}
post {
always {
script {
qualityTestCleanup()
}
}
}
}
stage("cms/openedx/pavelib pylint") {
agent { label "jenkins-worker" }
environment {
TEST_SUITE = "quality"
SHARD = 3
}
steps {
script {
runQualityTests()
}
}
post {
always {
script {
qualityTestCleanup()
}
}
}
}
stage("Other quality checks") {
agent { label "jenkins-worker" }
environment {
TEST_SUITE = "quality"
SHARD = 4
TARGET_BRANCH = getTargetBranch("${JOB_NAME}")
}
steps {
script {
runQualityTests()
}
}
post {
always {
script {
qualityTestCleanup()
}
}
}
}
}
}
stage('Diff quality') {
when {
// Only run diff quality on PR builds
expression { env.ghprbTargetBranch != null }
}
environment {
TARGET_BRANCH = "origin/${ghprbTargetBranch}"
}
steps {
sshagent(credentials: ['jenkins-worker'], ignoreMissing: true) {
checkout changelog: false, poll: false, scm: [$class: 'GitSCM', branches: [[name: "${ghprbActualCommit}"]],
doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'CloneOption',
honorRefspec: true, noTags: true, shallow: false], [$class: 'WipeWorkspace']], submoduleCfg: [],
userRemoteConfigs: [[credentialsId: 'jenkins-worker',
refspec: "+refs/heads/${ghprbTargetBranch}:refs/remotes/origin/${ghprbTargetBranch} +refs/pull/${ghprbPullId}/*:refs/remotes/origin/pr/${ghprbPullId}/*",
url: "git@github.com:edx/${REPO_NAME}.git"]]]
unstash 'quality-1-reports'
unstash 'quality-2-reports'
unstash 'quality-3-reports'
unstash 'quality-4-reports'
sh "./scripts/jenkins-quality-diff.sh"
}
}
post {
always {
qualityTestCleanup()
publishHTML([allowMissing: true, alwaysLinkToLastBuild: false, keepAll: true, reportDir: 'reports/diff_quality',
reportFiles: 'diff_quality_pylint.html, diff_quality_eslint.html', reportName: 'Diff Quality Report', reportTitles: ''])
}
}
}
}
post {
always {
script{
try {
unstash 'quality-1-reports'
unstash 'quality-2-reports'
unstash 'quality-3-reports'
unstash 'quality-4-reports'
// Check for warnings
recordIssues enabledForFailure: true, tools: [pep8(pattern: 'reports/pep8/pep8.report'), pyLint(pattern: 'reports/**/pylint.report')]
// Publish Quality report
publishHTML([allowMissing: true, alwaysLinkToLastBuild: false, keepAll: true,
reportDir: 'reports/metrics/',
reportFiles: 'pylint/*view*/,pep8/*view*/,python_complexity/*view*/,xsscommitlint/*view*/,xsslint/*view*/,eslint/*view*/,pii/*view*/',
reportName: 'Quality Report', reportTitles: ''])
} finally {
if (env.ghprbPullId != null) {
// For PR jobs, run the edx-platform-test-notifier for PR reporting
build job: 'edx-platform-test-notifier', parameters: [string(name: 'REPO', value: "${REPO_NAME}"), string(name: 'PR_NUMBER', value: "${ghprbPullId}")], wait: false
} else {
// For master jobs run github-build-status and report to slack when necessary
if (currentBuild.currentResult == "SUCCESS") {
create_deployment = "true"
build_status = "success"
build_description = "Build Passed"
}
else {
create_deployment = "false"
build_status = "failure"
build_description = "Build Failed"
}
commit_sha = sh(returnStdout: true, script: 'git rev-parse HEAD').trim()
build job: 'github-build-status', parameters: [
string(name: 'GIT_SHA', value: commit_sha),
string(name: 'GITHUB_ORG', value: 'edx'),
string(name: 'GITHUB_REPO', value: "${REPO_NAME}"),
string(name: 'TARGET_URL', value: "${BUILD_URL}"),
string(name: 'DESCRIPTION', value: build_description),
string(name: 'CONTEXT', value: "${GITHUB_CONTEXT}"),
string(name: 'CREATE_DEPLOYMENT', value: create_deployment),
string(name: 'BUILD_STATUS', value: build_status)
],
propagate: false, wait: false
if (currentBuild.currentResult != "SUCCESS"){
slackSend botUser: true,
message: "`${JOB_NAME}` #${BUILD_NUMBER}: ${currentBuild.currentResult} after ${currentBuild.durationString.replace(' and counting', '')}\n${BUILD_URL}"
email_body = "See: <${BUILD_URL}>\n\nChanges:\n"
change_sets = currentBuild.changeSets
for (int j = 0; j < change_sets.size(); j++) {
change_set_items = change_sets[j].items
for (int k = 0; k < change_set_items.length; k++) {
item = change_set_items[k]
email_body = email_body + "\n Commit: ${item.commitId} by ${item.author}: ${item.msg}"
}
}
emailext body: email_body,
subject: "Build failed in Jenkins: ${JOB_NAME} #${BUILD_NUMBER}", to: 'testeng@edx.org'
} else if (currentBuild.currentResult == "SUCCESS" && currentBuild.previousBuild.currentResult != "SUCCESS") {
slackSend botUser: true,
message: "`${JOB_NAME}` #${BUILD_NUMBER}: Back to normal after ${currentBuild.durationString.replace(' and counting', '')}\n${BUILD_URL}"
emailext body: "See <${BUILD_URL}>",
subject: "Jenkins Build is back to normal: ${JOB_NAME} #${BUILD_NUMBER}", to: 'testeng@edx.org'
}
}
}
}
}
}
}