我创建了一个存储库 git aws codeCommit,当我在分支 X 上推送一些东西以启动 Jenkins 工作时,我需要它。
图中是我的配置:
但它不起作用。当我将源代码推送到我的分支 codeCommit 时,什么也没有发生。你有什么想法吗?
我创建了一个存储库 git aws codeCommit,当我在分支 X 上推送一些东西以启动 Jenkins 工作时,我需要它。
图中是我的配置:
但它不起作用。当我将源代码推送到我的分支 codeCommit 时,什么也没有发生。你有什么想法吗?
您可以根据推送到分支来触发 Jenkins:
https ://wiki.jenkins.io/display/JENKINS/AWS+CodeCommit+Trigger+Plugin
https://github.com/riboseinc/tf-codecommit-sqs/blob /master/main.tf
codecommit 不支持像 GitHub 那样触发 Jenkins。但是你可以设置 Jenkins 来轮询 codecommit
https://aws.amazon.com/blogs/devops/integrating-aws-codecommit-with-jenkins/
另一种使用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
作为环境变量。
当我将某些内容推送到 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 请求即可。
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();
};