Дженкинс декларативный конвейер с докером и мерзавцем - PullRequest
0 голосов
/ 13 октября 2019

Я пытаюсь построить конвейер для приложения Node JS, используя git и докеры. Я сделал декларативный Jenkinsfile, из которого все работает гладко. Я установил опрос SCM на каждые две минуты, и он вызывается правильно, но проблема заключается в том, что старый конвейер все еще работает, поэтому новый опрос ставится в очередь с сообщением Ожидание следующего доступного исполнителя . Я хотел знать, все ли я сделал правильно и чего мне не хватает.

Мой полный код можно найти здесь .

Я попытался сделать npm start в delivery.sh файле с & , чтобы он работал в режиме демона, и использовал вводопция сообщения в Jenkinsfile, чтобы остановить завершение конвейера, в противном случае только с «npm start &» и без «входного сообщения» конвейер достигает конца конвейера и созданный контейнер приложения уничтожается. Я уверен, что этот подход не является правильным. Затем я выполнил npm start без & и wihtout входное сообщение и опрос scm при вызове, и конвейер также начал выполнять этапы, но поскольку последний контейнер уже опубликован дляпорт 3000, очевидно, он не будет публиковать новый для 3000, поэтому конвейер возвращает ошибку.

Dockerfile

FROM node:alpine

COPY . .

EXPOSE 3000

Jenkinsfile

pipeline {
    triggers {
        pollSCM 'H/2 * * * *'
    }
    agent { dockerfile {
        args '-p 3000:3000'
    }
    }
    stages {
        stage('Build') {
            steps {
                sh 'npm install'
            }
        }
        stage('Deliver') {
            steps {
                sh './jenkins/scripts/deliver.sh'
                // input message: 'Finished using the web site? (Click "Proceed" to continue)'
                // sh './jenkins/scripts/kill.sh'
            }
        }
    }

}

скрипт delivery.sh

# set -x
# npm start &
npm start
# sleep 1
# copying process ID of npm start to file name pidfile, this id will
# be used when the user press any key to stop the app
# echo $! > .pidfile
# set +x

Любая помощь в этом отношении будет принята с благодарностью.

1 Ответ

0 голосов
/ 14 октября 2019

Добавьте

disableConcurrentBuilds()

в разделе параметров, чтобы предотвратить одновременную работу 2 сборок.

pipeline {
    triggers {
        pollSCM 'H/2 * * * *'
    }
    agent { dockerfile {
        args '-p 3000:3000'
    }
    options {
        disableConcurrentBuilds()
    }
    stages {
        stage('Build') {
            steps {
                sh 'npm install'
            }
        }
        stage('Deliver') {
            steps {
                sh './jenkins/scripts/deliver.sh'
                // input message: 'Finished using the web site? (Click "Proceed" to continue)'
                // sh './jenkins/scripts/kill.sh'
            }
        }
    }

}
...