Запустите команду в существующем Docker, используя Jenkins-Pipelines - PullRequest
0 голосов
/ 06 декабря 2018

Я новичок в Jenkins-Groovy и пытаюсь запустить команду в существующем Docker-контейнере и перед установкой некоторых переменных среды с помощью Jenkins-Pipeline.

bash-скрипт, используемый прямо сейчас(поэтому просто выполняя его из командной строки) выглядит так и работает:

export LIB_ROOT=/usr/local/LIBS
export TMP_MAC_ADDRESS=b5:17:a3:28:55:ea

sudo docker run --rm -i -v "$LIB_ROOT":/usr/local/LIBS/from-host -v /home/sbuild/Dockerfiles/Sfiles/mnt:/home/sbuild/mount --mac-address="$TMP_MAC_ADDRESS" -t sbuild:current

После этого я хочу собрать некоторые из моих источников (смонтированных) внутри Docker-контейнера, используя что-то вроде:

python3 batchCompile.sh ../mount/src.zip 

Прямо сейчас я пытаюсь написать это в моем Jenkins:

            node ('linux-slave') {
                withEnv(['PATH=/usr/local/LIBS:/usr/local/MATLAB/from-host  -v /home/sbuild/Dockerfiles/Sfiles/mnt:/home/sbuild/mount --mac-address=b5:17:a3:28:55:ea']) {
                    docker.image('sbuild').inside {
                    sh 'echo $PATH'
                    sh 'mvn --version'
                    }
                }
                sh 'echo $PATH'
            }

Но это просто не получается с непрозрачным сообщением:

Running in Durability level: MAX_SURVIVABILITY
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 71: Expected a symbol @ line 71, column 25.
                           docker.image('sbuild:current').inside {
                           ^

1 error

    at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)

I 'Я не могу понять, что работает неправильно.Так что я просто пытался проникнуть внутрь Докера и посмотреть, что я могу сделать оттуда.С этим небольшим сценарием я немного поэкспериментировал:

script{
    docker.image('sbuild:current').inside{
    sh 'touch asdf'
    sh 'cd /home/sbuild/'
    sh 'pwd'
}

И все же по умолчанию я просто работаю из папки Jeninks, и ни одна из этих команд фактически не вызывается внутри Docker.Кроме того, контейнер, кажется, не запускается в любое время.

Как мне написать свой код, чтобы запустить настроенный Docker и использовать команды внутри?

Есть некоторая документация длясоздание новых контейнеров Docker, но мне сложно понять, как понять это сообщение об ошибке и как правильно отладить.

Редактировать 1: Файл Docker:

FROM labs:R2018

# Avoid interaction
ENV DEBIAN_FRONTEND noninteractive

# Set user to root
USER root

# =========== Basic Configuration ======================================================
# Update the system
#RUN apt-get -y update \
#    && apt-get install -y sudo build-essential git python python-dev \
#    python-setuptools make g++ cmake gfortran ipython swig ant python-numpy \
#    python-scipy python-matplotlib cython python-lxml python-nose python-jpype \
#    libboost-dev jcc git subversion wget zlib1g-dev pkg-config clang

# Install system libs
# RUN apt-get install sudo

# ========== Install pip for managing python packages ==================================
RUN apt-get install -y python-pip python-lxml && pip install cython
# Install simulix dependencies

RUN apt-get install -y git

RUN apt-get install --assume-yes python
RUN apt-get install --assume-yes cmake
RUN apt-get install --assume-yes mingw-w64
# Add User
#RUN adduser --disabled-password --gecos '' docker
#RUN adduser docker sudo
#RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

USER build

# Install simulix
WORKDIR /home/sbuild
RUN git clone https://github.com/***.git
RUN mkdir mount

WORKDIR /home/sbuild/Sfiles
RUN pip install -r requirements.txt

1 Ответ

0 голосов
/ 06 декабря 2018

Когда я использую Docker с Jenkins Pipeline, я делаю это только с шагом sh:

try {
    stage('Start Docker') {
        sh 'docker-compose up'
    }

    stage('Build project') {
        sh 'docker-compose exec my_service make:build
    }
} catch (Error e)
    // Maybe do something
} finally {
    sh 'docker-compose stop'
}

Вы хотите окружить свои сцены блоком try / catch / finally, чтобы всегда останавливать контейнеры докерав случае неудачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...