def buildArtifact = true pipeline { agent { label 'ruby && freebsd' } environment { DB_NAME = 'url_shortener.db' } stages { stage('Init') { steps { sh ''' #!/usr/local/bin/bash rbenv local 3.2.2 echo "# frozen_string_literal: true\n" > .env.rb echo "ENV['APP_SESSION_SECRET'] ||= '$(ruby -rsecurerandom -e 'puts SecureRandom.base64(64)')'" >> .env.rb echo "ENV['DB_NAME'] ||= '${DB_NAME}'" >> .env.rb cat .env.rb ''' } } stage('Build dependencies') { steps { sh 'bundle install' sh 'sequel -m db/migrations sqlite://db/${DB_NAME}' } } stage('Audit Dependencies') { steps { catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') { script { try { sh 'bundle exec ruby-audit check' sh 'bundle exec bundle-audit check >> audit.html' } catch (e) { script { buildArtifact = false } } } } } } stage('Code Linting') { steps { catchError(buildResult: 'UNSTABLE', stageResult: 'FAILURE') { script { try { sh 'bundle exec rubocop --format html --out rubocop.html' } catch (e) { script { buildArtifact = false } } } } } } stage('Run tests') { steps { catchError(buildResult: 'UNSTABLE', stageResult: 'FAILURE') { script { try { sh 'bundle exec cucumber features --format html --out cucumber.html' } catch (e) { script { buildArtifact = false } } } } catchError(buildResult: 'UNSTABLE', stageResult: 'FAILURE') { script { try { sh 'bundle exec rspec spec --format html --out spec.html' } catch (e) { script { buildArtifact = false } } } } } } stage('Report results') { steps { publishHTML (target: [ allowMissing: false, alwaysLinkToLastBuild: false, keepAll: true, reportDir: '.', reportFiles: 'rubocop.html, audit.html, cucumber.html, spec.html, coverage/index.html', reportName: 'Test Results', reportTitles: 'Rubocop Results, Bundler Audit Results, Cucumber Results, RSpec Results, Test Coverage']) } } stage('Build production deliverable') { when { expression { buildArtifact } } steps { catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') { sh ''' #!/usr/local/bin/bash ZIP_FILE="url-shortener_${BRANCH_NAME}_$(cat VERSION | cut -d"'" -f2).tgz" CUR_DIR=$(pwd) bundle config set --local without 'test' bundle config set --local path "vendor" bundle install mkdir -p /tmp/url-shortener cp -R * /tmp/url-shortener cp .env.rb /tmp/url-shortener/ cp .ruby-version /tmp/url-shortener/ cd /tmp/url-shortener rm -rf features spec coverage db/*.db .git* Jenkinsfile *.html .rubocop.yml cd /tmp tar -czvf $ZIP_FILE url-shortener/ mv /tmp/$ZIP_FILE $CUR_DIR/ ''' } archiveArtifacts artifacts: '*.tgz' } } stage('Generate SHA256 Hash and Upload to Artifact Repository') { environment { ARTIFACTS_KEY = credentials('artifactor-key') } steps { sh ''' #!/usr/local/bin/bash UUID=$(uuidgen -r) VERSION=$(cat VERSION | cut -d"'" -f2) BRANCH=${BRANCH_NAME} ZIP_FILE="url-shortener_${BRANCH_NAME}_$(cat VERSION | cut -d"'" -f2).tgz" sha256 $ZIP_FILE >> SHA256.sig echo ${ARTIFACTS_KEY} #rsync -e ${ARTIFACTS_KEY} SHA256.sig artifactor@10.0.0.9:projects/url-shortener/$BRANCH/$VERSION/$UUID/ #rsync -e ${ARTIFACTS_KEY} $ZIP_FILE artifactor@10.0.0.9:projects/url-shortener/$BRANCH/$VERSION/$UUID/ ''' } } stage('Clean up deliverable') { when { expression { buildArtifact } } steps { sh 'rm -rf /tmp/url-shortener' sh 'rm SHA256.sig' } } } post { success { mattermostSend channel: 'git-messages', color: 'good', message: "[${JOB_NAME}](${JOB_URL}) [#${BUILD_NUMBER}](${BUILD_URL}) ([Gitea](${GIT_URL}))", text: 'Build Finished Successfully' } unstable { mattermostSend channel: 'git-messages', color: 'warning', message: "[${JOB_NAME}](${JOB_URL}) [#${BUILD_NUMBER}](${BUILD_URL}) ([Gitea](${GIT_URL}))", text: "Build Unstable" } failure { mattermostSend channel: 'git-messages', color: 'danger', message: "[${JOB_NAME}](${JOB_URL}) [#${BUILD_NUMBER}](${BUILD_URL}) ([Gitea](${GIT_URL}))", text: "Build Failed" } always { cleanWs deleteDirs: true, patterns: [[pattern: '*', type: 'INCLUDE']] } } }