mirror of
https://github.com/Instadapp/trustwallet-assets.git
synced 2024-07-29 22:37:31 +00:00
[internal] Set up Danger build on PR (#3243)
* Return all error messages from checks (to be used by Danger). * Add Danger dev dep. * Fix danger.yml + dangerfile.ts. * Fix root files. * Finetune Danger message. Co-authored-by: Catenocrypt <catenocrypt@users.noreply.github.com>
This commit is contained in:
parent
0c013b91ac
commit
197613e61c
24
.github/workflows/danger.yml
vendored
24
.github/workflows/danger.yml
vendored
|
@ -1,17 +1,23 @@
|
|||
name: Danger
|
||||
on:
|
||||
push:
|
||||
branches: [ master ]
|
||||
pull_request:
|
||||
branches: [ 'master' ]
|
||||
workflow_dispatch:
|
||||
jobs:
|
||||
danger:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Install gems
|
||||
run: sudo gem install bundler --no-document
|
||||
- name: Bundle update
|
||||
run: bundle update --bundler
|
||||
- name: Run Danger
|
||||
run: danger --verbose
|
||||
- name: Use Node.js 10.x
|
||||
uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: 10.x
|
||||
- name: install yarn
|
||||
run: npm install -g yarn
|
||||
- name: yarn install
|
||||
run: |
|
||||
yarn install --frozen-lockfile
|
||||
- name: Danger
|
||||
run: yarn danger ci
|
||||
env:
|
||||
DANGER_GITHUB_API_TOKEN: ${{ secrets.DANGER_GITHUB_API_TOKEN }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
|
115
Dangerfile
115
Dangerfile
|
@ -1,115 +0,0 @@
|
|||
require 'find'
|
||||
require 'image_size'
|
||||
require 'json-schema'
|
||||
|
||||
blockchains_folder = './blockchains'
|
||||
allowed_extensions = ['png', 'json']
|
||||
allowed_file_names = ['info', 'list', 'logo', 'whitelist', 'blacklist']
|
||||
|
||||
maxAssetLogoSizeInKilobyte = 100
|
||||
minLogoWidth = 64
|
||||
minLogoHeight = 64
|
||||
maxLogoWidth = 512
|
||||
maxLogoHeight = 512
|
||||
|
||||
# Failures
|
||||
# Do not allow files in this directory
|
||||
Dir.foreach(blockchains_folder) \
|
||||
.map { |x| File.expand_path("#{blockchains_folder}/#{x}") } \
|
||||
.select { |x| File.file?(x) }
|
||||
.map { |x|
|
||||
fail("Not allowed to have files inside blockchains folder itself. You have to add them inside specific blockchain folder as blockchain/ethereum or blockchain/binance for file: " + x)
|
||||
}
|
||||
|
||||
Find.find(blockchains_folder) do |file|
|
||||
file_extension = File.extname(file).delete('.')
|
||||
file_name = File.basename(file, File.extname(file))
|
||||
|
||||
# Skip if directory
|
||||
if File.directory?(file)
|
||||
next
|
||||
end
|
||||
|
||||
if !allowed_extensions.include? file_extension
|
||||
fail("Extension not allowed for file: " + file)
|
||||
end
|
||||
|
||||
if !allowed_file_names.include? file_name
|
||||
fail("Filename not allowed for file: " + file)
|
||||
end
|
||||
|
||||
# Validate JSON content
|
||||
if file_extension == 'json'
|
||||
value = nil
|
||||
begin
|
||||
value = JSON.parse(File.open(file).read)
|
||||
rescue JSON::ParserError, TypeError => e
|
||||
fail("Wrong JSON content in file: " + file)
|
||||
end
|
||||
|
||||
# Validate info.json
|
||||
if file_name == 'info'
|
||||
schema = {
|
||||
"type": "object",
|
||||
"required": ["name", "website", "short_description", "explorer"],
|
||||
"properties": {
|
||||
"name": {"type": "string"},
|
||||
"website": {"type": "string"},
|
||||
"short_description": {"type": "string"},
|
||||
"explorer": {"type": "string"}
|
||||
}
|
||||
}
|
||||
errors = JSON::Validator.fully_validate(schema, value)
|
||||
errors.each { |error| message("#{error} in file #{file}") }
|
||||
end
|
||||
|
||||
# Validate list.json for validators
|
||||
if file_name == 'list'
|
||||
schema = {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"properties": {
|
||||
"id": { "type": "string" },
|
||||
"name": { "type": "string" },
|
||||
"description": { "type": "string" },
|
||||
"website": { "type": "string" }
|
||||
},
|
||||
"required": ["id", "name", "description", "website"]
|
||||
}
|
||||
}
|
||||
errors = JSON::Validator.fully_validate(schema, value)
|
||||
errors.each { |error| message("#{error} in file #{file}") }
|
||||
end
|
||||
|
||||
# Validate whitelist, blacklist files
|
||||
if file_name == 'whitelist' || file_name == 'blacklist'
|
||||
schema = {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
errors = JSON::Validator.fully_validate(schema, value)
|
||||
errors.each { |error| message("#{error} in file #{file}") }
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
# Validate images
|
||||
if file_extension == 'png'
|
||||
image_size = ImageSize.path(file)
|
||||
|
||||
if image_size.width > maxLogoWidth || image_size.height > maxLogoHeight
|
||||
fail("Image width or height is higher than 512px for file: " + file)
|
||||
end
|
||||
|
||||
if image_size.format == 'png'
|
||||
fail("Image should be PNG for file: " + file)
|
||||
end
|
||||
|
||||
# Make sure file size only 100kb
|
||||
if File.size(file).to_f / 1024 > maxAssetLogoSizeInKilobyte
|
||||
fail("Image should less than 100kb for file: " + file)
|
||||
end
|
||||
end
|
||||
end
|
9
dangerfile.ts
Normal file
9
dangerfile.ts
Normal file
|
@ -0,0 +1,9 @@
|
|||
import { fail, markdown } from "danger";
|
||||
import { sanityCheckAll } from "./script/action/update-all";
|
||||
|
||||
sanityCheckAll().then(errors => {
|
||||
if (errors.length > 0) {
|
||||
errors.forEach(err => fail(err));
|
||||
markdown("Please fix the errors above. Files can be replaced/renamed in this pull request (using command-line, or GitHub Desktop). Alternatively, you may close this pull request and open a new one.");
|
||||
}
|
||||
});
|
1010
package-lock.json
generated
1010
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
|
@ -39,6 +39,7 @@
|
|||
"bip44-constants": "^8.0.30",
|
||||
"bluebird": "^3.7.2",
|
||||
"chalk": "^4.1.0",
|
||||
"danger": "^10.3.0",
|
||||
"ethereum-checksum-address": "0.0.5",
|
||||
"eztz-lib": "^0.1.2",
|
||||
"image-size": "^0.8.3",
|
||||
|
|
|
@ -34,38 +34,38 @@ const actionList: ActionInterface[] = [
|
|||
new Coinmarketcap()
|
||||
];
|
||||
|
||||
async function checkStepList(steps: CheckStepInterface[]): Promise<number> {
|
||||
var returnCode = 0;
|
||||
async function checkStepList(steps: CheckStepInterface[]): Promise<string[]> {
|
||||
var errors: string[] = [];
|
||||
await bluebird.each(steps, async (step) => {
|
||||
try {
|
||||
//console.log(` Running check step '${step.getName()}'...`);
|
||||
const error = await step.check();
|
||||
if (error && error.length > 0) {
|
||||
console.log(`- ${chalk.red('X')} '${step.getName()}': '${error}'`);
|
||||
returnCode = 1;
|
||||
errors.push(`${step.getName()}: ${error}`);
|
||||
} else {
|
||||
console.log(`- ${chalk.green('✓')} '${step.getName()}' OK`);
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(`- ${chalk.red('X')} '${step.getName()}': Caught error: ${error.message}`);
|
||||
returnCode = 2;
|
||||
errors.push(`${step.getName()}: Exception: ${error.message}`);
|
||||
}
|
||||
});
|
||||
return returnCode;
|
||||
return errors;
|
||||
}
|
||||
|
||||
async function sanityCheckByActionList(actions: ActionInterface[]): Promise<number> {
|
||||
async function sanityCheckByActionList(actions: ActionInterface[]): Promise<string[]> {
|
||||
console.log("Running sanity checks...");
|
||||
var returnCode = 0;
|
||||
var errors: string[] = [];
|
||||
await bluebird.each(actions, async (action) => {
|
||||
try {
|
||||
if (action.getSanityChecks) {
|
||||
const steps = action.getSanityChecks();
|
||||
if (steps && steps.length > 0) {
|
||||
console.log(` Action '${action.getName()}' has ${steps.length} check steps`);
|
||||
const ret1 = await checkStepList(steps);
|
||||
if (ret1 != 0) {
|
||||
returnCode = ret1;
|
||||
const errors1 = await checkStepList(steps);
|
||||
if (errors1.length > 0) {
|
||||
errors1.forEach(e => errors.push(e));
|
||||
} else {
|
||||
console.log(`- ${chalk.green('✓')} Action '${action.getName()}' OK, all ${steps.length} steps`);
|
||||
}
|
||||
|
@ -73,25 +73,25 @@ async function sanityCheckByActionList(actions: ActionInterface[]): Promise<numb
|
|||
}
|
||||
} catch (error) {
|
||||
console.log(`- ${chalk.red('X')} '${action.getName()}' Caught error: ${error.message}`);
|
||||
returnCode = 3;
|
||||
errors.push(`${action.getName()}: Exception: ${error.message}`);
|
||||
}
|
||||
});
|
||||
console.log(`All sanity checks done, returnCode ${returnCode}`);
|
||||
return returnCode;
|
||||
console.log(`All sanity checks done, found ${errors.length} errors`);
|
||||
return errors;
|
||||
}
|
||||
|
||||
async function consistencyCheckByActionList(actions: ActionInterface[]): Promise<number> {
|
||||
async function consistencyCheckByActionList(actions: ActionInterface[]): Promise<string[]> {
|
||||
console.log("Running consistency checks...");
|
||||
var returnCode = 0;
|
||||
var errors: string[] = [];
|
||||
await bluebird.each(actions, async (action) => {
|
||||
try {
|
||||
if (action.getConsistencyChecks) {
|
||||
const steps = action.getConsistencyChecks();
|
||||
if (steps && steps.length > 0) {
|
||||
console.log(` Action '${action.getName()}' has ${steps.length} check steps`);
|
||||
const ret1 = await checkStepList(steps);
|
||||
if (ret1 != 0) {
|
||||
returnCode = ret1;
|
||||
const errors1 = await checkStepList(steps);
|
||||
if (errors1.length > 0) {
|
||||
errors1.forEach(e => errors.push(e));
|
||||
} else {
|
||||
console.log(`- ${chalk.green('✓')} Action '${action.getName()}' OK, all ${steps.length} steps`);
|
||||
}
|
||||
|
@ -99,11 +99,11 @@ async function consistencyCheckByActionList(actions: ActionInterface[]): Promise
|
|||
}
|
||||
} catch (error) {
|
||||
console.log(`- ${chalk.red('X')} '${action.getName()}' Caught error: ${error.message}`);
|
||||
returnCode = 3;
|
||||
errors.push(`${action.getName()}: Exception: ${error.message}`);
|
||||
}
|
||||
});
|
||||
console.log(`All consistency checks done, returnCode ${returnCode}`);
|
||||
return returnCode;
|
||||
console.log(`All consistency checks done, found ${errors.length} errors`);
|
||||
return errors;
|
||||
}
|
||||
|
||||
async function sanityFixByList(actions: ActionInterface[]) {
|
||||
|
@ -151,11 +151,11 @@ async function updateByList(actions: ActionInterface[]) {
|
|||
console.log("All updates done.");
|
||||
}
|
||||
|
||||
export async function sanityCheckAll(): Promise<number> {
|
||||
export async function sanityCheckAll(): Promise<string[]> {
|
||||
return await sanityCheckByActionList(actionList);
|
||||
}
|
||||
|
||||
export async function consistencyCheckAll(): Promise<number> {
|
||||
export async function consistencyCheckAll(): Promise<string[]> {
|
||||
return await consistencyCheckByActionList(actionList);
|
||||
}
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
"image_min_logo_width": 64,
|
||||
"image_min_logo_height": 64,
|
||||
"image_logo_size_kb": 100,
|
||||
"folders_rootdir_allowed_files": [".github", "blockchains", "dapps", "media", "node_modules", "script-old", "script", "test", ".gitignore", "azure-pipelines.yml", "jest.config.js", "LICENSE", "package-lock.json", "package.json", "README.md", ".git", "pricing", "Dangerfile", "Gemfile", "Gemfile.lock"],
|
||||
"folders_rootdir_allowed_files": [".github", "blockchains", "dapps", "media", "node_modules", "script-old", "script", "test", ".gitignore", "azure-pipelines.yml", "jest.config.js", "LICENSE", "package-lock.json", "package.json", "README.md", ".git", "pricing", "dangerfile.ts", "Gemfile", "Gemfile.lock"],
|
||||
"binance_url_tokens2": "https://dex-atlantic.binance.org/api/v1/tokens?limit=1000",
|
||||
"binance_url_tokens8": "https://dex-atlantic.binance.org/api/v1/mini/tokens?limit=1000",
|
||||
"binance_url_token_assets": "https://explorer.binance.org/api/v1/assets?page=1&rows=1000"
|
||||
|
|
|
@ -2,8 +2,8 @@ import { sanityCheckAll } from "../action/update-all";
|
|||
|
||||
export async function main() {
|
||||
try {
|
||||
const returnCode = await sanityCheckAll();
|
||||
process.exit(returnCode);
|
||||
const errors = await sanityCheckAll();
|
||||
process.exit(errors.length);
|
||||
} catch(err) {
|
||||
console.error(err);
|
||||
process.exit(1);
|
||||
|
|
|
@ -4,9 +4,9 @@ export async function main() {
|
|||
var returnCode: number = 0;
|
||||
|
||||
try {
|
||||
const ret1 = await sanityCheckAll();
|
||||
if (ret1 != 0) {
|
||||
returnCode = ret1;
|
||||
const errors1 = await sanityCheckAll();
|
||||
if (errors1.length > 0) {
|
||||
returnCode = errors1.length;
|
||||
}
|
||||
} catch(err) {
|
||||
console.error(err);
|
||||
|
@ -14,9 +14,9 @@ export async function main() {
|
|||
}
|
||||
|
||||
try {
|
||||
const ret1 = await consistencyCheckAll();
|
||||
if (ret1 != 0) {
|
||||
returnCode = ret1;
|
||||
const errors1 = await consistencyCheckAll();
|
||||
if (errors1.length > 0) {
|
||||
returnCode = errors1.length;
|
||||
}
|
||||
} catch(err) {
|
||||
console.error(err);
|
||||
|
|
Loading…
Reference in New Issue
Block a user