diff --git a/lib/datasource/cdnjs/index.ts b/lib/datasource/cdnjs/index.ts
index 8f3aa41dd2b51e018857759c5ea6409bb8dbf82f..7d356a5d9d973be7387d531dbe61b41fb0541c83 100644
--- a/lib/datasource/cdnjs/index.ts
+++ b/lib/datasource/cdnjs/index.ts
@@ -25,7 +25,7 @@ export class CdnJsDatasource extends Datasource {
     // Each library contains multiple assets, so we cache at the library level instead of per-asset
     const library = lookupName.split('/')[0];
     const url = `${registryUrl}libraries/${library}?fields=homepage,repository,assets`;
-    let result: ReleaseResult;
+    let result: ReleaseResult | null = null;
     try {
       const { assets, homepage, repository } = (
         await this.http.getJson<CdnjsResponse>(url)
@@ -36,7 +36,7 @@ export class CdnJsDatasource extends Datasource {
       const assetName = lookupName.replace(`${library}/`, '');
       const releases = assets
         .filter(({ files }) => files.includes(assetName))
-        .map(({ version, sri }) => ({ version, newDigest: sri[assetName] }));
+        .map(({ version, sri }) => ({ version, newDigest: sri?.[assetName] }));
 
       result = { releases };
 
@@ -52,6 +52,6 @@ export class CdnJsDatasource extends Datasource {
       }
       this.handleGenericErrors(err);
     }
-    return result || null;
+    return result;
   }
 }
diff --git a/lib/datasource/galaxy/index.ts b/lib/datasource/galaxy/index.ts
index a5fd5d9d86c9e401399ac0f3dddaf8ca54fe1cc7..e9e37f7a94c290e2f5c5569f563b9c2ad9fcf640 100644
--- a/lib/datasource/galaxy/index.ts
+++ b/lib/datasource/galaxy/index.ts
@@ -77,7 +77,7 @@ export class GalaxyDatasource extends Datasource {
     };
 
     result.dependencyUrl = galaxyProjectUrl;
-    const { github_user: user = null, github_repo: repo = null } = resultObject;
+    const { github_user: user, github_repo: repo } = resultObject;
     if (typeof user === 'string' && typeof repo === 'string') {
       result.sourceUrl = `https://github.com/${user}/${repo}`;
     }
diff --git a/lib/datasource/gitlab-tags/util.spec.ts b/lib/datasource/gitlab-tags/util.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..47f71de6f55f4e7999d96970052448783fe11a8d
--- /dev/null
+++ b/lib/datasource/gitlab-tags/util.spec.ts
@@ -0,0 +1,24 @@
+import { getDepHost, getSourceUrl } from './util';
+
+describe('datasource/gitlab-tags/util', () => {
+  describe('getDepHost', () => {
+    it('works', () => {
+      expect(getDepHost()).toBe('https://gitlab.com');
+      expect(getDepHost('https://gitlab.domain.test/api/v4')).toBe(
+        'https://gitlab.domain.test'
+      );
+      expect(getDepHost('https://domain.test/gitlab/api/v4')).toBe(
+        'https://domain.test/gitlab'
+      );
+    });
+  });
+
+  describe('getSourceUrl', () => {
+    it('works', () => {
+      expect(getSourceUrl('some/repo')).toBe('https://gitlab.com/some/repo');
+      expect(
+        getSourceUrl('some/repo', 'https://gitlab.domain.test/api/v4')
+      ).toBe('https://gitlab.domain.test/some/repo');
+    });
+  });
+});
diff --git a/lib/datasource/orb/__snapshots__/index.spec.ts.snap b/lib/datasource/orb/__snapshots__/index.spec.ts.snap
index 5cb24825d878962c79895bc38d46dff246b44653..34e723ee1f5a3ae2c83bb9e4ad728646dd1245a5 100644
--- a/lib/datasource/orb/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/orb/__snapshots__/index.spec.ts.snap
@@ -18,7 +18,6 @@ Object {
       "version": "4.1.0",
     },
     Object {
-      "releaseTimestamp": "2018-12-11T18:24:13.119Z",
       "version": "4.1.1",
     },
     Object {
@@ -105,7 +104,6 @@ Object {
       "version": "4.1.0",
     },
     Object {
-      "releaseTimestamp": "2018-12-11T18:24:13.119Z",
       "version": "4.1.1",
     },
     Object {
diff --git a/lib/datasource/orb/index.spec.ts b/lib/datasource/orb/index.spec.ts
index fa40d1bd2e9307236affa2a6ae230ca873766097..1cda5d482cc8d04dc3b3c5fc7e6e6d767cb9ca1c 100644
--- a/lib/datasource/orb/index.spec.ts
+++ b/lib/datasource/orb/index.spec.ts
@@ -14,7 +14,7 @@ const orbData = {
         { version: '4.1.4', createdAt: '2018-12-11T22:13:29.297Z' },
         { version: '4.1.3', createdAt: '2018-12-11T21:40:44.870Z' },
         { version: '4.1.2', createdAt: '2018-12-11T21:28:37.846Z' },
-        { version: '4.1.1', createdAt: '2018-12-11T18:24:13.119Z' },
+        { version: '4.1.1' },
         { version: '4.1.0', createdAt: '2018-12-11T18:14:41.116Z' },
         { version: '4.0.0', createdAt: '2018-12-11T17:41:26.595Z' },
         { version: '3.0.0', createdAt: '2018-12-11T05:28:14.080Z' },
@@ -94,7 +94,7 @@ describe('datasource/orb/index', () => {
         depName: 'hyper-expanse/library-release-workflows',
       });
       expect(res).toMatchSnapshot();
-      expect(res.homepage).toBe('https://google.com');
+      expect(res?.homepage).toBe('https://google.com');
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
   });
diff --git a/lib/manager/pip_setup/extract.spec.ts b/lib/manager/pip_setup/extract.spec.ts
index 14d5fa610436221e4ddff44d68b8d067860069b4..bed01de719de3d472e2ff78525d048943616aec6 100644
--- a/lib/manager/pip_setup/extract.spec.ts
+++ b/lib/manager/pip_setup/extract.spec.ts
@@ -35,5 +35,9 @@ describe('manager/pip_setup/extract', () => {
         ],
       });
     });
+
+    it('returns nothing', () => {
+      expect(extractPackageFile('', packageFile, config)).toBeNull();
+    });
   });
 });
diff --git a/lib/versioning/semver-coerced/index.spec.ts b/lib/versioning/semver-coerced/index.spec.ts
index 27418066798bc1bfe1b151c23e69e9e43a27b66a..e5ed201abe859d2417483fa27580e993b3fc14b4 100644
--- a/lib/versioning/semver-coerced/index.spec.ts
+++ b/lib/versioning/semver-coerced/index.spec.ts
@@ -14,6 +14,10 @@ describe('versioning/semver-coerced/index', () => {
     it('should return false for non-equal versions', () => {
       expect(semverCoerced.equals('2.0.1', '2.3.0')).toBeFalse();
     });
+
+    it('invalid version', () => {
+      expect(semverCoerced.equals('xxx', '1.2.3')).toBeFalse();
+    });
   });
 
   describe('.getMajor(input)', () => {
@@ -24,6 +28,10 @@ describe('versioning/semver-coerced/index', () => {
     it('should return major version number for non-strict semver', () => {
       expect(semverCoerced.getMajor('v3.1')).toBe(3);
     });
+
+    it('invalid version', () => {
+      expect(semverCoerced.getMajor('xxx')).toBeNull();
+    });
   });
 
   describe('.getMinor(input)', () => {
@@ -34,6 +42,10 @@ describe('versioning/semver-coerced/index', () => {
     it('should return minor version number for non-strict semver', () => {
       expect(semverCoerced.getMinor('v3.1')).toBe(1);
     });
+
+    it('invalid version', () => {
+      expect(semverCoerced.getMajor('xxx')).toBeNull();
+    });
   });
 
   describe('.getPatch(input)', () => {
@@ -44,133 +56,145 @@ describe('versioning/semver-coerced/index', () => {
     it('should return patch version number for non-strict semver', () => {
       expect(semverCoerced.getPatch('v3.1.2-foo')).toBe(2);
     });
+
+    it('invalid version', () => {
+      expect(semverCoerced.getMajor('xxx')).toBeNull();
+    });
   });
 
   describe('.isCompatible(input)', () => {
     it('should return true for strict semver', () => {
-      expect(semverCoerced.isCompatible('1.0.2')).toBeTruthy();
+      expect(semverCoerced.isCompatible('1.0.2')).toBeTrue();
     });
 
     it('should return true for non-strict semver', () => {
-      expect(semverCoerced.isCompatible('v3.1.2-foo')).toBeTruthy();
+      expect(semverCoerced.isCompatible('v3.1.2-foo')).toBeTrue();
     });
 
     it('should return false for non-semver', () => {
-      expect(semverCoerced.isCompatible('foo')).toBeFalsy();
+      expect(semverCoerced.isCompatible('foo')).toBeFalse();
     });
   });
 
   describe('.isGreaterThan(a, b)', () => {
     it('should return true for a greater version in strict semver', () => {
-      expect(semverCoerced.isGreaterThan('1.0.2', '1.0.0')).toBeTruthy();
+      expect(semverCoerced.isGreaterThan('1.0.2', '1.0.0')).toBeTrue();
     });
 
     it('should return false for lower version in strict semver', () => {
-      expect(semverCoerced.isGreaterThan('3.1.2', '4.1.0')).toBeFalsy();
+      expect(semverCoerced.isGreaterThan('3.1.2', '4.1.0')).toBeFalse();
     });
 
     it('should return false if version cannot be coerced', () => {
-      expect(semverCoerced.isGreaterThan('e.e.e', '4.1.0')).toBeFalsy();
+      expect(semverCoerced.isGreaterThan('e.e.e', '4.1.0')).toBeFalse();
     });
   });
 
   describe('.isLessThanRange(version, range)', () => {
     it('should return true for a lower version in strict semver', () => {
-      expect(semverCoerced.isLessThanRange?.('1.0.2', '~2.0')).toBeTruthy();
+      expect(semverCoerced.isLessThanRange?.('1.0.2', '~2.0')).toBeTrue();
     });
 
     it('should return false for in-range version in strict semver', () => {
-      expect(semverCoerced.isLessThanRange?.('3.0.2', '~3.0')).toBeFalsy();
+      expect(semverCoerced.isLessThanRange?.('3.0.2', '~3.0')).toBeFalse();
+    });
+
+    it('invalid version', () => {
+      expect(semverCoerced.isLessThanRange?.('xxx', '1.2.3')).toBeFalse();
     });
   });
 
   describe('.isSingleVersion()', () => {
     it('returns true if naked version', () => {
-      expect(semverCoerced.isSingleVersion('1.2.3')).toBeTruthy();
-      expect(semverCoerced.isSingleVersion('1.2.3-alpha.1')).toBeTruthy();
+      expect(semverCoerced.isSingleVersion('1.2.3')).toBeTrue();
+      expect(semverCoerced.isSingleVersion('1.2.3-alpha.1')).toBeTrue();
     });
 
     it('returns false if equals', () => {
-      expect(semverCoerced.isSingleVersion('=1.2.3')).toBeFalsy();
-      expect(semverCoerced.isSingleVersion('= 1.2.3')).toBeFalsy();
+      expect(semverCoerced.isSingleVersion('=1.2.3')).toBeFalse();
+      expect(semverCoerced.isSingleVersion('= 1.2.3')).toBeFalse();
     });
 
     it('returns false when not version', () => {
-      expect(semverCoerced.isSingleVersion('~1.0')).toBeFalsy();
+      expect(semverCoerced.isSingleVersion('~1.0')).toBeFalse();
     });
   });
 
   describe('.isStable(input)', () => {
     it('should return true for a stable version', () => {
-      expect(semverCoerced.isStable('1.0.0')).toBeTruthy();
+      expect(semverCoerced.isStable('1.0.0')).toBeTrue();
     });
 
     it('should return false for an prerelease version', () => {
-      expect(semverCoerced.isStable('v1.0-alpha')).toBeFalsy();
+      expect(semverCoerced.isStable('v1.0-alpha')).toBeFalse();
     });
   });
 
   describe('.isValid(input)', () => {
     it('should return null for non-digit version strings', () => {
-      expect(semverCoerced.isValid('version two')).toBeFalsy();
+      expect(semverCoerced.isValid('version two')).toBeFalse();
     });
 
     it('should return null for irregular version strings', () => {
-      expect(semverCoerced.isValid('17.04.0')).toBeFalsy();
+      expect(semverCoerced.isValid('17.04.0')).toBeFalse();
     });
 
     it('should support strict semver', () => {
-      expect(semverCoerced.isValid('1.2.3')).toBeTruthy();
+      expect(semverCoerced.isValid('1.2.3')).toBeTrue();
     });
 
     it('should treat semver with dash as a valid version', () => {
-      expect(semverCoerced.isValid('1.2.3-foo')).toBeTruthy();
+      expect(semverCoerced.isValid('1.2.3-foo')).toBeTrue();
     });
 
     it('should treat semver without dash as a valid version', () => {
-      expect(semverCoerced.isValid('1.2.3foo')).toBeTruthy();
+      expect(semverCoerced.isValid('1.2.3foo')).toBeTrue();
     });
 
     it('should treat ranges as valid versions', () => {
-      expect(semverCoerced.isValid('~1.2.3')).toBeTruthy();
-      expect(semverCoerced.isValid('^1.2.3')).toBeTruthy();
-      expect(semverCoerced.isValid('>1.2.3')).toBeTruthy();
+      expect(semverCoerced.isValid('~1.2.3')).toBeTrue();
+      expect(semverCoerced.isValid('^1.2.3')).toBeTrue();
+      expect(semverCoerced.isValid('>1.2.3')).toBeTrue();
     });
 
     it('should reject github repositories', () => {
-      expect(semverCoerced.isValid('renovatebot/renovate')).toBeFalsy();
-      expect(semverCoerced.isValid('renovatebot/renovate#master')).toBeFalsy();
+      expect(semverCoerced.isValid('renovatebot/renovate')).toBeFalse();
+      expect(semverCoerced.isValid('renovatebot/renovate#master')).toBeFalse();
       expect(
         semverCoerced.isValid('https://github.com/renovatebot/renovate.git')
-      ).toBeFalsy();
+      ).toBeFalse();
     });
   });
 
   describe('.isVersion(input)', () => {
     it('should return null for non-digit versions', () => {
-      expect(semverCoerced.isValid('version one')).toBeFalsy();
+      expect(semverCoerced.isValid('version one')).toBeFalse();
     });
 
     it('should support strict semver versions', () => {
-      expect(semverCoerced.isValid('1.2.3')).toBeTruthy();
+      expect(semverCoerced.isValid('1.2.3')).toBeTrue();
     });
 
     it('should support non-strict versions', () => {
-      expect(semverCoerced.isValid('v1.2')).toBeTruthy();
+      expect(semverCoerced.isValid('v1.2')).toBeTrue();
     });
   });
 
   describe('.matches(version, range)', () => {
     it('should return true when version is in range', () => {
-      expect(semverCoerced.matches('1.0.0', '1.0.0 || 1.0.1')).toBeTruthy();
+      expect(semverCoerced.matches('1.0.0', '1.0.0 || 1.0.1')).toBeTrue();
     });
 
     it('should return true with non-strict version in range', () => {
-      expect(semverCoerced.matches('v1.0', '1.0.0 || 1.0.1')).toBeTruthy();
+      expect(semverCoerced.matches('v1.0', '1.0.0 || 1.0.1')).toBeTrue();
     });
 
     it('should return false when version is not in range', () => {
-      expect(semverCoerced.matches('1.2.3', '1.4.1 || 1.4.2')).toBeFalsy();
+      expect(semverCoerced.matches('1.2.3', '1.4.1 || 1.4.2')).toBeFalse();
+    });
+
+    it('invalid version', () => {
+      expect(semverCoerced.matches('xxx', '1.2.3')).toBe(false);
     });
   });
 
@@ -231,5 +255,9 @@ describe('versioning/semver-coerced/index', () => {
     it('should return zero for equal non-strict versions', () => {
       expect(semverCoerced.sortVersions('v1.0', '1.x')).toBe(0);
     });
+
+    it('works with invalid version', () => {
+      expect(semverCoerced.sortVersions('v1.0', 'xx')).toBe(0);
+    });
   });
 });
diff --git a/lib/versioning/ubuntu/index.spec.ts b/lib/versioning/ubuntu/index.spec.ts
index 99812ccdfb7156e231bbabd9558f52dc999c67e0..0b1a5d6aca82bcb23a00e4a3d12d2c09b663f46f 100644
--- a/lib/versioning/ubuntu/index.spec.ts
+++ b/lib/versioning/ubuntu/index.spec.ts
@@ -197,6 +197,7 @@ describe('versioning/ubuntu/index', () => {
     ${'16.04.7'} | ${'16.04.1'} | ${true}
     ${'19.10.1'} | ${'20.04.1'} | ${false}
     ${'20.04.1'} | ${'19.10.1'} | ${true}
+    ${'xxx'}     | ${'yyy'}     | ${false}
   `('isGreaterThan("$a", "$b") === $expected', ({ a, b, expected }) => {
     expect(ubuntu.isGreaterThan(a, b)).toBe(expected);
   });
diff --git a/lib/versioning/ubuntu/index.ts b/lib/versioning/ubuntu/index.ts
index 0bce4216a5c52f6fb66c318e9f09187e33289cff..1f4082369389bd5fb1ca1d5e25c9caa4093c9c6b 100644
--- a/lib/versioning/ubuntu/index.ts
+++ b/lib/versioning/ubuntu/index.ts
@@ -44,7 +44,7 @@ function isStable(version: string): boolean {
 
 function getMajor(version: string): null | number {
   if (isValid(version)) {
-    const [major] = version.split('.') || [];
+    const [major] = version.split('.');
     return parseInt(major, 10);
   }
   return null;
@@ -52,7 +52,7 @@ function getMajor(version: string): null | number {
 
 function getMinor(version: string): null | number {
   if (isValid(version)) {
-    const [, minor] = version.split('.') || [];
+    const [, minor] = version.split('.');
     return parseInt(minor, 10);
   }
   return null;
@@ -60,7 +60,7 @@ function getMinor(version: string): null | number {
 
 function getPatch(version: string): null | number {
   if (isValid(version)) {
-    const [, , patch] = version.split('.') || [];
+    const [, , patch] = version.split('.');
     return patch ? parseInt(patch, 10) : null;
   }
   return null;