diff --git a/.github/renovate.json b/.github/renovate.json index a79eafa1e29..c6263de8e61 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -28,6 +28,28 @@ "description": "Use ci semantic type for some deps", "matchFileNames": [".github/workflows/**"], "semanticCommitType": "ci" + }, + { + "description": "Don't require approval for renovate", + "matchDepNames": [ + "ghcr.io/renovatebot/renovate", + "renovatebot/github-action" + ], + "dependencyDashboardApproval": false + }, + { + "description": "Don't pin renovate updates", + "matchDepNames": ["ghcr.io/renovatebot/renovate"], + "matchFileNames": ["action.yml", "src/docker.ts"], + "pinDigests": false + }, + { + "description": "Use feat! semantic type for renovate major", + "matchDepNames": ["ghcr.io/renovatebot/renovate"], + "matchFileNames": ["action.yml", "src/docker.ts"], + "matchUpdateTypes": ["major"], + "commitMessagePrefix": "feat(deps)!:", + "additionalBranchPrefix": "renovate-major" } ], "customManagers": [ @@ -46,6 +68,22 @@ "matchStrings": ["renovate-version: (?[^\\s]+)"], "depNameTemplate": "ghcr.io/renovatebot/renovate", "datasourceTemplate": "docker" + }, + { + "description": "Update renovate version in action.yml", + "customType": "regex", + "fileMatch": ["^action\\.yml$"], + "matchStrings": ["default: '(?[^\\s]+)' # renovate"], + "depNameTemplate": "ghcr.io/renovatebot/renovate", + "datasourceTemplate": "docker" + }, + { + "description": "Update renovate version in src/docker.ts", + "customType": "regex", + "fileMatch": ["^src/docker\\.ts$"], + "matchStrings": ["version = '(?[^\\s]+)'; // renovate"], + "depNameTemplate": "ghcr.io/renovatebot/renovate", + "datasourceTemplate": "docker" } ] } diff --git a/README.md b/README.md index e035caf043b..ea7d7058607 100644 --- a/README.md +++ b/README.md @@ -132,7 +132,7 @@ image as root, do some customization and switch back to a unprivileged user. Specify volume mounts. Defaults to `/tmp:/tmp`. The volume mounts are separated through `;`. -This sample will mount `/tmp:/tmp`, `/home:/home` and `/foo:/bar`. +This sample will mount `/tmp:/tmp` and `/foo:/bar`. ```yml .... @@ -148,7 +148,6 @@ jobs: token: ${{ secrets.RENOVATE_TOKEN }} docker-volumes: | /tmp:/tmp ; - /home:/home ; /foo:/bar ``` diff --git a/action.yml b/action.yml index d2e274ecc48..46a26f1bf8f 100644 --- a/action.yml +++ b/action.yml @@ -23,13 +23,14 @@ inputs: required: false renovate-version: description: | - Renovate version to use. Defaults to latest. + Renovate version to use. required: false + default: 'latest' renovate-image: description: | Renovate docker image name. - Defaults to `ghcr.io/renovatebot/renovate`. required: false + default: ghcr.io/renovatebot/renovate mount-docker-socket: description: | Mount the Docker socket inside the renovate container so that the commands diff --git a/src/docker.ts b/src/docker.ts index 37a66da568f..c181a72d73e 100644 --- a/src/docker.ts +++ b/src/docker.ts @@ -1,21 +1,31 @@ import type { Input } from './input'; +import { warning } from '@actions/core'; -class Docker { +export class Docker { private static readonly image = 'ghcr.io/renovatebot/renovate'; + private static readonly version = 'latest'; private readonly dockerImage: string; private readonly fullTag: string; constructor(input: Input) { - const tag = input.getVersion(); + let image = input.getDockerImage(); + let version = input.getVersion(); - this.dockerImage = input.getDockerImage() ?? Docker.image; - this.fullTag = tag ?? 'latest'; + if (!image) { + warning(`No Docker image specified, using ${Docker.image}`); + image = Docker.image; + } + if (!version) { + warning(`No Docker version specified, using ${Docker.version}`); + version = Docker.version; + } + + this.dockerImage = image; + this.fullTag = version; } image(): string { return `${this.dockerImage}:${this.fullTag}`; } } - -export default Docker; diff --git a/src/index.ts b/src/index.ts index fd8e6e87325..20f156b92ab 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,6 @@ -import * as core from '@actions/core'; -import Input from './input'; -import Renovate from './renovate'; +import { Input } from './input'; +import { Renovate } from './renovate'; +import { setFailed } from '@actions/core'; async function run(): Promise { try { @@ -10,7 +10,7 @@ async function run(): Promise { await renovate.runDockerContainer(); } catch (error) { console.error(error); - core.setFailed(error as Error); + setFailed(error as Error); } } diff --git a/src/input.ts b/src/input.ts index 3b8c8791731..ec0176c04f6 100644 --- a/src/input.ts +++ b/src/input.ts @@ -1,12 +1,12 @@ -import * as core from '@actions/core'; +import { getInput } from '@actions/core'; import path from 'path'; -interface EnvironmentVariable { +export interface EnvironmentVariable { key: string; value: string; } -class Input { +export class Input { readonly options = { envRegex: /^(?:RENOVATE_\w+|LOG_LEVEL|GITHUB_COM_TOKEN|NODE_OPTIONS|(?:HTTPS?|NO)_PROXY|(?:https?|no)_proxy)$/, @@ -27,7 +27,7 @@ class Input { private readonly _configurationFile: Readonly; constructor() { - const envRegexInput = core.getInput('env-regex'); + const envRegexInput = getInput('env-regex'); const envRegex = envRegexInput ? new RegExp(envRegexInput) : this.options.envRegex; @@ -61,41 +61,39 @@ class Input { } getDockerImage(): string | null { - return core.getInput('renovate-image') || null; + return getInput('renovate-image') || null; } getVersion(): string | null { - const version = core.getInput('renovate-version'); - return !!version && version !== '' ? version : null; + return getInput('renovate-version') || null; } mountDockerSocket(): boolean { - return core.getInput('mount-docker-socket') === 'true'; + return getInput('mount-docker-socket') === 'true'; } dockerSocketHostPath(): string { - return core.getInput('docker-socket-host-path') || '/var/run/docker.sock'; + return getInput('docker-socket-host-path') || '/var/run/docker.sock'; } getDockerCmdFile(): string | null { - const cmdFile = core.getInput('docker-cmd-file'); + const cmdFile = getInput('docker-cmd-file'); return !!cmdFile && cmdFile !== '' ? path.resolve(cmdFile) : null; } getDockerUser(): string | null { - return core.getInput('docker-user') || null; + return getInput('docker-user') || null; } getDockerVolumeMounts(): string[] { - return core - .getInput('docker-volumes') + return getInput('docker-volumes') .split(';') .map((v) => v.trim()) .filter((v) => !!v); } getDockerNetwork(): string { - return core.getInput('docker-network'); + return getInput('docker-network'); } /** @@ -117,7 +115,7 @@ class Input { env: string, optional: boolean, ): EnvironmentVariable { - const fromInput = core.getInput(input); + const fromInput = getInput(input); const fromEnv = this._environmentVariables.get(env); if (fromInput === '' && fromEnv === undefined && !optional) { @@ -136,6 +134,3 @@ class Input { return { key: env, value: fromEnv !== undefined ? fromEnv : '' }; } } - -export default Input; -export { EnvironmentVariable, Input }; diff --git a/src/renovate.ts b/src/renovate.ts index 2edb32cc5cc..345504d1cd7 100644 --- a/src/renovate.ts +++ b/src/renovate.ts @@ -1,10 +1,10 @@ -import Docker from './docker'; +import { Docker } from './docker'; import { Input } from './input'; import { exec } from '@actions/exec'; import fs from 'fs/promises'; import path from 'path'; -class Renovate { +export class Renovate { static dockerGroupRegex = /^docker:x:(?[1-9][0-9]*):/m; private configFileMountDir = '/github-action'; @@ -126,5 +126,3 @@ class Renovate { } } } - -export default Renovate;