2

我创建了一个存储库 git aws codeCommit,当我在分支 X 上推送一些东西以启动 Jenkins 工作时,我需要它。

图中是我的配置:

在此处输入图像描述

但它不起作用。当我将源代码推送到我的分支 codeCommit 时,什么也没有发生。你有什么想法吗?

4

4 回答 4

1

您可以根据推送到分支来触发 Jenkins:
https ://wiki.jenkins.io/display/JENKINS/AWS+CodeCommit+Trigger+Plugin
https://github.com/riboseinc/tf-codecommit-sqs/blob /master/main.tf

于 2018-07-29T19:19:56.663 回答
1

codecommit 不支持像 GitHub 那样触发 Jenkins。但是你可以设置 Jenkins 来轮询 codecommit

https://aws.amazon.com/blogs/devops/integrating-aws-codecommit-with-jenkins/

于 2018-03-13T02:59:57.320 回答
0

另一种使用git 插件推送通知的解决方案。是以下 lambda,您可以将其注册为 repo 的触发器。

好处是:不需要调整 jenkins 的工作(假设他们启用了 SCM 轮询),没有特殊的凭据,并且不需要预先知道工作。

const url = require('url');
const HEAD_PREFIX='refs/heads/';
const JENKINS_URL=url.parse(url.resolve(process.env.JENKINS_URL, "git/notifyCommit"));
const CLONE_PROTOCOL=process.env.CLONE_PROTOCOL ? process.env.CLONE_PROTOCOL : "ssh";
const http = require(JENKINS_URL.protocol.split(":")[0]);

exports.handler = async (event) => {
    await Promise.all(event.Records.map(handleRecord));
};

async function handleRecord(record) {
    var repo = cloneUrl(record.eventSourceARN);
    await Promise.all(
        record.codecommit.references
            .filter(ref => ref.ref.startsWith(HEAD_PREFIX))
            .map(ref => pollJenkins(repo, ref))
    );
}

function cloneUrl(repoArn) {
    var splitted = repoArn.split(":");
    return `${CLONE_PROTOCOL}://git-codecommit.${splitted[3]}.amazonaws.com/v1/repos/${splitted[5]}`
}

function pollJenkins(repo, ref) {
    const path = url.format(Object.assign({}, JENKINS_URL, {
        query: {
            url: repo,
            branches: ref.ref.substring(HEAD_PREFIX.length),
            sha1: ref.commit
        }
    }));
    return new Promise(function(resolve, reject){
        const req = http.get(path, res => {
            if (res.statusCode > 100 && res.statusCode < 300) {
                console.log("success: " + path);
                resolve();
                res.resume();
            } else {
                res.on('data', (chunk) => {
                  console.log(`BODY: ${chunk}`);
                });
                res.on('end', () => {
                  reject("Unexpected status code " + res.statusCode);
                });
            }
        });
        req.on('error', reject);
   });
}

提供JENKINS_URL和 codecommitCLONE_PROTOCOL作为环境变量。

于 2019-03-22T13:09:42.237 回答
0

当我将某些内容推送到 CodeCommit 时,我使用 AWS Lambda 来触发 Jenkins。你知道你可以使用 cURL 手动触发 Jenkins:

curl --request POST --url ' http://example.com/jenkins/job/MYJOBNAME/job/MYREPONAME/job/master/build?delay=0sec ' --user JenkinsUserId:JenkinsAPIToken

只需将此 cURL 转换为 nodejs 中的 POST 请求即可。

  • 在配置部分找到您的 Jenkins 凭据。
  • 使用 NodeJS 创建一个新的 Lambda
  • 向此 Lambda 添加 CodeCommit 触发器。
  • 将以下代码粘贴到您的 Lambda 中并根据需要替换凭证
const http = require('http')

exports.handler = (event, context, callback) => {

    var auth = 'Basic ' + Buffer.from('JenkinsUserId:JenkinsAPIToken').toString('base64');

    var options = {
      host: 'example.com or ip address',
      path: '/jenkins/job/MyJenkinsJobName/job/RepoName/job/master/build?delay=0sec',
      port: '80',
      method: 'POST',
      headers: { 'Authorization': auth }
    };

   const req = http.request(options, (res) => {
        res.setEncoding('utf8');
        res.on('data', (chunk) => {
          // if you need the returned data modify here
        });
        res.on('end', () => {
          callback(null, 'Jenkins job triggered successfully')
        });
    });
    req.on('error', (e) => {
        console.log(e)
        callback(null, "An error occurred while triggering Jenkins job.");
    });
    req.end();
};
于 2018-08-05T20:32:43.777 回答