У меня есть 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 трубопровод.
Есть ли у меня какие-либо выводы? Или другая идея, чтобы сделать это?