[HUDI-985] Introduce rerun ci bot (#1693)
* [HUDI-985] Introduce rerun ci bot * Implement bot using github-script * trigger rebuild
This commit is contained in:
36
.github/actions/bot/package.json
vendored
Normal file
36
.github/actions/bot/package.json
vendored
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
{
|
||||||
|
"name": "github_action_ci_bot",
|
||||||
|
"version": "1.1.1",
|
||||||
|
"description": "CI Bot for GitHub Actions",
|
||||||
|
"main": "dist/index.js",
|
||||||
|
"scripts": {
|
||||||
|
"lint": "eslint 'src/**.js' 'tests/**.js' --fix",
|
||||||
|
"test": "eslint 'src/**.js' 'tests/**.js' && jest --coverage",
|
||||||
|
"build": "ncc build src/action.js"
|
||||||
|
},
|
||||||
|
"author": "lamber-ken",
|
||||||
|
"license": "Apache LICENSE 2.0",
|
||||||
|
"homepage": "https://github.com/apache/hudi",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/apache/hudi/issues"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@actions/core": "^1.2.4",
|
||||||
|
"@actions/github": "^2.2.0",
|
||||||
|
"@actions/io": "^1.0.2"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/jest": "^25.1.4",
|
||||||
|
"@typescript-eslint/eslint-plugin": "^2.33.0",
|
||||||
|
"@typescript-eslint/parser": "^2.33.0",
|
||||||
|
"@zeit/ncc": "^0.22.0",
|
||||||
|
"eslint": "^7.0.0",
|
||||||
|
"eslint-config-prettier": "^6.11.0",
|
||||||
|
"husky": "^4.2.5",
|
||||||
|
"jest": "^25.1.0",
|
||||||
|
"npm-run-all": "^4.1.5",
|
||||||
|
"prettier": "^2.0.5",
|
||||||
|
"ts-jest": "^25.2.1",
|
||||||
|
"typescript": "^3.8.3"
|
||||||
|
}
|
||||||
|
}
|
||||||
100
.github/actions/bot/src/action.js
vendored
Normal file
100
.github/actions/bot/src/action.js
vendored
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
async function check(core, context, github) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
const provider = process.env.PROVIDER;
|
||||||
|
const repository = process.env.REPOSITORY;
|
||||||
|
const command = context.payload.comment.body;
|
||||||
|
|
||||||
|
if (command !== 'rerun tests') {
|
||||||
|
console.log("Invalid command:" + command);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const {
|
||||||
|
data: {
|
||||||
|
head: {
|
||||||
|
sha: ref,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} = await github.pulls.get({
|
||||||
|
owner: provider,
|
||||||
|
repo: repository,
|
||||||
|
pull_number: context.issue.number,
|
||||||
|
});
|
||||||
|
|
||||||
|
const checks = await github.checks.listForRef({
|
||||||
|
owner: provider,
|
||||||
|
repo: repository,
|
||||||
|
ref: ref
|
||||||
|
});
|
||||||
|
|
||||||
|
checks.data.check_runs.forEach(run => {
|
||||||
|
|
||||||
|
if (run.app.owner.login === 'travis-ci') {
|
||||||
|
console.log("rerun travis ci check: " + run.external_id);
|
||||||
|
rebuild(run.external_id)
|
||||||
|
} else {
|
||||||
|
console.log("ignore github action check: " + run.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
} catch (e) {
|
||||||
|
console.log("check bot run failed: " + e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function rebuild(buildId) {
|
||||||
|
const https = require('https');
|
||||||
|
const token = process.env.HUDI_TRAVIS_ORG_TOKEN
|
||||||
|
|
||||||
|
const options = {
|
||||||
|
hostname: 'api.travis-ci.org',
|
||||||
|
port: 443,
|
||||||
|
path: `/build/${buildId}/restart`,
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Travis-API-Version': 3,
|
||||||
|
'Authorization': `token ${token}`,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const req = https.request(options, function (res) {
|
||||||
|
res.setEncoding('utf8');
|
||||||
|
res.on('data', function (data) {
|
||||||
|
console.log('data: ' + data);
|
||||||
|
});
|
||||||
|
res.on('error', function (error) {
|
||||||
|
console.log('error: ' + error);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
req.on('error', function (e) {
|
||||||
|
console.log('problem with request: ' + e.message);
|
||||||
|
});
|
||||||
|
|
||||||
|
req.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = ({core}, {context}, {github}) => {
|
||||||
|
return check(core, context, github);
|
||||||
|
}
|
||||||
43
.github/workflows/bot.yml
vendored
Normal file
43
.github/workflows/bot.yml
vendored
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
#
|
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
# or more contributor license agreements. See the NOTICE file
|
||||||
|
# distributed with this work for additional information
|
||||||
|
# regarding copyright ownership. The ASF licenses this file
|
||||||
|
# to you under the Apache License, Version 2.0 (the
|
||||||
|
# "License"); you may not use this file except in compliance
|
||||||
|
# with the License. You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing,
|
||||||
|
# software distributed under the License is distributed on an
|
||||||
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
# KIND, either express or implied. See the License for the
|
||||||
|
# specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
#
|
||||||
|
|
||||||
|
name: CI BOT
|
||||||
|
|
||||||
|
on:
|
||||||
|
issue_comment:
|
||||||
|
types: [created]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
bot:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: clone repository
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: bot actions
|
||||||
|
uses: actions/github-script@v1
|
||||||
|
env:
|
||||||
|
PROVIDER : 'apache'
|
||||||
|
REPOSITORY: 'hudi'
|
||||||
|
HUDI_TRAVIS_ORG_TOKEN: ${{ secrets.HUDI_TRAVIS_ORG_TOKEN }}
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
const path = require('path')
|
||||||
|
const scriptPath = path.resolve('.github/actions/bot/src/action.js')
|
||||||
|
require(scriptPath)({core}, {context}, {github})
|
||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -77,3 +77,5 @@ dependency-reduced-pom.xml
|
|||||||
# Docker
|
# Docker
|
||||||
#######################################
|
#######################################
|
||||||
hudi-integ-test/compose_env
|
hudi-integ-test/compose_env
|
||||||
|
node_modules
|
||||||
|
package-lock.json
|
||||||
Reference in New Issue
Block a user