From 932573deaa823091b5bb3b4188e96527d3ab0138 Mon Sep 17 00:00:00 2001 From: Nikola Date: Thu, 20 May 2021 09:11:51 +0200 Subject: [PATCH 01/31] Add github cleanup action --- .github/workflows/test.yaml | 20 +++++ .gitignore | 11 +++ package.json | 28 ++++++ src/action.yaml | 25 ++++++ src/index.ts | 103 ++++++++++++++++++++++ src/types.ts | 20 +++++ tsconfig.json | 29 +++++++ yarn.lock | 168 ++++++++++++++++++++++++++++++++++++ 8 files changed, 404 insertions(+) create mode 100644 .github/workflows/test.yaml create mode 100644 .gitignore create mode 100644 package.json create mode 100644 src/action.yaml create mode 100644 src/index.ts create mode 100644 src/types.ts create mode 100644 tsconfig.json create mode 100644 yarn.lock diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml new file mode 100644 index 0000000..a282b81 --- /dev/null +++ b/.github/workflows/test.yaml @@ -0,0 +1,20 @@ +name: Test action + +on: + pull_request: + branches: + - 'master' + +jobs: + test: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Login to GitHub + uses: docker/login-action@v1 + with: + registry: ghcr.io + username: ${{ secrets.CR_USER }} + password: ${{ secrets.CR_PAT }} + - run: yarn run build diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4560807 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +.idea/ +.vscode/ +node_modules/ +build/ +tmp/ +temp/ +.env +*.log +dist +.nyc_output +coverage diff --git a/package.json b/package.json new file mode 100644 index 0000000..b8bb33b --- /dev/null +++ b/package.json @@ -0,0 +1,28 @@ +{ + "name": "github-packages-cleanup", + "version": "1.0.0", + "description": "TypeScript github action for github packages cleanup", + "main": "dist/index.js", + "author": { + "name": "NodeFactory", + "email": "info@nodefactory.io" + }, + "license": "MIT", + "private": false, + "repository": { + "type": "git", + "url": "git+https://git@github.com:nodefactoryio/github-packages-cleanup.git" + }, + "scripts": { + "build": "ncc build src/index.ts" + }, + "dependencies": { + "@actions/core": "^1.2.7", + "@actions/github": "^4.0.0" + }, + "devDependencies": { + "@types/node": "^15.0.2", + "@vercel/ncc": "^0.28.5", + "typescript": "^4.2.4" + } +} diff --git a/src/action.yaml b/src/action.yaml new file mode 100644 index 0000000..b9d5ea5 --- /dev/null +++ b/src/action.yaml @@ -0,0 +1,25 @@ +name: 'github packages cleanup' +author: 'NodeFactory' +description: 'github packages cleanup from the github package registry' +inputs: + excluded_versions: + description: 'allows to exclude certain versions, eg. x.y.z, stable, beta, latest,...' + required: true + num_versions_to_keep: + description: 'number of most recent versions to keep (excluded versions aren't included into count' + required: true + package_name: + description: 'name of github package' + required: true + token: + description: 'github auth token' + required: true + username: + description: 'github username' + required: false + organisation: + description: 'github organisation' + required: false +runs: + using: 'node14' + main: 'dist/index.js' diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..396528d --- /dev/null +++ b/src/index.ts @@ -0,0 +1,103 @@ +import { getInput, setFailed } from "@actions/core"; +import { getOctokit } from "@actions/github"; +import { OctokitResponse } from "@octokit/types" +import { FetchPackagesResponse } from "./types"; + +const excludedVersion = getInput('excluded_versions', { required: true }); +const numberOfVersionsToKeep = Number(getInput('num_versions_to_keep', { required: true })); +const packageName = getInput('package_name', { required: true }); +const token = getInput('token', { required: true }); +const username = getInput('username'); +const organisation = getInput('organisation'); + + +const octokit = getOctokit(token); + +async function main() { + // delete packages with token auth + if (token && !username && !organisation) { + const fetchedPackages = await getAuthUserPackageVersions(); + const packagesToDelete = filterOutPackages(fetchedPackages); + packagesToDelete.forEach(element => { + deleteAuthUserPackageVersions(element!.id) + }); + // delete user packages + } else if (token && username && !organisation) { + const fetchedPackages = await getUserPackageVersions(); + const packagesToDelete = filterOutPackages(fetchedPackages); + packagesToDelete.forEach(element => { + deleteUserPackageVersions(element!.id) + }); + // delete organisation packages + } else if (token && !username && organisation) { + const fetchedPackages = await getOrganisationPackageVersions(); + const packagesToDelete = filterOutPackages(fetchedPackages); + packagesToDelete.forEach(element => { + deleteOrganisationPackageVersions(element!.id) + }); + } else { + setFailed("Failed to fetch packages"); + } +} + +async function getAuthUserPackageVersions(): Promise> { + return await octokit.request('GET /user/packages/{package_type}/{package_name}/versions', { + package_type: 'container', + package_name: packageName, + }); +} + +async function deleteAuthUserPackageVersions(packageId: number): Promise> { + return await octokit.request('DELETE /user/packages/{package_type}/{package_name}/versions/{package_version_id}', { + package_type: 'container', + package_name: packageName, + package_version_id: packageId + }); +} + +async function getUserPackageVersions(): Promise> { + return await octokit.request('GET /users/{username}/packages/{package_type}/{package_name}/versions', { + package_type: 'container', + package_name: packageName, + username: username + }); +} + +async function deleteUserPackageVersions(packageId: number): Promise> { + return await octokit.request('DELETE /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}', { + package_type: 'container', + package_name: packageName, + username: username, + package_version_id: packageId + }); +} + +async function getOrganisationPackageVersions(): Promise> { + return await octokit.request('GET /orgs/{org}/packages/{package_type}/{package_name}/versions', { + package_type: 'container', + package_name: packageName, + org: organisation + }); +} + +async function deleteOrganisationPackageVersions(packageId: number): Promise> { + return await octokit.request('DELETE /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}', { + package_type: 'container', + package_name: packageName, + org: organisation, + package_version_id: packageId + }); +} + +function filterOutPackages(existingPackages: OctokitResponse): (FetchPackagesResponse | undefined)[] { + return existingPackages.data.map((item) => { + // find package versions matching regex + if (!item.metadata?.container?.tags[0]?.match(excludedVersion)) { + return item; + }; + }) + // filter out undefined values + .filter(item => item) + // packages for deletion - omitting last n values + .slice(0, length - numberOfVersionsToKeep); +} diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..7dd51c9 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,20 @@ +export type PackageType = "npm" | "docker" | "container" | "maven" | "rubygems" | "nuget"; + +export type FetchPackagesResponse = { + id: number; + name: string; + url: string; + package_html_url?: string; + html_url?: string; + license?: string; + description?: string; + created_at: string; + updated_at: string; + deleted_at?: string; + metadata?: { + package_type: PackageType; + container?: { + tags: Array + } + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..7264c5a --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "target": "es6", + "module": "commonjs", + "sourceMap": true, + "moduleResolution": "node", + "allowSyntheticDefaultImports": true, + "experimentalDecorators": true, + "esModuleInterop": true, + "emitDecoratorMetadata": true, + "strict": true, + "noImplicitAny": true, + "resolveJsonModule": true, + "typeRoots": [ + "./node_modules/@types", + "./@types" + ] + }, + "ts-node": { + "transpileOnly": true, + "files": true + }, + "include": [ + "src/**/*.ts", + ], + "exclude": [ + "node_modules" + ] +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..4e5878a --- /dev/null +++ b/yarn.lock @@ -0,0 +1,168 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@actions/core@^1.2.7": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.2.7.tgz#594f8c45b213f0146e4be7eda8ae5cf4e198e5ab" + integrity sha512-kzLFD5BgEvq6ubcxdgPbRKGD2Qrgya/5j+wh4LZzqT915I0V3rED+MvjH6NXghbvk1MXknpNNQ3uKjXSEN00Ig== + +"@actions/github@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@actions/github/-/github-4.0.0.tgz#d520483151a2bf5d2dc9cd0f20f9ac3a2e458816" + integrity sha512-Ej/Y2E+VV6sR9X7pWL5F3VgEWrABaT292DRqRU6R4hnQjPtC/zD3nagxVdXWiRQvYDh8kHXo7IDmG42eJ/dOMA== + dependencies: + "@actions/http-client" "^1.0.8" + "@octokit/core" "^3.0.0" + "@octokit/plugin-paginate-rest" "^2.2.3" + "@octokit/plugin-rest-endpoint-methods" "^4.0.0" + +"@actions/http-client@^1.0.8": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@actions/http-client/-/http-client-1.0.11.tgz#c58b12e9aa8b159ee39e7dd6cbd0e91d905633c0" + integrity sha512-VRYHGQV1rqnROJqdMvGUbY/Kn8vriQe/F9HR2AlYHzmKuM/p3kjNuXhmdBfcVgsvRWTz5C5XW5xvndZrVBuAYg== + dependencies: + tunnel "0.0.6" + +"@octokit/auth-token@^2.4.4": + version "2.4.5" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.5.tgz#568ccfb8cb46f36441fac094ce34f7a875b197f3" + integrity sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA== + dependencies: + "@octokit/types" "^6.0.3" + +"@octokit/core@^3.0.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.4.0.tgz#b48aa27d755b339fe7550548b340dcc2b513b742" + integrity sha512-6/vlKPP8NF17cgYXqucdshWqmMZGXkuvtcrWCgU5NOI0Pl2GjlmZyWgBMrU8zJ3v2MJlM6++CiB45VKYmhiWWg== + dependencies: + "@octokit/auth-token" "^2.4.4" + "@octokit/graphql" "^4.5.8" + "@octokit/request" "^5.4.12" + "@octokit/request-error" "^2.0.5" + "@octokit/types" "^6.0.3" + before-after-hook "^2.2.0" + universal-user-agent "^6.0.0" + +"@octokit/endpoint@^6.0.1": + version "6.0.11" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.11.tgz#082adc2aebca6dcefa1fb383f5efb3ed081949d1" + integrity sha512-fUIPpx+pZyoLW4GCs3yMnlj2LfoXTWDUVPTC4V3MUEKZm48W+XYpeWSZCv+vYF1ZABUm2CqnDVf1sFtIYrj7KQ== + dependencies: + "@octokit/types" "^6.0.3" + is-plain-object "^5.0.0" + universal-user-agent "^6.0.0" + +"@octokit/graphql@^4.5.8": + version "4.6.1" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.6.1.tgz#f975486a46c94b7dbe58a0ca751935edc7e32cc9" + integrity sha512-2lYlvf4YTDgZCTXTW4+OX+9WTLFtEUc6hGm4qM1nlZjzxj+arizM4aHWzBVBCxY9glh7GIs0WEuiSgbVzv8cmA== + dependencies: + "@octokit/request" "^5.3.0" + "@octokit/types" "^6.0.3" + universal-user-agent "^6.0.0" + +"@octokit/openapi-types@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-7.0.0.tgz#0f6992db9854af15eca77d71ab0ec7fad2f20411" + integrity sha512-gV/8DJhAL/04zjTI95a7FhQwS6jlEE0W/7xeYAzuArD0KVAVWDLP2f3vi98hs3HLTczxXdRK/mF0tRoQPpolEw== + +"@octokit/plugin-paginate-rest@^2.2.3": + version "2.13.3" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.13.3.tgz#f0f1792230805108762d87906fb02d573b9e070a" + integrity sha512-46lptzM9lTeSmIBt/sVP/FLSTPGx6DCzAdSX3PfeJ3mTf4h9sGC26WpaQzMEq/Z44cOcmx8VsOhO+uEgE3cjYg== + dependencies: + "@octokit/types" "^6.11.0" + +"@octokit/plugin-rest-endpoint-methods@^4.0.0": + version "4.15.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.15.1.tgz#91a064bee99d0ffcef74a04357e1cf15c27d1cd0" + integrity sha512-4gQg4ySoW7ktKB0Mf38fHzcSffVZd6mT5deJQtpqkuPuAqzlED5AJTeW8Uk7dPRn7KaOlWcXB0MedTFJU1j4qA== + dependencies: + "@octokit/types" "^6.13.0" + deprecation "^2.3.1" + +"@octokit/request-error@^2.0.0", "@octokit/request-error@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.5.tgz#72cc91edc870281ad583a42619256b380c600143" + integrity sha512-T/2wcCFyM7SkXzNoyVNWjyVlUwBvW3igM3Btr/eKYiPmucXTtkxt2RBsf6gn3LTzaLSLTQtNmvg+dGsOxQrjZg== + dependencies: + "@octokit/types" "^6.0.3" + deprecation "^2.0.0" + once "^1.4.0" + +"@octokit/request@^5.3.0", "@octokit/request@^5.4.12": + version "5.4.15" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.15.tgz#829da413dc7dd3aa5e2cdbb1c7d0ebe1f146a128" + integrity sha512-6UnZfZzLwNhdLRreOtTkT9n57ZwulCve8q3IT/Z477vThu6snfdkBuhxnChpOKNGxcQ71ow561Qoa6uqLdPtag== + dependencies: + "@octokit/endpoint" "^6.0.1" + "@octokit/request-error" "^2.0.0" + "@octokit/types" "^6.7.1" + is-plain-object "^5.0.0" + node-fetch "^2.6.1" + universal-user-agent "^6.0.0" + +"@octokit/types@^6.0.3", "@octokit/types@^6.11.0", "@octokit/types@^6.13.0", "@octokit/types@^6.7.1": + version "6.14.2" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.14.2.tgz#64c9457f38fb8522bdbba3c8cc814590a2d61bf5" + integrity sha512-wiQtW9ZSy4OvgQ09iQOdyXYNN60GqjCL/UdMsepDr1Gr0QzpW6irIKbH3REuAHXAhxkEk9/F2a3Gcs1P6kW5jA== + dependencies: + "@octokit/openapi-types" "^7.0.0" + +"@types/node@^15.0.2": + version "15.0.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.0.2.tgz#51e9c0920d1b45936ea04341aa3e2e58d339fb67" + integrity sha512-p68+a+KoxpoB47015IeYZYRrdqMUcpbK8re/zpFB8Ld46LHC1lPEbp3EXgkEhAYEcPvjJF6ZO+869SQ0aH1dcA== + +"@vercel/ncc@^0.28.5": + version "0.28.5" + resolved "https://registry.yarnpkg.com/@vercel/ncc/-/ncc-0.28.5.tgz#6d735379f81b70b708a9c3d2196507b2a841824f" + integrity sha512-ZSwD4EDCon2EsnPZ2/Qcigx4N2DiuBLV/rDnF04giEPFuDeBeUDdnSTyYYfX8KNic/prrJuS1vUEmAOHmj+fRg== + +before-after-hook@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.1.tgz#73540563558687586b52ed217dad6a802ab1549c" + integrity sha512-/6FKxSTWoJdbsLDF8tdIjaRiFXiE6UHsEHE3OPI/cwPURCVi1ukP0gmLn7XWEiFk5TcwQjjY5PWsU+j+tgXgmw== + +deprecation@^2.0.0, deprecation@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" + integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== + +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + +node-fetch@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + +once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +tunnel@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" + integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== + +typescript@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.4.tgz#8610b59747de028fda898a8aef0e103f156d0961" + integrity sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg== + +universal-user-agent@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" + integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= From 35694e81765d9307a63753d4f18d96bd7fb93f28 Mon Sep 17 00:00:00 2001 From: Nikola Date: Thu, 20 May 2021 11:29:29 +0200 Subject: [PATCH 02/31] Update descriptions --- README.md | 2 +- package.json | 2 +- src/action.yaml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 21d0f9a..f948ba6 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # GitHub packages cleanup -GitHub action for deleting versions of a package from [GitHub Packages](https://github.com/features/packages). +GitHub action for ghcr images cleanup from [GitHub Packages](https://github.com/features/packages). ## Things that can be done * Delete a single version diff --git a/package.json b/package.json index b8bb33b..0d7746e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "github-packages-cleanup", "version": "1.0.0", - "description": "TypeScript github action for github packages cleanup", + "description": "TypeScript github action for ghcr images cleanup", "main": "dist/index.js", "author": { "name": "NodeFactory", diff --git a/src/action.yaml b/src/action.yaml index b9d5ea5..f3bc698 100644 --- a/src/action.yaml +++ b/src/action.yaml @@ -1,6 +1,6 @@ -name: 'github packages cleanup' +name: 'github ghcr images cleanup' author: 'NodeFactory' -description: 'github packages cleanup from the github package registry' +description: 'github ghcr images cleanup from the github package registry' inputs: excluded_versions: description: 'allows to exclude certain versions, eg. x.y.z, stable, beta, latest,...' From 668c190658ff68f0b5259c18fa786b06c10a1076 Mon Sep 17 00:00:00 2001 From: Nikola Date: Thu, 20 May 2021 11:43:42 +0200 Subject: [PATCH 03/31] Update test action --- .github/workflows/test.yaml | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index a282b81..3b935dc 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -3,18 +3,30 @@ name: Test action on: pull_request: branches: + - master - 'master' jobs: + release: + name: Release package + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Push docker image to GitHub Packages + uses: docker/build-push-action@v1 + with: + username: ${{ secrets.CR_USER }} + password: ${{ secrets.CR_WRITE_PAT }} + registry: ghcr.io + - run: yarn run build test: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - - name: Login to GitHub - uses: docker/login-action@v1 - with: - registry: ghcr.io - username: ${{ secrets.CR_USER }} - password: ${{ secrets.CR_PAT }} - - run: yarn run build + name: Test GitHub action + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Run cleanup action + with: + token: ${{ secrets.GITHUB_TOKEN }} + num_versions_to_keep: 1 From b08361fcb1795d779a5faed7c645653fafacabff Mon Sep 17 00:00:00 2001 From: Nikola Date: Fri, 21 May 2021 11:41:27 +0200 Subject: [PATCH 04/31] Fix action level --- .github/workflows/test.yaml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 3b935dc..ff2ff94 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -1,10 +1,8 @@ name: Test action on: - pull_request: - branches: - - master - - 'master' + branches: + - master jobs: release: From 2ada068a61944583193bf52df0f9e8e8e6252f5c Mon Sep 17 00:00:00 2001 From: Nikola Date: Fri, 21 May 2021 11:46:09 +0200 Subject: [PATCH 05/31] Fix indentation --- .github/workflows/test.yaml | 38 ++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index ff2ff94..c8d2b8f 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -7,24 +7,24 @@ on: jobs: release: name: Release package - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - - name: Push docker image to GitHub Packages - uses: docker/build-push-action@v1 - with: - username: ${{ secrets.CR_USER }} - password: ${{ secrets.CR_WRITE_PAT }} - registry: ghcr.io - - run: yarn run build + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Push docker image to GitHub Packages + uses: docker/build-push-action@v1 + with: + username: ${{ secrets.CR_USER }} + password: ${{ secrets.CR_WRITE_PAT }} + registry: ghcr.io + - run: yarn run build test: name: Test GitHub action - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - - name: Run cleanup action - with: - token: ${{ secrets.GITHUB_TOKEN }} - num_versions_to_keep: 1 + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Run cleanup action + with: + token: ${{ secrets.GITHUB_TOKEN }} + num_versions_to_keep: 1 From 5f428d395d7a17cec1bbc309c7852e50d07d110b Mon Sep 17 00:00:00 2001 From: Nikola Date: Fri, 21 May 2021 11:48:07 +0200 Subject: [PATCH 06/31] Fix indentation --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index c8d2b8f..c549389 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -2,7 +2,7 @@ name: Test action on: branches: - - master + - master jobs: release: From 681814c54bdfcbf0c16f07aef2d5782694497bf3 Mon Sep 17 00:00:00 2001 From: Nikola Date: Fri, 21 May 2021 12:00:02 +0200 Subject: [PATCH 07/31] Try to run action --- .github/workflows/test.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index c549389..bbc6ea3 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -1,8 +1,9 @@ name: Test action on: + pull_request: branches: - - master + - 'master' jobs: release: From 60eec8df58540a3dcc1c132251bb2fe081320c89 Mon Sep 17 00:00:00 2001 From: Nikola Date: Fri, 21 May 2021 12:01:48 +0200 Subject: [PATCH 08/31] Another try --- .github/workflows/test.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index bbc6ea3..3706acd 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -2,8 +2,8 @@ name: Test action on: pull_request: - branches: - - 'master' + branches: + - 'master' jobs: release: From b141791f7558650c7fb5cf005af05b94b5fd6ddd Mon Sep 17 00:00:00 2001 From: Nikola Date: Fri, 21 May 2021 12:03:35 +0200 Subject: [PATCH 09/31] Another try --- .github/workflows/test.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 3706acd..ad700f5 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -29,3 +29,4 @@ jobs: with: token: ${{ secrets.GITHUB_TOKEN }} num_versions_to_keep: 1 + - run: yarn run build From 91dc4d19ac7b173c3f99965bacef31f257dc60d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marin=20Petruni=C4=87?= Date: Mon, 24 May 2021 10:01:29 +0200 Subject: [PATCH 10/31] fix test ci --- .github/workflows/test.yaml | 30 ++++++++++++++++-------------- src/action.yaml => action.yaml | 0 2 files changed, 16 insertions(+), 14 deletions(-) rename src/action.yaml => action.yaml (100%) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index ad700f5..02e5962 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -1,32 +1,34 @@ name: Test action on: + push: + branches: + - 'master' + - 'feature/add-cleanup-actions' pull_request: branches: - 'master' jobs: - release: - name: Release package - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - - name: Push docker image to GitHub Packages - uses: docker/build-push-action@v1 - with: - username: ${{ secrets.CR_USER }} - password: ${{ secrets.CR_WRITE_PAT }} - registry: ghcr.io - - run: yarn run build test: name: Test GitHub action runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 + - name: Login to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + registry: ghcr.io + - name: tag hello world image + run: docker tag hello-world:latest ghcr.io/@nodefactory.io/github-packages-cleanup-sample:${{github.sha}} + - name: push hello world image + run: docker push ghcr.io/@nodefactory.io/github-packages-cleanup-sample:${{github.sha}} - name: Run cleanup action + uses: ./ with: token: ${{ secrets.GITHUB_TOKEN }} + package_name: github-packages-cleanup-sample num_versions_to_keep: 1 - - run: yarn run build diff --git a/src/action.yaml b/action.yaml similarity index 100% rename from src/action.yaml rename to action.yaml From 301ff596d888c3840094e56a06eee8634086778a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marin=20Petruni=C4=87?= Date: Mon, 24 May 2021 10:20:21 +0200 Subject: [PATCH 11/31] fix image name --- .github/workflows/test.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 02e5962..19aadf9 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -23,9 +23,9 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} registry: ghcr.io - name: tag hello world image - run: docker tag hello-world:latest ghcr.io/@nodefactory.io/github-packages-cleanup-sample:${{github.sha}} + run: docker tag hello-world:latest ghcr.io/nodefactoryio/github-packages-cleanup-sample:${{github.sha}} - name: push hello world image - run: docker push ghcr.io/@nodefactory.io/github-packages-cleanup-sample:${{github.sha}} + run: docker push ghcr.io/nodefactoryio/github-packages-cleanup-sample:${{github.sha}} - name: Run cleanup action uses: ./ with: From fa70d258f9f3129238fbb1212c1633585f945bec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marin=20Petruni=C4=87?= Date: Mon, 24 May 2021 10:24:08 +0200 Subject: [PATCH 12/31] fix image not pulling --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 19aadf9..9b2a375 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -23,7 +23,7 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} registry: ghcr.io - name: tag hello world image - run: docker tag hello-world:latest ghcr.io/nodefactoryio/github-packages-cleanup-sample:${{github.sha}} + run: docker pull hello-world:latest && docker tag hello-world:latest ghcr.io/nodefactoryio/github-packages-cleanup-sample:${{github.sha}} - name: push hello world image run: docker push ghcr.io/nodefactoryio/github-packages-cleanup-sample:${{github.sha}} - name: Run cleanup action From 2516d45f48f656b79c66d4edf27109a5e0eab923 Mon Sep 17 00:00:00 2001 From: Nikola Date: Tue, 25 May 2021 08:20:28 +0200 Subject: [PATCH 13/31] Don't require excluded versions --- action.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/action.yaml b/action.yaml index f3bc698..92d8f43 100644 --- a/action.yaml +++ b/action.yaml @@ -4,7 +4,7 @@ description: 'github ghcr images cleanup from the github package registry' inputs: excluded_versions: description: 'allows to exclude certain versions, eg. x.y.z, stable, beta, latest,...' - required: true + required: false num_versions_to_keep: description: 'number of most recent versions to keep (excluded versions aren't included into count' required: true From 06c8d385238ccf97adc81ef0bf414ecc945be5e3 Mon Sep 17 00:00:00 2001 From: Nikola Date: Mon, 31 May 2021 09:50:15 +0200 Subject: [PATCH 14/31] Use double quotes --- action.yaml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/action.yaml b/action.yaml index 92d8f43..45ead6d 100644 --- a/action.yaml +++ b/action.yaml @@ -1,25 +1,25 @@ -name: 'github ghcr images cleanup' -author: 'NodeFactory' -description: 'github ghcr images cleanup from the github package registry' +name: "github ghcr images cleanup" +author: "NodeFactory" +description: "github ghcr images cleanup from the github package registry" inputs: excluded_versions: - description: 'allows to exclude certain versions, eg. x.y.z, stable, beta, latest,...' + description: "allows to exclude certain versions, eg. x.y.z, stable, beta, latest,..." required: false num_versions_to_keep: - description: 'number of most recent versions to keep (excluded versions aren't included into count' + description: "number of most recent versions to keep (excluded versions aren't included into count" required: true package_name: - description: 'name of github package' + description: "name of github package" required: true token: - description: 'github auth token' + description: "github auth token" required: true username: - description: 'github username' + description: "github username" required: false organisation: - description: 'github organisation' + description: "github organisation" required: false runs: - using: 'node14' - main: 'dist/index.js' + using: "node14" + main: "dist/index.js" From 4a3c46ed34b9b0aa8f0b994561de400970e4e0a7 Mon Sep 17 00:00:00 2001 From: Nikola Date: Mon, 31 May 2021 09:52:42 +0200 Subject: [PATCH 15/31] Use node v12 --- action.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/action.yaml b/action.yaml index 45ead6d..75ace8d 100644 --- a/action.yaml +++ b/action.yaml @@ -21,5 +21,5 @@ inputs: description: "github organisation" required: false runs: - using: "node14" + using: "node12" main: "dist/index.js" From 48f7eeb8882cf049c82a6c898e2086b3a11e37e4 Mon Sep 17 00:00:00 2001 From: Nikola Date: Mon, 31 May 2021 10:32:28 +0200 Subject: [PATCH 16/31] Install dependecies and add build step in test --- .github/workflows/test.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 9b2a375..f2e3e64 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -22,6 +22,10 @@ jobs: username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} registry: ghcr.io + - name: Install dependecies + run: yarn install + - name: Build + run: yarn run build - name: tag hello world image run: docker pull hello-world:latest && docker tag hello-world:latest ghcr.io/nodefactoryio/github-packages-cleanup-sample:${{github.sha}} - name: push hello world image From 5e3d463de345967873fd7a302340bcfc91970519 Mon Sep 17 00:00:00 2001 From: Nikola Date: Mon, 31 May 2021 10:38:32 +0200 Subject: [PATCH 17/31] Fix required params --- src/index.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/index.ts b/src/index.ts index 396528d..102badf 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,12 +3,12 @@ import { getOctokit } from "@actions/github"; import { OctokitResponse } from "@octokit/types" import { FetchPackagesResponse } from "./types"; -const excludedVersion = getInput('excluded_versions', { required: true }); +const excludedVersion = getInput('excluded_versions', { required: false }); const numberOfVersionsToKeep = Number(getInput('num_versions_to_keep', { required: true })); const packageName = getInput('package_name', { required: true }); const token = getInput('token', { required: true }); -const username = getInput('username'); -const organisation = getInput('organisation'); +const username = getInput('username', { required: false }); +const organisation = getInput('organisation', { required: false }); const octokit = getOctokit(token); From 13d1bbfa6ddf1a2144d122d4b6721c0d66c25843 Mon Sep 17 00:00:00 2001 From: Nikola Date: Mon, 31 May 2021 13:34:51 +0200 Subject: [PATCH 18/31] Pipe deleted packages to logger --- src/index.ts | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/index.ts b/src/index.ts index 102badf..c0bf785 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,4 @@ -import { getInput, setFailed } from "@actions/core"; +import { getInput, setFailed, setOutput } from "@actions/core"; import { getOctokit } from "@actions/github"; import { OctokitResponse } from "@octokit/types" import { FetchPackagesResponse } from "./types"; @@ -18,22 +18,25 @@ async function main() { if (token && !username && !organisation) { const fetchedPackages = await getAuthUserPackageVersions(); const packagesToDelete = filterOutPackages(fetchedPackages); - packagesToDelete.forEach(element => { - deleteAuthUserPackageVersions(element!.id) + packagesToDelete.forEach(async (element) => { + const output = await deleteAuthUserPackageVersions(element!.id); + setOutput('DELETED_PACKAGES', output); }); // delete user packages } else if (token && username && !organisation) { const fetchedPackages = await getUserPackageVersions(); const packagesToDelete = filterOutPackages(fetchedPackages); - packagesToDelete.forEach(element => { - deleteUserPackageVersions(element!.id) + packagesToDelete.forEach(async (element) => { + const output = await deleteUserPackageVersions(element!.id); + setOutput('DELETED_PACKAGES', output); }); // delete organisation packages } else if (token && !username && organisation) { const fetchedPackages = await getOrganisationPackageVersions(); const packagesToDelete = filterOutPackages(fetchedPackages); - packagesToDelete.forEach(element => { - deleteOrganisationPackageVersions(element!.id) + packagesToDelete.forEach(async (element) => { + const output = await deleteOrganisationPackageVersions(element!.id); + setOutput('DELETED_PACKAGES', output); }); } else { setFailed("Failed to fetch packages"); From 9594045d3e3ac85818b9bca80a7fcc707c1f1097 Mon Sep 17 00:00:00 2001 From: Nikola Date: Mon, 31 May 2021 13:35:04 +0200 Subject: [PATCH 19/31] Log deteled packages --- .github/workflows/test.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index f2e3e64..725fe68 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -32,7 +32,10 @@ jobs: run: docker push ghcr.io/nodefactoryio/github-packages-cleanup-sample:${{github.sha}} - name: Run cleanup action uses: ./ + id: deleted-packages with: token: ${{ secrets.GITHUB_TOKEN }} package_name: github-packages-cleanup-sample num_versions_to_keep: 1 + - name: Log deleted packages + run: echo "Deleted packages ${{ steps.deleted-packages.outputs.DELETED_PACKAGES }}" From e17febc06ba4e0ae01b00a0187b16b65fe8122f7 Mon Sep 17 00:00:00 2001 From: Nikola Date: Mon, 31 May 2021 15:38:35 +0200 Subject: [PATCH 20/31] Add postgres image to test --- .github/workflows/test.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 725fe68..d9b17fb 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -30,6 +30,10 @@ jobs: run: docker pull hello-world:latest && docker tag hello-world:latest ghcr.io/nodefactoryio/github-packages-cleanup-sample:${{github.sha}} - name: push hello world image run: docker push ghcr.io/nodefactoryio/github-packages-cleanup-sample:${{github.sha}} + - name: tag postgres image + run: docker pull postgres:latest && docker tag postgres:latest ghcr.io/nodefactoryio/github-packages-cleanup-sample-2:${{github.sha}} + - name: push postgres image + run: docker push ghcr.io/nodefactoryio/github-packages-cleanup-sample-2:${{github.sha}} - name: Run cleanup action uses: ./ id: deleted-packages From 63566255fd1add5a226c689aae8c94611d78b62f Mon Sep 17 00:00:00 2001 From: Nikola Date: Wed, 2 Jun 2021 11:33:20 +0200 Subject: [PATCH 21/31] Fix typos --- .github/workflows/test.yaml | 2 +- README.md | 2 +- action.yaml | 4 ++-- src/index.ts | 22 +++++++++++----------- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index d9b17fb..e90504d 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -22,7 +22,7 @@ jobs: username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} registry: ghcr.io - - name: Install dependecies + - name: Install dependencies run: yarn install - name: Build run: yarn run build diff --git a/README.md b/README.md index f948ba6..bfdd7a9 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,6 @@ GitHub action for ghcr images cleanup from [GitHub Packages](https://github.com/ * Delete a single version * Delete multiple versions * Delete oldest version(s) -* Delete packages owned by an user or organisation +* Delete packages owned by an user or organization * Delete version(s) of a package that is hosted in the same repo that is executing the workflow * Delete version(s) of a package that is hosted in a different repo than the one executing the workflow diff --git a/action.yaml b/action.yaml index 75ace8d..6b1b296 100644 --- a/action.yaml +++ b/action.yaml @@ -17,8 +17,8 @@ inputs: username: description: "github username" required: false - organisation: - description: "github organisation" + organization: + description: "github organization" required: false runs: using: "node12" diff --git a/src/index.ts b/src/index.ts index c0bf785..c44ae8a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -8,14 +8,14 @@ const numberOfVersionsToKeep = Number(getInput('num_versions_to_keep', { require const packageName = getInput('package_name', { required: true }); const token = getInput('token', { required: true }); const username = getInput('username', { required: false }); -const organisation = getInput('organisation', { required: false }); +const organization = getInput('organization', { required: false }); const octokit = getOctokit(token); async function main() { // delete packages with token auth - if (token && !username && !organisation) { + if (token && !username && !organization) { const fetchedPackages = await getAuthUserPackageVersions(); const packagesToDelete = filterOutPackages(fetchedPackages); packagesToDelete.forEach(async (element) => { @@ -23,19 +23,19 @@ async function main() { setOutput('DELETED_PACKAGES', output); }); // delete user packages - } else if (token && username && !organisation) { + } else if (token && username && !organization) { const fetchedPackages = await getUserPackageVersions(); const packagesToDelete = filterOutPackages(fetchedPackages); packagesToDelete.forEach(async (element) => { const output = await deleteUserPackageVersions(element!.id); setOutput('DELETED_PACKAGES', output); }); - // delete organisation packages - } else if (token && !username && organisation) { - const fetchedPackages = await getOrganisationPackageVersions(); + // delete organization packages + } else if (token && !username && organization) { + const fetchedPackages = await getOrganizationPackageVersions(); const packagesToDelete = filterOutPackages(fetchedPackages); packagesToDelete.forEach(async (element) => { - const output = await deleteOrganisationPackageVersions(element!.id); + const output = await deleteOrganizationPackageVersions(element!.id); setOutput('DELETED_PACKAGES', output); }); } else { @@ -75,19 +75,19 @@ async function deleteUserPackageVersions(packageId: number): Promise> { +async function getOrganizationPackageVersions(): Promise> { return await octokit.request('GET /orgs/{org}/packages/{package_type}/{package_name}/versions', { package_type: 'container', package_name: packageName, - org: organisation + org: organization }); } -async function deleteOrganisationPackageVersions(packageId: number): Promise> { +async function deleteOrganizationPackageVersions(packageId: number): Promise> { return await octokit.request('DELETE /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}', { package_type: 'container', package_name: packageName, - org: organisation, + org: organization, package_version_id: packageId }); } From d3378314cd27a297ecfeafbc3c3db638e94e0985 Mon Sep 17 00:00:00 2001 From: Nikola Date: Wed, 2 Jun 2021 14:05:13 +0200 Subject: [PATCH 22/31] Call main function --- src/index.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/index.ts b/src/index.ts index c44ae8a..1fcb038 100644 --- a/src/index.ts +++ b/src/index.ts @@ -104,3 +104,5 @@ function filterOutPackages(existingPackages: OctokitResponse Date: Wed, 2 Jun 2021 14:05:31 +0200 Subject: [PATCH 23/31] Add gitignore --- .gitignore | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 4560807..5ecedea 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,6 @@ -.idea/ -.vscode/ node_modules/ -build/ -tmp/ -temp/ +dist/ +.idea .env -*.log -dist .nyc_output -coverage +lib From a3e58e92a4f398a36aa749c1942bf1bfeb0d314d Mon Sep 17 00:00:00 2001 From: Nikola Date: Mon, 14 Jun 2021 15:13:57 +0200 Subject: [PATCH 24/31] Remove branch from test --- .github/workflows/test.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index e90504d..e220047 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -4,7 +4,6 @@ on: push: branches: - 'master' - - 'feature/add-cleanup-actions' pull_request: branches: - 'master' From d749c0b1fc575f5ce45947a7212689761df7bf79 Mon Sep 17 00:00:00 2001 From: Nikola Date: Mon, 14 Jun 2021 15:14:22 +0200 Subject: [PATCH 25/31] Remove second image from test --- .github/workflows/test.yaml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index e220047..c36ebff 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -29,10 +29,6 @@ jobs: run: docker pull hello-world:latest && docker tag hello-world:latest ghcr.io/nodefactoryio/github-packages-cleanup-sample:${{github.sha}} - name: push hello world image run: docker push ghcr.io/nodefactoryio/github-packages-cleanup-sample:${{github.sha}} - - name: tag postgres image - run: docker pull postgres:latest && docker tag postgres:latest ghcr.io/nodefactoryio/github-packages-cleanup-sample-2:${{github.sha}} - - name: push postgres image - run: docker push ghcr.io/nodefactoryio/github-packages-cleanup-sample-2:${{github.sha}} - name: Run cleanup action uses: ./ id: deleted-packages From f455847a35f7093a1931ab7d295c86a727c5e38f Mon Sep 17 00:00:00 2001 From: Nikola Date: Mon, 14 Jun 2021 15:45:23 +0200 Subject: [PATCH 26/31] Wrap main func with try-catch --- src/index.ts | 56 ++++++++++++++++++++++++++++------------------------ 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/src/index.ts b/src/index.ts index 1fcb038..ef289b1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -14,32 +14,36 @@ const organization = getInput('organization', { required: false }); const octokit = getOctokit(token); async function main() { - // delete packages with token auth - if (token && !username && !organization) { - const fetchedPackages = await getAuthUserPackageVersions(); - const packagesToDelete = filterOutPackages(fetchedPackages); - packagesToDelete.forEach(async (element) => { - const output = await deleteAuthUserPackageVersions(element!.id); - setOutput('DELETED_PACKAGES', output); - }); - // delete user packages - } else if (token && username && !organization) { - const fetchedPackages = await getUserPackageVersions(); - const packagesToDelete = filterOutPackages(fetchedPackages); - packagesToDelete.forEach(async (element) => { - const output = await deleteUserPackageVersions(element!.id); - setOutput('DELETED_PACKAGES', output); - }); - // delete organization packages - } else if (token && !username && organization) { - const fetchedPackages = await getOrganizationPackageVersions(); - const packagesToDelete = filterOutPackages(fetchedPackages); - packagesToDelete.forEach(async (element) => { - const output = await deleteOrganizationPackageVersions(element!.id); - setOutput('DELETED_PACKAGES', output); - }); - } else { - setFailed("Failed to fetch packages"); + try { + // delete packages with token auth + if (token && !username && !organization) { + const fetchedPackages = await getAuthUserPackageVersions(); + const packagesToDelete = filterOutPackages(fetchedPackages); + packagesToDelete.forEach(async (element) => { + const output = await deleteAuthUserPackageVersions(element!.id); + setOutput('DELETED_PACKAGES', output); + }); + // delete user packages + } else if (token && username && !organization) { + const fetchedPackages = await getUserPackageVersions(); + const packagesToDelete = filterOutPackages(fetchedPackages); + packagesToDelete.forEach(async (element) => { + const output = await deleteUserPackageVersions(element!.id); + setOutput('DELETED_PACKAGES', output); + }); + // delete organization packages + } else if (token && !username && organization) { + const fetchedPackages = await getOrganizationPackageVersions(); + const packagesToDelete = filterOutPackages(fetchedPackages); + packagesToDelete.forEach(async (element) => { + const output = await deleteOrganizationPackageVersions(element!.id); + setOutput('DELETED_PACKAGES', output); + }); + } else { + setFailed("Failed to fetch packages"); + } + } catch (e) { + console.error(`Deleting package failed because of: ${e}`); } } From 63ada88412e1d15271ff6be8a2d815adf5733dc3 Mon Sep 17 00:00:00 2001 From: Nikola Date: Thu, 17 Jun 2021 10:55:17 +0200 Subject: [PATCH 27/31] Pass ogranization input to test workflow --- .github/workflows/test.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index c36ebff..3877bd6 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -36,5 +36,6 @@ jobs: token: ${{ secrets.GITHUB_TOKEN }} package_name: github-packages-cleanup-sample num_versions_to_keep: 1 + organization: nodefactoryio - name: Log deleted packages run: echo "Deleted packages ${{ steps.deleted-packages.outputs.DELETED_PACKAGES }}" From b4db41d1f2e2636e11deb6873ab8619034885dec Mon Sep 17 00:00:00 2001 From: Nikola Date: Fri, 18 Jun 2021 12:58:26 +0200 Subject: [PATCH 28/31] Use PAT for auth --- .actrc | 1 + .github/workflows/test.yaml | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 .actrc diff --git a/.actrc b/.actrc new file mode 100644 index 0000000..a945ba1 --- /dev/null +++ b/.actrc @@ -0,0 +1 @@ +-P ubuntu-latest=catthehacker/ubuntu:js-latest-dev diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 3877bd6..8b82759 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -19,7 +19,7 @@ jobs: uses: docker/login-action@v1 with: username: ${{ github.repository_owner }} - password: ${{ secrets.GITHUB_TOKEN }} + password: ${{ secrets.CR_WRITE_PAT }} registry: ghcr.io - name: Install dependencies run: yarn install @@ -33,7 +33,7 @@ jobs: uses: ./ id: deleted-packages with: - token: ${{ secrets.GITHUB_TOKEN }} + token: ${{ secrets.CR_WRITE_PAT }} package_name: github-packages-cleanup-sample num_versions_to_keep: 1 organization: nodefactoryio From 4ecbddd3763a8f906522d7fad476df7f62eb79bf Mon Sep 17 00:00:00 2001 From: Nikola Date: Wed, 23 Jun 2021 11:27:04 +0200 Subject: [PATCH 29/31] Fix organisation name --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 8b82759..b7fb416 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -36,6 +36,6 @@ jobs: token: ${{ secrets.CR_WRITE_PAT }} package_name: github-packages-cleanup-sample num_versions_to_keep: 1 - organization: nodefactoryio + organization: NodeFactoryIo - name: Log deleted packages run: echo "Deleted packages ${{ steps.deleted-packages.outputs.DELETED_PACKAGES }}" From e18418bc21a095be31b4a1bf649d36a02618551c Mon Sep 17 00:00:00 2001 From: Nikola Date: Wed, 23 Jun 2021 15:10:13 +0200 Subject: [PATCH 30/31] Fix package filtering --- src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index ef289b1..a9e68fa 100644 --- a/src/index.ts +++ b/src/index.ts @@ -97,7 +97,7 @@ async function deleteOrganizationPackageVersions(packageId: number): Promise): (FetchPackagesResponse | undefined)[] { - return existingPackages.data.map((item) => { + return existingPackages.data.map((item: FetchPackagesResponse) => { // find package versions matching regex if (!item.metadata?.container?.tags[0]?.match(excludedVersion)) { return item; @@ -106,7 +106,7 @@ function filterOutPackages(existingPackages: OctokitResponse item) // packages for deletion - omitting last n values - .slice(0, length - numberOfVersionsToKeep); + .slice(0, existingPackages.data.length - numberOfVersionsToKeep); } main(); From fbf50ff8ad56359ecea6b2e389eee709b68a0ac5 Mon Sep 17 00:00:00 2001 From: Nikola Date: Thu, 24 Jun 2021 11:07:01 +0200 Subject: [PATCH 31/31] Fix filtering + passing data to action --- src/index.ts | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/index.ts b/src/index.ts index a9e68fa..7de6e95 100644 --- a/src/index.ts +++ b/src/index.ts @@ -15,30 +15,31 @@ const octokit = getOctokit(token); async function main() { try { + let deletedPckgsOutput = undefined; // delete packages with token auth if (token && !username && !organization) { const fetchedPackages = await getAuthUserPackageVersions(); const packagesToDelete = filterOutPackages(fetchedPackages); packagesToDelete.forEach(async (element) => { - const output = await deleteAuthUserPackageVersions(element!.id); - setOutput('DELETED_PACKAGES', output); + deletedPckgsOutput = await deleteAuthUserPackageVersions(element!.id); }); + setOutput('DELETED_PACKAGES', deletedPckgsOutput ?? 0); // delete user packages } else if (token && username && !organization) { const fetchedPackages = await getUserPackageVersions(); const packagesToDelete = filterOutPackages(fetchedPackages); packagesToDelete.forEach(async (element) => { - const output = await deleteUserPackageVersions(element!.id); - setOutput('DELETED_PACKAGES', output); + deletedPckgsOutput = await deleteUserPackageVersions(element!.id); }); + setOutput('DELETED_PACKAGES', deletedPckgsOutput ?? 0); // delete organization packages } else if (token && !username && organization) { const fetchedPackages = await getOrganizationPackageVersions(); const packagesToDelete = filterOutPackages(fetchedPackages); packagesToDelete.forEach(async (element) => { - const output = await deleteOrganizationPackageVersions(element!.id); - setOutput('DELETED_PACKAGES', output); + deletedPckgsOutput = await deleteOrganizationPackageVersions(element!.id); }); + setOutput('DELETED_PACKAGES', deletedPckgsOutput ?? 0); } else { setFailed("Failed to fetch packages"); } @@ -99,7 +100,7 @@ async function deleteOrganizationPackageVersions(packageId: number): Promise): (FetchPackagesResponse | undefined)[] { return existingPackages.data.map((item: FetchPackagesResponse) => { // find package versions matching regex - if (!item.metadata?.container?.tags[0]?.match(excludedVersion)) { + if (item.metadata?.container?.tags[0]?.match(excludedVersion).index == 0) { return item; }; })