Я пытаюсь автоматизировать развертывание с помощью официального образа докера ArgoCD (https: // hub. docker.com/r/argoproj/argocd/dockerfile)

Я создал декларативный конвейер Дженкинса, используя плагин kubernetes для агентов, и определил модуль с помощью yaml, определение контейнера выглядит так:

pipeline {
    agent {
        kubernetes {
            yaml """
kind: Pod
metadata:
  name: agent
spec:
  containers:
  - name: maven
    image: maven:slim
    command:
    - cat
    tty: true
    volumeMounts:
      - name: jenkins-maven-cache
        mountPath: /root/.m2/repository
  - name: argocd
    image: argoproj/argocd:latest
    command:
    - cat
    tty: true
    ...

Я пытаюсь запускать команды внутри этого контейнера, этот шаг в конвейере выглядит так:

stage('Build') {
    steps {
        container('maven') {
            sh 'echo testing' // this works just fine
        }
    }
}
stage('Deploy') {
    steps {
        container('argocd') {
            sh "echo testing" // this does not work
            // more deploy scripts here, once sh works
        }
    }
}

Итак, у меня есть два контейнера, в одном из которых сценарий sh работает нормально, а в другом - нет. Скрипты sh ​​в контейнере "argocd" просто зависают на 5 минут, а затем Дженкинс убивает его, сообщение о выходе: <код> процесс, по-видимому, никогда не запускался в / home / jenkins / agent / workspace / job-name @ tmp / Durable-46cefcae (временный запуск Jenkins с -Dorg.jenkinsci.plugins.durabletask.BourneShellScript.LAUNCH_DIAGNOSTICS = true может прояснить проблему)

Я не могу отобразить простую строку в этом конкретном контейнере.

Он отлично работает в других контейнерах, таких как официальный для Maven от Docker, который я использую для создания приложения весенней загрузки. Я также могу запускать команды непосредственно в контейнере argocd вручную из командной строки с помощью docker exec, но по какой-то причине jenkins просто не будет в конвейере. Что бы это могло быть?

Я использую последнюю версию (1.33) плагина надежных задач.

Обновление: Оказывается, образ для argo-cd (инструмент непрерывного развертывания) argoproj / argocd: latest не включает другие команды, кроме argocd, поэтому проблема была в образе контейнера, который я пытался использовать а не сам Дженкинс. Мое решение состояло в том, чтобы установить Argo-CD CLI в настраиваемый контейнер докеров и использовать его вместо официального.

8
Würden 26 Ноя 2019 в 00:26
Вы пытались установить эту опцию LAUNCH_DIAGNOSTICS=true?
 – 
mario
26 Ноя 2019 в 14:57
Да, я пробовал это, запустив System.setProperty("org.jenkinsci.plugins.durabletask.BourneShellScript.LAUNCH_DIAGNOSTICSL", "true"); в консоли сценариев Jenkins, но, похоже, ничего нового не обнаружил.
 – 
Würden
29 Ноя 2019 в 11:10
Я думаю, это потому, что tty: true в вашем yaml
 – 
LinPy
29 Ноя 2019 в 11:35
Без tty: true кубернетов немедленно убьет контейнер, потому что он ничего не выполняет активно. Я "злоупотребляю" командой cat, чтобы оставить ее открытой.
 – 
Würden
2 Дек 2019 в 19:46
Вы можете сделать это другим способом, просто чтобы проверить, работает ли он без tty: true. Удалите параметр tty: true и установите для command значение sleep "3600", и контейнер будет активен в течение часа.
 – 
mario
2 Дек 2019 в 20:47

2 ответа

Я только что столкнулся с аналогичной проблемой с созданным мной настраиваемым образом докера. Оказывается, я использовал USER nobody в Dockerfile этого образа, и каким-то образом модуль агента jenkins не смог запустить команду cat или любую другую команду оболочки из моего сценария конвейера. У меня работал запуск конкретного контейнера с пользователем root.

Поэтому в вашем случае я бы добавил securityContext: runAsUser: 0, как показано ниже.

...
  - name: argocd
    image: argoproj/argocd:latest
    command:
    - cat
    tty: true
    securityContext:
      runAsUser: 0
...

Ссылка на Kubernetes: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container

2
gkc 3 Апр 2020 в 16:15

Если проблема связана с Дженкинсом, вот некоторые вещи, которые могут помочь решить проблему:

  1. Проблемы с рабочим каталогом, если вы обновили Jenkins из более старой версии, рабочий каталог был /home/jenkins, а в последних версиях должно быть /home/jenkins/agent или если вы используете его в Windows, путь должен начинаться с C:\dir, а не с /dir
  2. Вы можете попробовать новую чистую установку с помощью apt-get --purge remove jenkins, а затем apt-get install jenkins
  3. Это не ваш случай, поскольку вы запускаете последнюю версию плагина надежных задач. Но для других ссылочные версии до 1.28-1.30 вызывали ту же проблему >.

Если ваш Jenkins чистый, проблему следует исследовать другим способом, похоже, что он не возвращает код выхода для команды sh и / или скрипт выполняется в другой оболочке. Я бы попытался сделать файл sh, который будет помещен в рабочий каталог контейнера

#!/bin/bash
echo "testing"
echo $?

И попробуйте запустить его с помощью source my_script.sh или с bash my_script.sh

$? - это код выхода последней операции bash, напечатав его, вы убедитесь, что ваш скрипт завершен правильно. Команда source для запуска сценария заставит его работать в той же оболочке, которая его вызывает, так что переменные оболочки доступны. Вместо этого команда Bash запустит его в другой подоболочке.

0
David 5 Дек 2019 в 01:56