diff --git a/package.json b/package.json
index f773a8406c8f0bca62aa8d6ece3ec842159c7148..ed6b1de417e47fde0a20c32498c1b7df0fdef471 100644
--- a/package.json
+++ b/package.json
@@ -173,6 +173,8 @@
     "re2": "1.10.5"
   },
   "devDependencies": {
+    "@actions/core": "1.2.3",
+    "@actions/exec": "1.0.3",
     "@babel/cli": "7.8.4",
     "@babel/core": "7.9.0",
     "@babel/node": "7.8.7",
diff --git a/tools/dispatch-release.mjs b/tools/dispatch-release.mjs
index 2a3f5b250da7d565309fb8427920af42582cb37b..231262ce4ca5f23cf1be0a04e9ced40338d9b194 100644
--- a/tools/dispatch-release.mjs
+++ b/tools/dispatch-release.mjs
@@ -1,5 +1,5 @@
 import got from 'got';
-import shell from 'shelljs';
+import core from '@actions/core';
 import { program } from './utils.mjs';
 
 const version = program.release;
@@ -7,32 +7,34 @@ const dry = program.dryRun;
 
 const baseUrl = 'https://api.github.com/';
 
-shell.echo(`Dispatching version: ${version}`);
+export default async function run() {
+  core.info(`Dispatching version: ${version}`);
 
-(async () => {
   if (dry) {
-    shell.echo('DRY-RUN: done.');
+    core.warning('DRY-RUN: done.');
     return;
   }
-  await got(`repos/${process.env.GITHUB_REPOSITORY}/dispatches`, {
-    baseUrl,
-    headers: {
-      'user-agent': 'Renovate release helper',
-      authorization: `token ${process.env.GITHUB_TOKEN}`,
-    },
-    json: true,
-    retry: 5,
-    body: {
-      event_type: 'renovate-release',
-      // max 10 keys here, https://github.com/peter-evans/repository-dispatch#client-payload
-      client_payload: {
-        sha: process.env.GITHUB_SHA,
-        ref: process.env.GITHUB_REF,
-        version,
+  try {
+    await got(`repos/${process.env.GITHUB_REPOSITORY}/dispatches`, {
+      baseUrl,
+      headers: {
+        'user-agent': 'Renovate release helper',
+        authorization: `token ${process.env.GITHUB_TOKEN}`,
       },
-    },
-  });
-})().catch(e => {
-  // Ignore for now
-  shell.echo(e.toString());
-});
+      json: true,
+      retry: 5,
+      body: {
+        event_type: 'renovate-release',
+        // max 10 keys here, https://github.com/peter-evans/repository-dispatch#client-payload
+        client_payload: {
+          sha: process.env.GITHUB_SHA,
+          ref: process.env.GITHUB_REF,
+          version,
+        },
+      },
+    });
+  } catch (e) {
+    // Ignore for now
+    core.error(e.toString());
+  }
+}
diff --git a/tools/package.json b/tools/package.json
index 0b98cf51cfa9ec82ce36de1a287b416f7752971c..c54deeeac0c678f7d7207fa53527a4fbf7ecab5b 100644
--- a/tools/package.json
+++ b/tools/package.json
@@ -2,6 +2,8 @@
   "private": true,
   "type": "module",
   "dependencies": {
+    "@actions/core": "1.2.3",
+    "@actions/exec": "1.0.3",
     "commander": "4.1.1",
     "fs-extra": "8.1.0",
     "got": "9.6.0",
diff --git a/tools/release.mjs b/tools/release.mjs
index 8d8e9e5fb2f271753f2ad09c9b575f7f0b8072b7..c345dc3ca9f30fc29d697be97aa07214daa38f72 100644
--- a/tools/release.mjs
+++ b/tools/release.mjs
@@ -1,29 +1,31 @@
-import shell from 'shelljs';
+import core from '@actions/core';
 import { program, exec } from './utils.mjs';
+import dispatch from './dispatch-release.mjs';
 
 const version = program.release;
 const sha = program.sha;
 
 let err = false;
 
-shell.echo(`Publishing version: ${version}`);
+core.info(`Publishing version: ${version}`);
 
-shell.echo('Publishing npm package ...');
+core.info('Publishing npm package ...');
 if (
   !exec(`npm --no-git-tag-version version ${version}`) ||
-  !exec(`npm publish`)
+  !exec(`npm publish`, [
+    'You cannot publish over the previously published versions',
+  ])
 ) {
   err = true;
 }
 
-shell.echo('Publishing docker images ...');
+core.info('Publishing docker images ...');
 if (!exec(`./.github/workflows/release-docker.sh ${version} ${sha}`)) {
   err = true;
 }
 
-// eslint-disable-next-line promise/valid-params
-import('./dispatch-release.mjs').catch();
+dispatch();
 
 if (err) {
-  shell.exit(2);
+  core.setFailed('release failed partially');
 }
diff --git a/tools/utils.mjs b/tools/utils.mjs
index 49f1e215ffe156226c7a56b991922e5cb5760ddc..932384b43600a90fdb340dd5260c353f6140f5d2 100644
--- a/tools/utils.mjs
+++ b/tools/utils.mjs
@@ -1,4 +1,5 @@
 import commander from 'commander';
+import core from '@actions/core';
 import shell from 'shelljs';
 
 const program = new commander.Command();
@@ -17,16 +18,33 @@ export { program };
  * @param cmd {string} The command to execute
  * @returns {boolean} Returns true on zero exit code otherwise false
  */
-export function exec(cmd) {
+export function exec(cmd, ignores = []) {
   try {
-    if (!program.dryRun) {
-      const res = shell.exec(cmd);
-      return res.code === 0;
+    if (program.dryRun) {
+      core.warning(`DRY-RUN: ${cmd}`);
+      return true;
     }
-    shell.echo(`DRY-RUN: ${cmd}`);
+
+    core.startGroup(cmd);
+    const res = shell.exec(cmd);
+    if (res.code === 0) {
+      return true;
+    }
+
+    if (
+      ignores.length &&
+      ignores.some(s => res.stdout.includes(s) || res.stderr.includes(s))
+    ) {
+      core.warning(`Ignoring code: ${res.code}`);
+      return true;
+    }
+
+    core.warning(`Failed with code: ${res.code}`);
+    return false;
   } catch (e) {
-    shell.echo(e.toString());
+    core.error(e.toString());
     return false;
+  } finally {
+    core.endGroup(cmd);
   }
-  return true;
 }
diff --git a/tools/verify.mjs b/tools/verify.mjs
index ebc9a62f544e3d7d85479e7563be2be265577916..4e2730a41481413b7dd30143931b8c84c719ca5b 100644
--- a/tools/verify.mjs
+++ b/tools/verify.mjs
@@ -1,8 +1,14 @@
-import shell from 'shelljs';
+import core from '@actions/core';
+import exec from '@actions/exec';
 
-shell.echo(`Verifying ...`);
-
-const res = shell.exec(`npm whoami`);
-if (res.code !== 0) {
-  shell.exit(2);
-}
+core.info(`Verifying ...`);
+(async () => {
+  try {
+    core.groupStart('npm whoami');
+    await exec.exec(`npm`, ['whoami']);
+  } catch (e) {
+    core.setFailed('npm auth error');
+  } finally {
+    core.endGroup('npm whoami');
+  }
+})();
diff --git a/yarn.lock b/yarn.lock
index 0ccee78b3b619c744cb6109171b8f97c26ad4742..f875942541a7219db67b6967fc26aeaf65bbfa5a 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,6 +2,23 @@
 # yarn lockfile v1
 
 
+"@actions/core@1.2.3":
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.2.3.tgz#e844b4fa0820e206075445079130868f95bfca95"
+  integrity sha512-Wp4xnyokakM45Uuj4WLUxdsa8fJjKVl1fDTsPbTEcTcuu0Nb26IPQbOtjmnfaCPGcaoPOOqId8H9NapZ8gii4w==
+
+"@actions/exec@1.0.3":
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/@actions/exec/-/exec-1.0.3.tgz#b967f8700d6ff011dcc91243b58bafc1bb9ab95f"
+  integrity sha512-TogJGnueOmM7ntCi0ASTUj4LapRRtDfj57Ja4IhPmg2fls28uVOPbAn8N+JifaOumN2UG3oEO/Ixek2A4NcYSA==
+  dependencies:
+    "@actions/io" "^1.0.1"
+
+"@actions/io@^1.0.1":
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/@actions/io/-/io-1.0.2.tgz#2f614b6e69ce14d191180451eb38e6576a6e6b27"
+  integrity sha512-J8KuFqVPr3p6U8W93DOXlXW6zFvrQAJANdS+vw0YhusLIq+bszW8zmK2Fh1C2kDPX8FMvwIl1OUcFgvJoXLbAg==
+
 "@babel/cli@7.8.4":
   version "7.8.4"
   resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.8.4.tgz#505fb053721a98777b2b175323ea4f090b7d3c1c"
@@ -3078,7 +3095,7 @@ debug@^3.1.0, debug@^3.2.6:
   dependencies:
     ms "^2.1.1"
 
-debuglog@*, debuglog@^1.0.1:
+debuglog@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492"
   integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=
@@ -4658,7 +4675,7 @@ import-local@^3.0.2:
     pkg-dir "^4.2.0"
     resolve-cwd "^3.0.0"
 
-imurmurhash@*, imurmurhash@^0.1.4:
+imurmurhash@^0.1.4:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
   integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
@@ -5962,11 +5979,6 @@ lockfile@^1.0.4:
   dependencies:
     signal-exit "^3.0.2"
 
-lodash._baseindexof@*:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c"
-  integrity sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw=
-
 lodash._baseuniq@~4.6.0:
   version "4.6.0"
   resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8"
@@ -5975,33 +5987,11 @@ lodash._baseuniq@~4.6.0:
     lodash._createset "~4.0.0"
     lodash._root "~3.0.0"
 
-lodash._bindcallback@*:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e"
-  integrity sha1-5THCdkTPi1epnhftlbNcdIeJOS4=
-
-lodash._cacheindexof@*:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92"
-  integrity sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI=
-
-lodash._createcache@*:
-  version "3.1.2"
-  resolved "https://registry.yarnpkg.com/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093"
-  integrity sha1-VtagZAF2JeeevKa4AY4XRAvc8JM=
-  dependencies:
-    lodash._getnative "^3.0.0"
-
 lodash._createset@~4.0.0:
   version "4.0.3"
   resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26"
   integrity sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY=
 
-lodash._getnative@*, lodash._getnative@^3.0.0:
-  version "3.9.1"
-  resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
-  integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=
-
 lodash._reinterpolate@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
@@ -6047,11 +6037,6 @@ lodash.isstring@^4.0.1:
   resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451"
   integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=
 
-lodash.restparam@*:
-  version "3.6.1"
-  resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
-  integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=
-
 lodash.sortby@^4.7.0:
   version "4.7.0"
   resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
@@ -6977,7 +6962,6 @@ npm@6.14.3, npm@^6.10.3:
     cmd-shim "^3.0.3"
     columnify "~1.5.4"
     config-chain "^1.1.12"
-    debuglog "*"
     detect-indent "~5.0.0"
     detect-newline "^2.1.0"
     dezalgo "~1.0.3"
@@ -6992,7 +6976,6 @@ npm@6.14.3, npm@^6.10.3:
     has-unicode "~2.0.1"
     hosted-git-info "^2.8.8"
     iferr "^1.0.2"
-    imurmurhash "*"
     infer-owner "^1.0.4"
     inflight "~1.0.6"
     inherits "^2.0.4"
@@ -7011,14 +6994,8 @@ npm@6.14.3, npm@^6.10.3:
     libnpx "^10.2.2"
     lock-verify "^2.1.0"
     lockfile "^1.0.4"
-    lodash._baseindexof "*"
     lodash._baseuniq "~4.6.0"
-    lodash._bindcallback "*"
-    lodash._cacheindexof "*"
-    lodash._createcache "*"
-    lodash._getnative "*"
     lodash.clonedeep "~4.5.0"
-    lodash.restparam "*"
     lodash.union "~4.6.0"
     lodash.uniq "~4.5.0"
     lodash.without "~4.4.0"