Jenkinsfile 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. pipeline {
  2. agent any
  3. triggers {
  4. pollSCM('* * * * *')
  5. cron('@daily')
  6. }
  7. stages {
  8. stage('Clean') {
  9. steps {
  10. // This is a terrible hack to set the file ownership to jenkins:jenkins so we can cleanup the directory
  11. sh 'docker run -v $(pwd):/app --rm busybox /bin/chown -R 111:119 /app'
  12. sh 'rm -fr node_modules'
  13. }
  14. }
  15. stage('Install') {
  16. agent {
  17. docker {
  18. image 'node:6.11.2'
  19. args "-v /var/lib/jenkins/.npm:/tmp/.npm -e HOME=/tmp"
  20. reuseNode true
  21. }
  22. }
  23. steps {
  24. sh 'git config --global core.logallrefupdates false'
  25. sh 'rm -fr node_modules'
  26. checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: '_docker-runner'], [$class: 'CloneOption', shallow: true]], userRemoteConfigs: [[credentialsId: 'GIT_DEPLOY_KEY', url: 'git@github.com:sharelatex/docker-runner-sharelatex']]])
  27. sh 'npm install ./_docker-runner'
  28. sh 'rm -fr ./_docker-runner ./_docker-runner@tmp'
  29. sh 'npm install'
  30. sh 'npm rebuild'
  31. sh 'npm install --quiet grunt-cli'
  32. }
  33. }
  34. stage('Compile and Test') {
  35. agent {
  36. docker {
  37. image 'node:6.11.2'
  38. reuseNode true
  39. }
  40. }
  41. steps {
  42. sh 'node_modules/.bin/grunt compile:app'
  43. sh 'node_modules/.bin/grunt compile:acceptance_tests'
  44. sh 'NODE_ENV=development node_modules/.bin/grunt test:unit'
  45. }
  46. }
  47. stage('Acceptance Tests') {
  48. environment {
  49. TEXLIVE_IMAGE="quay.io/sharelatex/texlive-full:2017.1"
  50. }
  51. steps {
  52. sh 'mkdir -p compiles cache'
  53. // Not yet running, due to volumes/sibling containers
  54. sh 'docker container prune -f'
  55. sh 'docker pull $TEXLIVE_IMAGE'
  56. sh 'docker pull sharelatex/acceptance-test-runner:clsi-6.11.2'
  57. sh 'docker run --rm -e SIBLING_CONTAINER_USER=root -e SANDBOXED_COMPILES_HOST_DIR=$(pwd)/compiles -e SANDBOXED_COMPILES_SIBLING_CONTAINERS=true -e TEXLIVE_IMAGE=$TEXLIVE_IMAGE -v /var/run/docker.sock:/var/run/docker.sock -v $(pwd):/app sharelatex/acceptance-test-runner:clsi-6.11.2'
  58. // This is a terrible hack to set the file ownership to jenkins:jenkins so we can cleanup the directory
  59. sh 'docker run -v $(pwd):/app --rm busybox /bin/chown -R 111:119 /app'
  60. sh 'rm -r compiles cache server.log db.sqlite config/settings.defaults.coffee'
  61. }
  62. }
  63. stage('Package') {
  64. steps {
  65. sh 'echo ${BUILD_NUMBER} > build_number.txt'
  66. sh 'touch build.tar.gz' // Avoid tar warning about files changing during read
  67. sh 'tar -czf build.tar.gz --exclude=build.tar.gz --exclude-vcs .'
  68. }
  69. }
  70. stage('Publish') {
  71. steps {
  72. withAWS(credentials:'S3_CI_BUILDS_AWS_KEYS', region:"${S3_REGION_BUILD_ARTEFACTS}") {
  73. s3Upload(file:'build.tar.gz', bucket:"${S3_BUCKET_BUILD_ARTEFACTS}", path:"${JOB_NAME}/${BUILD_NUMBER}.tar.gz")
  74. // The deployment process uses this file to figure out the latest build
  75. s3Upload(file:'build_number.txt', bucket:"${S3_BUCKET_BUILD_ARTEFACTS}", path:"${JOB_NAME}/latest")
  76. }
  77. }
  78. }
  79. }
  80. post {
  81. failure {
  82. mail(from: "${EMAIL_ALERT_FROM}",
  83. to: "${EMAIL_ALERT_TO}",
  84. subject: "Jenkins build failed: ${JOB_NAME}:${BUILD_NUMBER}",
  85. body: "Build: ${BUILD_URL}")
  86. }
  87. }
  88. // The options directive is for configuration that applies to the whole job.
  89. options {
  90. // we'd like to make sure remove old builds, so we don't fill up our storage!
  91. buildDiscarder(logRotator(numToKeepStr:'50'))
  92. // And we'd really like to be sure that this build doesn't hang forever, so let's time it out after:
  93. timeout(time: 30, unit: 'MINUTES')
  94. }
  95. }