Как заставить модуль Jenkins, используемый в OpenShift, игнорировать хеш коммита, переданный Gitlab? - PullRequest
0 голосов
/ 29 марта 2019

У меня есть BuildConfiguration, которая объявляет конвейер в OpenShift (OCP v3.9).

apiVersion: "v1"
kind: "BuildConfig"
metadata:
  name: "openshift-service-pipeline"
spec:
  source:
    git:
      ref: "master"
      uri: "ssh://git@company.edu.au/applications/commons/single.jenkins.git"
    sourceSecret:
      name: "ssh-secret"
  strategy:
    jenkinsPipelineStrategy:
      env:
      - name: projLocation
        value: git@company.edu/applications/services1/serviceA.git
      - name: branch
        value: master
      - name: credentialsId
        value: myproject-ssh-secret
      jenkinsfilePath: Jenkinsfile-dev
    type: JenkinsPipeline
  triggers:
    - gitlab:
        secret: gitlab-secret
      type: GitLab

Приведенный выше конвейер запускается нажатием git в репозиторий gitlab (git@company.edu/applications/services1/serviceA.git). Webhook был правильно настроен в GitLab, потому что конвейер jenkins запускается всякий раз, когда в репозитории сервисов делается push git.

Идея этой конфигурации заключается в том, что у меня есть один репозиторий jenkins, в котором находится Jenkinsfile-dev. Я не хочу иметь одинаковый Jenkinsfile для всех моих сервисов (у нас около 80, что означает 1 Jenkinsfile, найденный в каждом из базового каталога приложений), поэтому я пытался найти способ использовать один Jenkinsfile создать и развернуть все мои приложения в OpenShift.

Я сконфигурировал параметры среды в своем BuildConfiguration, чтобы его можно было передавать внутрь в файл Jenkinsfile, который находится в репозитории / apps / commons. Параметры среды в основном объявляют репозиторий git и значения ветвей для репозитория приложений, которые Jenkinsfile будет проверять, собирать, а также развертывать. Это ключевой компонент для выполнения конвейера с одним Jenkinsfile, по существу для каждого приложения я создам BuildConfiguration, который содержит значения репозитория git, которые будут переданы в Jenkinsfile, чтобы приложение было создано и развернуто.

Проблема теперь в том, что когда я нажимаю git и вставляю код в GitLab, конфигурация webhook запускает конвейер в OpenShift, который, в свою очередь, запускает конвейер в Jenkins (через модуль jenkins-ephemeral), но затем хеш коммита (поступающий из webhook, настроенный для application / services1 / serviceA.git), затем передается Jenkins.

Вот в чем проблема, Дженкинс дает мне эту ошибку

OpenShift Build myproject/openshift-service-pipeline-10 from ssh://git@company.edu.au/applications/commons/single.jenkins.git, commit xf123ac04f88188d1bb57c012437044d2dfab0xy

 git rev-parse xf123ac04f88188d1bb57c012437044d2dfab0xy^{commit} # timeout=10
hudson.plugins.git.GitException: Command "git rev-parse xf123ac04f88188d1bb57c012437044d2dfab0xy^{commit}" returned status code 128:
stdout: xf123ac04f88188d1bb57c012437044d2dfab0xy^{commit}

stderr: fatal: ambiguous argument 'xf123ac04f88188d1bb57c012437044d2dfab0xy^{commit}': unknown revision or path not in the working tree.

Я полагаю, что происходит то, что Дженкинс проверяет мой файл Jenkinsfile, который находится в /applications/commons/single.jenkins.git, и затем, поскольку webhook передает хеш коммита, Дженкинс пытается получить этот хэш коммита из этого хранилища. , Конечно, этот хэш коммита не будет в репозитории Jenkins, поскольку этот хэш коммитов поступал из репозитория apps / services1 / serviceA.git, где был настроен webhook.

Теперь я немного застрял и не знаю, как поступить. Я думал, можно ли отключить полезную нагрузку GitLab для webhook, чтобы Jenkins не получал ее при запуске? Но это кажется глупой идеей.

Прямо сейчас, поскольку вызов webhook вызовет ошибку Jenkins, я отключаю ее на данный момент и просто вручную нажимаю кнопку Start Pipeline в OpenShift, но это не пойдет, поскольку мы намереваемся получить полностью автоматизированный CI / CD трубопровод.

Есть ли у меня какие-либо выводы? Или другая идея, чтобы сделать это?

...