diff --git a/lib/manager/gradle-wrapper/__fixtures__/wrongCmd/gradlew b/lib/manager/gradle-wrapper/__fixtures__/wrongCmd/gradlew
new file mode 100644
index 0000000000000000000000000000000000000000..73a26d8df990a3db9ab97a7d0dd1939c61d10060
--- /dev/null
+++ b/lib/manager/gradle-wrapper/__fixtures__/wrongCmd/gradlew
@@ -0,0 +1,3 @@
+#!/bin/bash
+echo 'failed' >&2
+exit 1
diff --git a/lib/manager/gradle-wrapper/__fixtures__/wrongCmd/gradlew.bat b/lib/manager/gradle-wrapper/__fixtures__/wrongCmd/gradlew.bat
new file mode 100644
index 0000000000000000000000000000000000000000..d164ab603573ac2cc40f376c961035e5031d538e
--- /dev/null
+++ b/lib/manager/gradle-wrapper/__fixtures__/wrongCmd/gradlew.bat
@@ -0,0 +1,2 @@
+echo "failed" >&2
+exit 1
diff --git a/lib/manager/gradle-wrapper/artifacts.spec.ts b/lib/manager/gradle-wrapper/artifacts.spec.ts
index 2b89c6543590d28b15c461cd55aa378af4179833..bdd5b125262f616672b079d23b9bd6414a99d166 100644
--- a/lib/manager/gradle-wrapper/artifacts.spec.ts
+++ b/lib/manager/gradle-wrapper/artifacts.spec.ts
@@ -38,21 +38,21 @@ function compareFile(file: string, path: string) {
 }
 
 describe(getName(__filename), () => {
-  beforeEach(async () => {
-    jest.setTimeout(5 * 60 * 1000);
-    jest.resetAllMocks();
-    await setUtilConfig(config);
-    httpMock.setup();
-    runCache.clear();
-  });
+  ifSystemSupportsGradle(6).describe('real tests', () => {
+    beforeEach(async () => {
+      jest.setTimeout(5 * 60 * 1000);
+      jest.resetAllMocks();
+      await setUtilConfig(config);
+      httpMock.setup();
+      runCache.clear();
+    });
 
-  afterEach(async () => {
-    await Git(config.localDir)?.checkout(['--', '.']);
-    httpMock.reset();
-  });
+    afterEach(async () => {
+      await Git(config.localDir)?.checkout(['--', '.']);
+      httpMock.reset();
+    });
 
-  describe('updateArtifacts - replaces existing value', () => {
-    ifSystemSupportsGradle(6).it('replaces existing value', async () => {
+    it('replaces existing value', async () => {
       platform.getRepoStatus.mockResolvedValue({
         modified: [
           'gradle/wrapper/gradle-wrapper.properties',
@@ -97,7 +97,7 @@ describe(getName(__filename), () => {
       });
     });
 
-    ifSystemSupportsGradle(6).it('updates from version', async () => {
+    it('updates from version', async () => {
       platform.getRepoStatus.mockResolvedValueOnce(
         partial<Git.StatusResult>({
           modified: ['gradle/wrapper/gradle-wrapper.properties'],
@@ -116,10 +116,8 @@ describe(getName(__filename), () => {
 
       compareFile('gradle/wrapper/gradle-wrapper.properties', 'expectedFiles');
     });
-  });
 
-  describe('updateArtifacts - up to date', () => {
-    ifSystemSupportsGradle(6).it('up to date', async () => {
+    it('up to date', async () => {
       platform.getRepoStatus.mockResolvedValue({
         modified: [],
       } as Git.StatusResult);
@@ -142,9 +140,8 @@ describe(getName(__filename), () => {
         compareFile(file, 'testFiles-copy');
       });
     });
-  });
-  describe('updateArtifacts - error handling - getRepoStatus', () => {
-    ifSystemSupportsGradle(6).it('error handling - getRepoStatus', async () => {
+
+    it('getRepoStatus fails', async () => {
       platform.getRepoStatus.mockImplementation(() => {
         throw new Error('failed');
       });
@@ -168,38 +165,46 @@ describe(getName(__filename), () => {
         compareFile(file, 'testFiles-copy');
       });
     });
-  });
-  describe('updateArtifacts - error handling - command execution', () => {
-    ifSystemSupportsGradle(6).it(
-      'error handling - command execution',
-      async () => {
-        const res = await dcUpdate.updateArtifacts({
-          packageFileName: 'gradle-wrapper.properties',
-          updatedDeps: [],
-          newPackageFileContent: await readString(
-            `./testFiles/gradle/wrapper/gradle-wrapper.properties`
-          ),
-          config: {
-            localDir: 'some/incorrect/path',
-          },
-        });
 
-        expect(res[0].artifactError.lockFile).toEqual(
-          'gradle-wrapper.properties'
-        );
-        expect(res[0].artifactError.stderr).not.toBeNull();
-        expect(res[0].artifactError.stderr).not.toEqual('');
-
-        // 5.6.4 => 5.6.4 (updates execs) - unexpected behavior (looks like a bug in Gradle)
-        ['gradle/wrapper/gradle-wrapper.properties'].forEach((file) => {
-          compareFile(file, 'testFiles-copy');
-        });
-      }
-    );
-  });
+    it('gradlew failed', async () => {
+      const cfg = { ...config, localDir: resolve(fixtures, './wrongCmd') };
 
-  describe('updateArtifacts - distributionSha256Sum', () => {
-    ifSystemSupportsGradle(6).it('updates', async () => {
+      await setUtilConfig(cfg);
+      const res = await dcUpdate.updateArtifacts({
+        packageFileName: 'gradle-wrapper.properties',
+        updatedDeps: [],
+        newPackageFileContent: await readString(
+          `./testFiles/gradle/wrapper/gradle-wrapper.properties`
+        ),
+        config: cfg,
+      });
+
+      expect(res[0].artifactError.lockFile).toEqual(
+        'gradle-wrapper.properties'
+      );
+      expect(res[0].artifactError.stderr).not.toBeNull();
+      expect(res[0].artifactError.stderr).not.toEqual('');
+
+      // 5.6.4 => 5.6.4 (updates execs) - unexpected behavior (looks like a bug in Gradle)
+      ['gradle/wrapper/gradle-wrapper.properties'].forEach((file) => {
+        compareFile(file, 'testFiles-copy');
+      });
+    });
+
+    it('gradlew not found', async () => {
+      const res = await dcUpdate.updateArtifacts({
+        packageFileName: 'gradle-wrapper.properties',
+        updatedDeps: [],
+        newPackageFileContent: undefined,
+        config: {
+          localDir: 'some-dir',
+        },
+      });
+
+      expect(res).toBeNull();
+    });
+
+    it('updates distributionSha256Sum', async () => {
       httpMock
         .scope('https://services.gradle.org')
         .get('/distributions/gradle-6.3-bin.zip.sha256')
@@ -245,7 +250,7 @@ describe(getName(__filename), () => {
       ]);
     });
 
-    ifSystemSupportsGradle(6).it('artifact error', async () => {
+    it('distributionSha256Sum 404', async () => {
       httpMock
         .scope('https://services.gradle.org')
         .get('/distributions/gradle-6.3-bin.zip.sha256')
@@ -255,9 +260,7 @@ describe(getName(__filename), () => {
         packageFileName: 'gradle-wrapper.properties',
         updatedDeps: [],
         newPackageFileContent: `distributionSha256Sum=336b6898b491f6334502d8074a6b8c2d73ed83b92123106bd4bf837f04111043\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-6.3-bin.zip`,
-        config: {
-          localDir: 'some-dir',
-        },
+        config,
       });
 
       expect(result).toEqual([
diff --git a/lib/manager/gradle-wrapper/artifacts.ts b/lib/manager/gradle-wrapper/artifacts.ts
index 24ddca71f692020de9acdad343ff9a5ba0315269..df5aeedaa045869bcfb3e43cee969eea81784cff 100644
--- a/lib/manager/gradle-wrapper/artifacts.ts
+++ b/lib/manager/gradle-wrapper/artifacts.ts
@@ -61,6 +61,10 @@ export async function updateArtifacts({
       await fs.stat(gradlewPath).catch(() => null),
       `wrapper`
     );
+    if (!cmd) {
+      logger.info('No gradlew found - skipping Artifacts update');
+      return null;
+    }
     const distributionUrl = getDistributionUrl(newPackageFileContent);
     if (distributionUrl) {
       cmd += ` --gradle-distribution-url ${distributionUrl}`;
diff --git a/lib/manager/gradle/__testutil__/gradle.ts b/lib/manager/gradle/__testutil__/gradle.ts
index 68256dca6bc2bb4ba7b032abc3308616c7f14018..63e603c27fc2209616c343e4a1a481b81580900f 100644
--- a/lib/manager/gradle/__testutil__/gradle.ts
+++ b/lib/manager/gradle/__testutil__/gradle.ts
@@ -80,6 +80,12 @@ class WithGradle {
   get it(): jest.It {
     return !this.gradleSupportsThisJavaVersion || skipJava ? it.skip : it;
   }
+
+  get describe(): jest.Describe {
+    return !this.gradleSupportsThisJavaVersion || skipJava
+      ? describe.skip
+      : describe;
+  }
 }
 
 export function ifSystemSupportsGradle(gradleVersion: number): WithGradle {