diff --git a/jobs/tools/setup-gitlab-webhooks.groovy.j2 b/jobs/tools/setup-gitlab-webhooks.groovy.j2 new file mode 100644 index 0000000..03db927 --- /dev/null +++ b/jobs/tools/setup-gitlab-webhooks.groovy.j2 @@ -0,0 +1,84 @@ +pipeline { + agent any + + environment { + GITLAB_TOKEN = credentials("jenkins-gitlab-token") + } + + stages { + + stage('Checkout Repository') { + steps { + checkout([ + $class: 'GitSCM', + branches: [[name: 'gitlab-integration']], + userRemoteConfigs: [[ + url: "http://forge.softwareheritage.org/source/swh-jenkins-jobs.git", + ]], + ]) + } + } + + stage('Setup gitlab integration') { + steps { + script { + setupGitlabWebhook("swh/infra/ci-cd/swh-jenkins-jobs", + "jenkins-tools/swh-jenkins-jobs-builder", + true, true, false) + + projects = readYaml(file: 'jobs/swh-packages.yaml') + for (project in projects) { + if (project.containsKey("project")) { + def jenkinsFolder = project.get('project').get('name') + def repoName= project.get('project').get('repo_name') + def gitlabProjectName = "swh/devel/${repoName}" + setupGitlabWebhook(gitlabProjectName, "${jenkinsFolder}/gitlab-tests") + } + } + } + } + } + } +} + +void setupGitlabWebhook(gitlabProjectName, jenkinsProjectName, pushEvents = true, + mergeRequestEvents = true, tagPushEvents = false) { + + def webhookUrl = "${jenkins_url}/project/${jenkinsProjectName}" + def gitlabProjectEncoded = java.net.URLEncoder.encode(gitlabProjectName, "UTF-8") + def payload = """ + { + "id": "${gitlabProjectEncoded}", + "url": "${webhookUrl}", + "push_events": "${pushEvents}", + "merge_requests_events": "${mergeRequestEvents}", + "tag_push_events": "${tagPushEvents}", + "token": "{{jenkins_token}}" + } + """ + + def url = "${gitlab_url}/api/v4/projects/${gitlabProjectEncoded}/hooks" + + // get current webhooks of the gitlab project + def response = httpRequest httpMode: 'GET', url: url, + contentType: 'APPLICATION_JSON', + customHeaders: [[name: 'Authorization', value: "Bearer $GITLAB_TOKEN"]] + + def hooks = readJSON text: response.content + for (hook in hooks) { + if (hook.url == webhookUrl) { + // update previously set webhook for jenkins job + httpRequest httpMode: 'PUT', url: "${url}/${hook.id}", + contentType: 'APPLICATION_JSON', requestBody: payload, + customHeaders: [[name: 'Authorization', value: "Bearer $GITLAB_TOKEN"]] + return + } + } + + // add webhook for jenkins job + httpRequest httpMode: 'POST', url: url, + contentType: 'APPLICATION_JSON', requestBody: payload, + customHeaders: [[name: 'Authorization', value: "Bearer $GITLAB_TOKEN"]] + +} + diff --git a/jobs/tools/setup-gitlab-webhooks.yaml b/jobs/tools/setup-gitlab-webhooks.yaml new file mode 100644 index 0000000..f5eba6c --- /dev/null +++ b/jobs/tools/setup-gitlab-webhooks.yaml @@ -0,0 +1,25 @@ +- job-template: + name: jenkins-tools/{name} + project-type: pipeline + description: Setup Jenkins integration for a GitLab repository + node: built-in + # secret jenkins token is generated when executing tox + jenkins_token: !include-raw: jobs/templates/jenkins-token + parameters: + - string: + name: gitlab_url + description: URL of GitLab instance + default: https://gitlab-staging.swh.network + - string: + name: jenkins_url + description: URL of Jenkins instance + default: https://jenkins.softwareheritage.org + + dsl: !include-jinja2: setup-gitlab-webhooks.groovy.j2 + +# we use a project and a job template here as we need jinja2 processing +# to inline the generated jenkins token into the pipeline groovy script +- project: + name: setup-gitlab-webhooks + jobs: + - "jenkins-tools/{name}"