170 lines
5.2 KiB
Groovy
170 lines
5.2 KiB
Groovy
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 {
|
|
sshagent(['artifactor-key']) {
|
|
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
|
|
ssh artifactor@artifacts mkdir -p projects/url-shortener/$BRANCH/$VERSION/$UUID
|
|
rsync SHA256.sig artifactor@artifacts:projects/url-shortener/$BRANCH/$VERSION/$UUID/
|
|
rsync $ZIP_FILE artifactor@artifacts: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']]
|
|
}
|
|
}
|
|
}
|