diff --git a/Jenkinsfile b/Jenkinsfile index 621a28b..a2ade43 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -43,6 +43,54 @@ pipeline { sh 'npx prettier --check .' } } + stage('Deploy docker image (PR)') { + when { + changeRequest() + } + steps { + script { + // If the PR comes from a fork, verify the fork owner is a linagora org member + if (env.CHANGE_FORK) { + def forkOwner = env.CHANGE_FORK + def memberStatus = sh( + script: """curl -s -o /dev/null -w "%{http_code}" \ + -H "Authorization: token \${GITHUB_CREDENTIAL_PSW}" \ + "https://api.github.com/orgs/linagora/members/${forkOwner}" """, + returnStdout: true + ).trim() + echo "GitHub org membership check returned HTTP ${memberStatus} for '${forkOwner}'" + if (memberStatus == '204') { + echo "Fork owner '${forkOwner}' is a linagora org member, proceeding." + } else if (memberStatus == '404') { + error("Fork owner '${forkOwner}' is not a member of the linagora organization. Skipping deploy.") + } else if (memberStatus == '401' || memberStatus == '403') { + error("Authentication/permission error validating fork owner: ${memberStatus}") + } else { + error("GitHub API error ${memberStatus} while checking membership for '${forkOwner}'") + } + } + + def dockerTag = "pr-${env.CHANGE_ID}" + env.DOCKER_TAG = dockerTag + echo "Docker tag: ${dockerTag}" + sh 'npm run build' + sh 'docker build -t linagora/twake-calendar-web:$DOCKER_TAG .' + sh 'echo $DOCKER_HUB_CREDENTIAL_PSW | docker login -u $DOCKER_HUB_CREDENTIAL_USR --password-stdin' + sh 'docker push linagora/twake-calendar-web:$DOCKER_TAG' + sh """ + HTTP_STATUS=\$(curl -s -o /tmp/gh_comment_response.json -w "%{http_code}" -X POST \\ + -H "Authorization: token \${GITHUB_CREDENTIAL_PSW}" \\ + -H "Content-Type: application/json" \\ + -d "{\\"body\\": \\"Docker image published for this PR: linagora/twake-calendar-web:${dockerTag}\\"}" \\ + "https://api.github.com/repos/linagora/twake-calendar-frontend/issues/\${CHANGE_ID}/comments") + if [ "\$HTTP_STATUS" -lt 200 ] || [ "\$HTTP_STATUS" -ge 300 ]; then + echo "WARNING: GitHub API comment failed with HTTP \$HTTP_STATUS" + cat /tmp/gh_comment_response.json + fi + """ + } + } + } stage('Deploy docker images') { when { anyOf {