Skip to content
Snippets Groups Projects
Unverified Commit 3462edcd authored by Nemanja Glumac's avatar Nemanja Glumac Committed by GitHub
Browse files

Remove `image diff` (#17159)

* Remove `image-diff` library

* Remove `compare-screenshots` script
parent 1127578a
No related branches found
No related tags found
No related merge requests found
#!/usr/bin/env babel-node
import fetch from "isomorphic-fetch";
import path from "path";
import fs from "fs-promise"
import imageDiff_ from "image-diff";
import https from "https";
import os from "os";
import { WebClient } from "@slack/client";
const CIRCLECI_TOKEN = process.env["CIRCLECI_TOKEN"];
const SLACK_TOKEN = process.env["SLACK_TOKEN"];
const SLACK_CHANNEL = "#ci-screenshots";
const CIRCLE_PROJECT = "github/metabase/metabase";
const CIRCLE_BRANCH = "master";
const CIRCLE_SCREENSHOT_PATH = "/home/ubuntu/metabase/screenshots/";
const slack = new WebClient(SLACK_TOKEN);
async function circleci(path) {
const response = await fetch(
`https://circleci.com/api/v1.1/${path}?circle-token=${encodeURIComponent(CIRCLECI_TOKEN)}`
);
return response.json();
}
function imageDiff(options) {
return new Promise((resolve, reject) => {
imageDiff_.getFullResult(options, (err, result) =>
err ? reject(err) : resolve(result)
);
});
}
function download(url, path) {
return new Promise((resolve, reject) => {
https.get(url, response => {
response.pipe(fs.createWriteStream(path)).on("finish", resolve);
}).on('error', reject);
});
}
async function getCircleArtifactScreenshots(buildPath) {
let artifacts = await circleci(`project/${buildPath}/artifacts`);
let results = {};
for (const artifact of artifacts) {
if (artifact.pretty_path.startsWith(CIRCLE_SCREENSHOT_PATH)) {
const downloadPath = path.join(os.tmpdir(), path.basename(artifact.pretty_path));
console.log("Downloading ", artifact.url, "to", downloadPath);
await download(artifact.url, downloadPath);
results[artifact.pretty_path.slice(CIRCLE_SCREENSHOT_PATH.length)] = downloadPath;
}
}
return results;
}
async function getLocalScreenshots(directory) {
const filenames = await fs.readdir(directory);
let results = {};
for (const filename of filenames) {
results[filename] = path.resolve(directory, filename);
}
return results;
}
async function getScreenshots(target) {
if (target.circleProject && target.circleBranch) {
let builds = await circleci(`project/${target.circleProject}/tree/${target.circleBranch}`);
let ok = builds.filter(build => build.status === "success" || build.status === "fixed");
let screenshots = await getCircleArtifactScreenshots(`${target.circleProject}/${ok[0].build_num}`);
return screenshots;
} else if (target.localDirectory) {
return await getLocalScreenshots(target.localDirectory);
} else {
throw "unknown target type";
}
}
async function run(expectedTarget, actualTarget) {
try {
const expectedScreenshots = await getScreenshots(expectedTarget);
console.log("Expected", Object.keys(expectedScreenshots));
const actualScreenshots = await getScreenshots(actualTarget);
console.log("Actual", Object.keys(expectedScreenshots));
let images = Object.keys({ ...expectedScreenshots, ...actualScreenshots });
for (const image of images) {
const expectedImage = expectedScreenshots[image];
const actualImage = actualScreenshots[image];
const diffImage = path.join(os.tmpdir(), "diff-"+image);
if (!actualImage) {
console.log("Added", image);
await slack.files.upload(image, {
title: "Added " + image,
channels: [SLACK_CHANNEL],
file: fs.createReadStream(actualImage)
});
} else if (!expectedImage) {
console.log("Removed", image);
await slack.files.upload(image, {
title: "Removed " + image,
channels: [SLACK_CHANNEL],
file: fs.createReadStream(expectedImage)
});
} else {
const result = await imageDiff({
expectedImage,
actualImage,
diffImage,
shadow: true
})
if (result.percentage === 0.0) {
console.log("No difference", image);
} else {
console.log("Changed", result.percentage.toFixed(2), image);
await slack.files.upload(image, {
title: "Diff (" + result.percentage.toFixed(2) + ") " + image,
channels: [SLACK_CHANNEL],
file: fs.createReadStream(diffImage)
});
await slack.files.upload(image, {
title: "Expected " + image,
channels: [SLACK_CHANNEL],
file: fs.createReadStream(expectedImage)
});
await slack.files.upload(image, {
title: "Actual " + image,
channels: [SLACK_CHANNEL],
file: fs.createReadStream(actualImage)
});
}
}
}
} catch (e) {
console.error(e);
}
}
run(
{ circleProject: CIRCLE_PROJECT, circleBranch: CIRCLE_BRANCH },
{ localDirectory: "screenshots" }
);
......@@ -1802,16 +1802,6 @@ array-includes@^3.1.2:
get-intrinsic "^1.1.1"
is-string "^1.0.5"
 
array-parallel@~0.1.3:
version "0.1.3"
resolved "https://registry.yarnpkg.com/array-parallel/-/array-parallel-0.1.3.tgz#8f785308926ed5aa478c47e64d1b334b6c0c947d"
integrity sha1-j3hTCJJu1apHjEfmTRszS2wMlH0=
array-series@~0.1.5:
version "0.1.5"
resolved "https://registry.yarnpkg.com/array-series/-/array-series-0.1.5.tgz#df5d37bfc5c2ef0755e2aa4f92feae7d4b5a972f"
integrity sha1-3103v8XC7wdV4qpPkv6ufUtaly8=
array-union@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
......@@ -1954,11 +1944,6 @@ async@^3.2.0:
resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720"
integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==
 
async@~0.2.9:
version "0.2.10"
resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1"
integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E=
async@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9"
......@@ -3315,15 +3300,6 @@ buffer@^6.0.3:
base64-js "^1.3.1"
ieee754 "^1.2.1"
 
buffered-spawn@~1.1.1:
version "1.1.2"
resolved "https://registry.yarnpkg.com/buffered-spawn/-/buffered-spawn-1.1.2.tgz#21ad9735dfbf6576745be0d74a23ef257bf3c58d"
integrity sha1-Ia2XNd+/ZXZ0W+DXSiPvJXvzxY0=
dependencies:
cross-spawn-async "^1.0.1"
err-code "^0.1.0"
q "^1.0.1"
builtin-status-codes@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
......@@ -3945,13 +3921,6 @@ commander@~2.17.1:
resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==
 
commander@~2.9.0:
version "2.9.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
integrity sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=
dependencies:
graceful-readlink ">= 1.0.0"
common-tags@^1.8.0:
version "1.8.0"
resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937"
......@@ -4227,14 +4196,6 @@ create-react-class@^15.5.1, create-react-class@^15.5.2:
loose-envify "^1.3.1"
object-assign "^4.1.1"
 
cross-spawn-async@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-1.0.1.tgz#bb525c1e420d9942552e04791a3eb2d9887a105f"
integrity sha1-u1JcHkINmUJVLgR5Gj6y2Yh6EF8=
dependencies:
lru-cache "^2.6.5"
which "^1.1.1"
cross-spawn@^5.0.1:
version "5.1.0"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
......@@ -4637,13 +4598,6 @@ debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
dependencies:
ms "2.1.2"
 
debug@~2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
integrity sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=
dependencies:
ms "0.7.1"
decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
......@@ -5185,11 +5139,6 @@ envinfo@^7.7.3:
resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475"
integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==
 
err-code@^0.1.0:
version "0.1.2"
resolved "https://registry.yarnpkg.com/err-code/-/err-code-0.1.2.tgz#122a92b3342b9899da02b5ac994d30f95d4763ee"
integrity sha1-EiqSszQrmJnaArWsmU0w+V1HY+4=
errno@^0.1.3, errno@~0.1.7:
version "0.1.7"
resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
......@@ -6433,15 +6382,6 @@ globby@^6.1.0:
pify "^2.0.0"
pinkie-promise "^2.0.0"
 
gm@~1.21.1:
version "1.21.1"
resolved "https://registry.yarnpkg.com/gm/-/gm-1.21.1.tgz#7ed5ed05db36d30c1943f39c3bc1c839b8f2361d"
integrity sha1-ftXtBds20wwZQ/OcO8HIObjyNh0=
dependencies:
array-parallel "~0.1.3"
array-series "~0.1.5"
debug "~2.2.0"
graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.2.0:
version "4.2.4"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
......@@ -6452,11 +6392,6 @@ graceful-fs@^4.2.4:
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee"
integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
 
"graceful-readlink@>= 1.0.0":
version "1.0.1"
resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=
grid-styled@4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/grid-styled/-/grid-styled-4.1.0.tgz#adb060021b9562e02750ce515dae47f03559b4b9"
......@@ -6968,18 +6903,6 @@ ignore@^4.0.6:
resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
 
image-diff@^1.6.3:
version "1.6.3"
resolved "https://registry.yarnpkg.com/image-diff/-/image-diff-1.6.3.tgz#818a0e656ae89480e802e7ef14db460826f730fc"
integrity sha1-gYoOZWrolIDoAufvFNtGCCb3MPw=
dependencies:
async "~0.2.9"
buffered-spawn "~1.1.1"
commander "~2.9.0"
gm "~1.21.1"
mkdirp "~0.3.5"
tmp "0.0.23"
import-cwd@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9"
......@@ -8820,11 +8743,6 @@ lower-case@^2.0.2:
dependencies:
tslib "^2.0.3"
 
lru-cache@^2.6.5:
version "2.7.3"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952"
integrity sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=
lru-cache@^4.0.1:
version "4.1.5"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
......@@ -9218,11 +9136,6 @@ mkdirp@^1.0.4:
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
 
mkdirp@~0.3.5:
version "0.3.5"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7"
integrity sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=
mockdate@^2.0.2:
version "2.0.5"
resolved "https://registry.yarnpkg.com/mockdate/-/mockdate-2.0.5.tgz#70c6abf9ed4b2dae65c81dfc170dd1a5cec53620"
......@@ -9265,11 +9178,6 @@ moment@2.x.x, "moment@>= 2.9.0", moment@^2.29.1:
resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3"
integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==
 
ms@0.7.1:
version "0.7.1"
resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"
integrity sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
......@@ -11110,7 +11018,7 @@ punycode@^2.1.0, punycode@^2.1.1:
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
 
q@^1.0.1, q@^1.1.2:
q@^1.1.2:
version "1.5.1"
resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
......@@ -13466,11 +13374,6 @@ tinycolor2@^1.4.1:
resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803"
integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==
 
tmp@0.0.23:
version "0.0.23"
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.23.tgz#de874aa5e974a85f0a32cdfdbd74663cb3bd9c74"
integrity sha1-3odKpel0qF8KMs39vXRmPLO9nHQ=
tmp@~0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment