Skip to content

🎫 Issue › New › 90: 🐛 Bug: /tmp/csf/install.cpanel.sh: 1: ./os.pl: Permission denied #65

🎫 Issue › New › 90: 🐛 Bug: /tmp/csf/install.cpanel.sh: 1: ./os.pl: Permission denied

🎫 Issue › New › 90: 🐛 Bug: /tmp/csf/install.cpanel.sh: 1: ./os.pl: Permission denied #65

Workflow file for this run

# #
# @type github workflow
# @author Aetherinox
# @url https://github.com/Aetherinox
# @usage searches a new issues title and body for certain keywords and assigns a label
# sets the assignee for the issue to the repository owner
#
# @notes requires the following labels to be created in your repo:
# - bug
# - feature
# - urgent
# - roadmap
#
# @secrets secrets.SELF_TOKEN self github personal access token (fine-grained)
# secrets.SELF_TOKEN_CL self github personal access token (classic)
# secrets.NPM_TOKEN self npmjs access token
# secrets.PYPI_API_TOKEN self Pypi API token (production site) - https://pypi.org/
# secrets.PYPI_API_TEST_TOKEN self Pypi API token (test site) - https://test.pypi.org/
# secrets.SELF_DOCKERHUB_TOKEN self Dockerhub token
# secrets.CODECOV_TOKEN codecov upload token for nodejs projects
# secrets.API_GEOLITE2_KEY maxmind API token
# secrets.CF_ACCOUNT_ID cloudflare account id
# secrets.CF_ACCOUNT_TOKEN cloudflare account token
# secrets.ARTIFACTS_DOMAIN github artifacts domain name
# secrets.ARTIFACTS_PORT github artifacts port
# secrets.ARTIFACTS_GITHUB_SSH_PRIVATE_KEY github artifacts server ssh private key
# secrets.ORG_TOKEN org github personal access token (fine-grained)
# secrets.ORG_TOKEN_CL org github personal access token (classic)
# secrets.ORG_DOCKERHUB_TOKEN org dockerhub secret
# secrets.ORG_GITEA_TOKEN org gitea personal access token (classic) with package:write permission
# secrets.BOT_GPG_KEY_ASC bot gpg private key (armored) | BEGIN PGP PRIVATE KEY BLOCK
# secrets.BOT_GPG_KEY_B64 bot gpg private key (binary) converted to base64
# secrets.BOT_GPG_PASSPHRASE bot gpg private key passphrase
# secrets.DISCORD_WEBHOOK_CHAN_GITHUB_RELEASES discord webhook to report release notifications from github to discord
# secrets.DISCORD_WEBHOOK_CHAN_GITHUB_WORKFLOWS discord webhook to report workflow notifications from github to discord
# secrets.DISCORD_WEBHOOK_CHAN_GITHUB_UPDATES discord webhook to report activity notifications from github to discord
#
# @local these workflows can be tested locally through the use of `act`
# https://github.com/nektos/act
# Extract act to folder
# Add system env var with path to act.exe
# Run the commands:
# git pull https://github.com/username/repo
# act -W .github/workflows/issues-new.yml -P ubuntu-latest=catthehacker/ubuntu:full-22.04
# act -W .github/workflows/issues-new.yml -s TOKEN_CL=XXXXXXXXXX --pull=false
# #
name: '🎫 Issue › New'
run-name: '🎫 Issue › New › ${{ github.event.issue.number }}: ${{ github.event.issue.title }}'
# #
# triggers
# #
on:
issues:
types:
- reopened
- opened
# #
# environment variables
# #
env:
PREFIX_BUG: "🐛 Bug"
PREFIX_DEPENDENCY: "Dependency"
PREFIX_DOCS: "Docs"
PREFIX_FEATURE: "💡 Feature"
PREFIX_GIT: "Git Action"
PREFIX_PR: "PR"
PREFIX_ROADMAP: "🗺️ Roadmap"
PREFIX_INTERNAL: "Internal"
PREFIX_URGENT: "⚠ Urgent"
LABEL_BUG: "Type › Bug"
LABEL_DEPENDENCY: "Type › Dependency"
LABEL_DOCS: "Type › Docs"
LABEL_FEATURE: "Type › Feature"
LABEL_GIT: "Type › Git Action"
LABEL_PR: "Type › Pull Request"
LABEL_ROADMAP: "Type › Roadmap"
LABEL_INTERNAL: "Type › Internal"
LABEL_URGENT: "⚠ Urgent"
ASSIGN_USER: Aetherinox
BOT_NAME_1: EuropaServ
BOT_NAME_2: BinaryServ
BOT_NAME_DEPENDABOT: dependabot[bot]
BOT_NAME_RENOVATE: renovate[bot]
LABELS_JSON: |
[
{ "name": "AC › Changes Made", "color": "8F1784", "description": "Requested changes have been made and are pending a re-scan" },
{ "name": "AC › Changes Required", "color": "8F1784", "description": "Requires changes to be made to the package before being accepted" },
{ "name": "AC › Failed", "color": "a61f2d", "description": "Autocheck failed to run through a complete cycle, requires investigation" },
{ "name": "AC › Needs Rebase", "color": "8F1784", "description": "Due to the permissions on the requesting repo, this pull request must be rebased by the author" },
{ "name": "AC › Passed", "color": "146b4a", "description": "Ready to be reviewed" },
{ "name": "AC › Approved", "color": "24996d", "description": "PR has been approved for merge" },
{ "name": "AC › Merged", "color": "35b987", "description": "PR has been merged with branch" },
{ "name": "AC › Review Required", "color": "8F1784", "description": "PR needs to be reviewed by another person, after the requested changes have been made" },
{ "name": "AC › Security Warning", "color": "761620", "description": "Does not conform to developer policies, or includes potentially dangerous code" },
{ "name": "AC › Skipped Scan", "color": "8F1784", "description": "Author has skipped code scan" },
{ "name": "Status › Duplicate", "color": "75536b", "description": "Issue or pull request already exists" },
{ "name": "Status › Accepted", "color": "2e7539", "description": "This pull request has been accepted" },
{ "name": "Status › Autoclosed", "color": "3E0915", "description": "Originally stale and was autoclosed for no activity" },
{ "name": "Status › Denied", "color": "ba4058", "description": "Pull request has been denied" },
{ "name": "Status › Locked", "color": "550F45", "description": "Automatically locked by AdminServ for a prolonged period of inactivity" },
{ "name": "Status › Need Info", "color": "2E3C4C", "description": "Not enough information to resolve" },
{ "name": "Status › No Action", "color": "030406", "description": "Closed without any action being taken" },
{ "name": "Status › Pending Pull", "color": "984b12", "description": "Pending pull request" },
{ "name": "Status › Released", "color": "1b6626", "description": "Issues or PR has been implemented and is now live" },
{ "name": "Status › Reopened", "color": "8a6f14", "description": "A previously closed PR which has been re-opened" },
{ "name": "Status › Under Review", "color": "9e1451", "description": "Currently pending review" },
{ "name": "Status › Stale", "color": "928282", "description": "Has not had any activity in over 30 days" },
{ "name": "Status › Hold", "color": "d93f0b", "description": "Awaiting additional feedback or issues" },
{ "name": "Type › Bug", "color": "9a2c2c", "description": "Something isn't working" },
{ "name": "Type › Dependency", "color": "243759", "description": "Item is associated to dependency" },
{ "name": "Type › Lock Maintenance", "color": "FBCA04", "description": "Sync package-lock.json" },
{ "name": "Type › Docs", "color": "0e588d", "description": "Improvements or modifications to docs" },
{ "name": "Type › Feature", "color": "3c4e93", "description": "Feature request" },
{ "name": "Type › Git Action", "color": "030406", "description": "GitHub Action / workflow" },
{ "name": "Type › Pull Request", "color": "8F1784", "description": "Normal pull request" },
{ "name": "Type › Roadmap", "color": "8F1784", "description": "Accepted feature or bug currently planned for implementation" },
{ "name": "Type › Internal", "color": "A51994", "description": "Assigned items are for internal developer use" },
{ "name": "Build › Desktop", "color": "c7ca4a", "description": "Specific to desktop" },
{ "name": "Build › Linux", "color": "c7ca4a", "description": "Specific to Linux" },
{ "name": "Build › MacOS", "color": "c7ca4a", "description": "Specific to MacOS" },
{ "name": "Build › Mobile", "color": "c7ca4a", "description": "Specific to mobile" },
{ "name": "Build › Web", "color": "c7ca4a", "description": "Specific to web" },
{ "name": "Build › Windows", "color": "c7ca4a", "description": "Specific to Windows" },
{ "name": "CP › All", "color": "0a2968", "description": "Control Panel › Affects all web panels" },
{ "name": "CP › Generic", "color": "0a2968", "description": "Control Panel › Generic" },
{ "name": "CP › Other", "color": "0a2968", "description": "Control Panel › Other" },
{ "name": "CP › CyberPanel", "color": "0a2968", "description": "Control Panel › Cyberpanel" },
{ "name": "CP › cPanel", "color": "0a2968", "description": "Control Panel › cPanel / WHM" },
{ "name": "CP › VestaCP", "color": "0a2968", "description": "Control Panel › VestaCP" },
{ "name": "CP › Interworx", "color": "0a2968", "description": "Control Panel › Interworx" },
{ "name": "CP › DirectAdmin", "color": "0a2968", "description": "Control Panel › DirectAdmin" },
{ "name": "CP › CWP", "color": "0a2968", "description": "Control Panel › CentOS Web Panel" },
{ "name": "› API", "color": "F99B50", "description": "Plugin API, CLI, browser JS API" },
{ "name": "› Auto-type", "color": "9141E0", "description": "Auto-type functionality in desktop apps" },
{ "name": "› Bots", "color": "E3F0FC", "description": "Affects CSF bot services (discord, etc)" },
{ "name": "› Browser", "color": "9141E0", "description": "Browser plugins and passing data to <=> from app" },
{ "name": "› Customization", "color": "E3F0FC", "description": "Customizations: plugins, themes, configs" },
{ "name": "› Design/UI", "color": "FA70DE", "description": "Design related queries" },
{ "name": "› Dist", "color": "FA70DE", "description": "Installers and other forms of software distribution" },
{ "name": "› Enterprise", "color": "11447a", "description": "Issues about collaboration, administration, and so on" },
{ "name": "› Hardware", "color": "5a7503", "description": "YubiKey, other tokens, biometrics" },
{ "name": "› Import/Export", "color": "F5FFCC", "description": "Import from and export to different file formats" },
{ "name": "› Improvement", "color": "185c98", "description": "Enhance an existing feature" },
{ "name": "› Performance", "color": "006b75", "description": "Web and desktop performance issues" },
{ "name": "› Plugin Request", "color": "FCE9CA", "description": "Requested changes should be implemented as a plugin" },
{ "name": "› Security", "color": "F75D39", "description": "Security issues" },
{ "name": "› Self-Hosting", "color": "fad8c7", "description": "Self-hosting installations and configs" },
{ "name": "› Storage", "color": "5319e7", "description": "Storage providers: Dropbox, Google, WebDAV, etc." },
{ "name": "› Updater", "color": "1BADDE", "description": "Auto-updater issues" },
{ "name": "› UX", "color": "1BADDE", "description": "UX and usability" },
{ "name": "› Website", "color": "fef2c0", "description": "Website related issues" },
{ "name": "⚠ Urgent", "color": "a8740e", "description": "Requires urgent attention" },
{ "name": "⚠ Announcement", "color": "DB4712", "description": "Announcements" },
{ "name": "📰 Progress Report", "color": "392297", "description": "Development updates" },
{ "name": "📦 Release", "color": "277542", "description": "Release announcements" },
{ "name": "✔️ Poll", "color": "972255", "description": "Community polls" },
{ "name": "❔ Question", "color": "FFFFFF", "description": "All questions" }
]
# #
# jobs
# #
jobs:
# #
# Job [ Verify / Create Labels ]
#
# This job will ensure you have labels already created in your repo.
# All labels come from the JSON table LABELS_JSON.
# #
job-labels-create:
name: >-
🎫 Labels › Verify Existing
runs-on: ubuntu-latest
# runs-on: apollo-x64
timeout-minutes: 5
steps:
# #
# Labels › Create › Checkout
# #
- name: '☑️ Checkout'
uses: actions/checkout@v4
with:
fetch-depth: 0
# #
# Labels › Create › Job Information
# #
- name: >-
🔄 Load Job
uses: qoomon/actions--context@v4
id: 'context'
# #
# Labels › Create › Start
# #
- name: >-
✅ Start
run: |
echo "‎"
echo "―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――"
echo " Starting Job ${{ steps.context.outputs.job_name }}"
echo "―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――"
YEAR="$(date +'%Y')"
echo "YEAR=${YEAR}" >> $GITHUB_ENV
NOW="$(date +'%m-%d-%Y %H:%M:%S')" # 02-25-2025 12:49:48
echo "NOW=${NOW}" >> $GITHUB_ENV
NOW_SHORT="$(date +'%m-%d-%Y')" # 02-25-2025
echo "NOW_SHORT=${NOW_SHORT}" >> $GITHUB_ENV
NOW_LONG="$(date +'%m-%d-%Y %H:%M')" # 02-25-2025 12:49
echo "NOW_LONG=${NOW_LONG}" >> $GITHUB_ENV
NOW_DOCKER="$(date +'%Y%m%d')" # 20250225
echo "NOW_DOCKER=${NOW_DOCKER}" >> $GITHUB_ENV
NOW_DOCKER_TS="$(date -u +'%FT%T.%3NZ')" # 2025-02-25T12:50:11.569Z
echo "NOW_DOCKER_TS=${NOW_DOCKER_TS}" >> $GITHUB_ENV
SHA1="$(git rev-parse HEAD)" # 71fad013cfce9116ec62779e4a7e627fe4c33627
echo "SHA1=${SHA1}" >> $GITHUB_ENV
SHA1_GH="$(echo ${GITHUB_SHA})" # 71fad013cfce9116ec62779e4a7e627fe4c33627
echo "SHA1_GH=${SHA1_GH}" >> $GITHUB_ENV
PKG_VER_1DIGIT="$(echo ${{ env.IMAGE_VERSION }} | cut -d '.' -f1-1)" # 3.22 > 3
echo "PKG_VER_1DIGIT=${PKG_VER_1DIGIT}" >> $GITHUB_ENV
PKG_VER_2DIGIT="$(echo ${{ env.IMAGE_VERSION }} | cut -f2 -d ":" | cut -c1-3)" # 3.22 > 3.2
echo "PKG_VER_2DIGIT=${PKG_VER_2DIGIT}" >> $GITHUB_ENV
echo "―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――"
echo "‎"
echo "‎"
sudo apt -qq update
sudo apt -qq install tree
echo "‎"
echo "‎"
echo "―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――"
echo "‎"
echo "‎"
echo " Runner .............. ${{ runner.name }}"
echo " Workflow ............ ${{ github.workflow }} (#${{ github.workflow_ref }})"
echo " Run Number .......... ${{ github.run_number }}"
echo " Ref ................. ${{ github.ref }}"
echo " Ref Name ............ ${{ github.ref_name }}"
echo " Event Name .......... ${{ github.event_name }}"
echo " Repo ................ ${{ github.repository }}"
echo " Repo Owner .......... ${{ github.repository_owner }}"
echo " Run ID .............. https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
echo " Triggered By ........ ${{ github.actor }}"
echo " SHA 1 (GITHUB_SHA) .. ${GITHUB_SHA}"
echo " SHA 2 (github.sha) .. ${{ github.sha }}"
echo " SHA 3 (env.SHA1) .... ${SHA1}"
echo " SHA 4 (env.SHA1_GH) . ${SHA1_GH}"
echo " Workspace ........... ${{ github.workspace }}"
echo " PWD ................. ${PWD}"
echo " Job Name ............ ${{ steps.context.outputs.job_name }}"
echo " Job ID .............. ${{ steps.context.outputs.job_id }}"
echo " Job URL ............. ${{ steps.context.outputs.job_url }}"
echo " Run ID .............. ${{ steps.context.outputs.run_id }}"
echo " Run Attempt ......... ${{ steps.context.outputs.run_attempt }}"
echo " Run Number .......... ${{ steps.context.outputs.run_number }}"
echo " Run URL ............. ${{ steps.context.outputs.run_url }}"
echo " Run Env ............. ${{ steps.context.outputs.environment }}"
echo " Run Env URL ......... ${{ steps.context.outputs.environment_url }}"
echo " Run Deployment ...... ${{ steps.context.outputs.deployment_id }}"
echo " Run Deployment URL .. ${{ steps.context.outputs.deployment_url }}"
echo " Run Deployment ...... ${{ steps.context.outputs.deployment_id }}"
echo " Run Runner Name ..... ${{ steps.context.outputs.runner_name }}"
echo " Run Runner ID ....... ${{ steps.context.outputs.runner_id }}"
echo " Year ................ ${YEAR}"
echo " Now ................. ${NOW}"
echo " Now (Short) ......... ${NOW_SHORT}"
echo " Now (Long) .......... ${NOW_LONG}"
echo " Now (Docker) ........ ${NOW_DOCKER}"
echo " Now (Docker TS) ..... ${NOW_DOCKER_TS}"
echo "‎"
echo "‎"
echo "―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――"
echo "‎"
echo "‎"
tree -I node_modules -I .git
echo "‎"
echo "‎"
echo "―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――"
echo "‎"
echo "‎"
# #
# [ Create Labels ] Verify Existing Labels
# #
- name: >-
🏷️ Verify Existing Labels
id: task_label_create_verify
uses: actions/github-script@v7
with:
github-token: ${{ secrets.ADMINSERV_TOKEN_CL || github.token }}
script: |
const labels = JSON.parse( process.env.LABELS_JSON );
for ( const label of labels )
{
try
{
await github.rest.issues.createLabel(
{
owner: context.repo.owner,
repo: context.repo.repo,
name: label.name,
description: label.description || 'No Description',
color: label.color
});
}
catch ( err )
{
if ( err.status === 422 )
{
console.log( `Label '${label.name}' already exists. Skipping.` );
}
else
{
console.error( `Error creating label '${label.name}': ${err}` );
}
}
}
# #
# Job [ Assign Labels ]
# #
job-assign-labels:
name: >-
🏷️ Labels › Assign
needs:
- job-labels-create
runs-on: ubuntu-latest
# runs-on: apollo-x64
timeout-minutes: 5
permissions:
contents: 'read'
id-token: 'write'
issues: 'write'
steps:
# #
# Labels › Assign › Checkout
# #
- name: '☑️ Checkout'
uses: actions/checkout@v4
with:
fetch-depth: 0
# #
# Labels › Assign › Job Information
# #
- name: >-
🔄 Load Job
uses: qoomon/actions--context@v4
id: 'context'
# #
# Labels › Assign › Start
# #
- name: >-
✅ Start
run: |
echo "‎"
echo "―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――"
echo " Starting Job ${{ steps.context.outputs.job_name }}"
echo "―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――"
YEAR="$(date +'%Y')"
echo "YEAR=${YEAR}" >> $GITHUB_ENV
NOW="$(date +'%m-%d-%Y %H:%M:%S')" # 02-25-2025 12:49:48
echo "NOW=${NOW}" >> $GITHUB_ENV
NOW_SHORT="$(date +'%m-%d-%Y')" # 02-25-2025
echo "NOW_SHORT=${NOW_SHORT}" >> $GITHUB_ENV
NOW_LONG="$(date +'%m-%d-%Y %H:%M')" # 02-25-2025 12:49
echo "NOW_LONG=${NOW_LONG}" >> $GITHUB_ENV
NOW_DOCKER="$(date +'%Y%m%d')" # 20250225
echo "NOW_DOCKER=${NOW_DOCKER}" >> $GITHUB_ENV
NOW_DOCKER_TS="$(date -u +'%FT%T.%3NZ')" # 2025-02-25T12:50:11.569Z
echo "NOW_DOCKER_TS=${NOW_DOCKER_TS}" >> $GITHUB_ENV
SHA1="$(git rev-parse HEAD)" # 71fad013cfce9116ec62779e4a7e627fe4c33627
echo "SHA1=${SHA1}" >> $GITHUB_ENV
SHA1_GH="$(echo ${GITHUB_SHA})" # 71fad013cfce9116ec62779e4a7e627fe4c33627
echo "SHA1_GH=${SHA1_GH}" >> $GITHUB_ENV
PKG_VER_1DIGIT="$(echo ${{ env.IMAGE_VERSION }} | cut -d '.' -f1-1)" # 3.22 > 3
echo "PKG_VER_1DIGIT=${PKG_VER_1DIGIT}" >> $GITHUB_ENV
PKG_VER_2DIGIT="$(echo ${{ env.IMAGE_VERSION }} | cut -f2 -d ":" | cut -c1-3)" # 3.22 > 3.2
echo "PKG_VER_2DIGIT=${PKG_VER_2DIGIT}" >> $GITHUB_ENV
echo "―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――"
echo "‎"
echo "‎"
sudo apt -qq update
sudo apt -qq install tree
echo "‎"
echo "‎"
echo "―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――"
echo "‎"
echo "‎"
echo " Runner .............. ${{ runner.name }}"
echo " Workflow ............ ${{ github.workflow }} (#${{ github.workflow_ref }})"
echo " Run Number .......... ${{ github.run_number }}"
echo " Ref ................. ${{ github.ref }}"
echo " Ref Name ............ ${{ github.ref_name }}"
echo " Event Name .......... ${{ github.event_name }}"
echo " Repo ................ ${{ github.repository }}"
echo " Repo Owner .......... ${{ github.repository_owner }}"
echo " Run ID .............. https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
echo " Triggered By ........ ${{ github.actor }}"
echo " SHA 1 (GITHUB_SHA) .. ${GITHUB_SHA}"
echo " SHA 2 (github.sha) .. ${{ github.sha }}"
echo " SHA 3 (env.SHA1) .... ${SHA1}"
echo " SHA 4 (env.SHA1_GH) . ${SHA1_GH}"
echo " Workspace ........... ${{ github.workspace }}"
echo " PWD ................. ${PWD}"
echo " Job Name ............ ${{ steps.context.outputs.job_name }}"
echo " Job ID .............. ${{ steps.context.outputs.job_id }}"
echo " Job URL ............. ${{ steps.context.outputs.job_url }}"
echo " Run ID .............. ${{ steps.context.outputs.run_id }}"
echo " Run Attempt ......... ${{ steps.context.outputs.run_attempt }}"
echo " Run Number .......... ${{ steps.context.outputs.run_number }}"
echo " Run URL ............. ${{ steps.context.outputs.run_url }}"
echo " Run Env ............. ${{ steps.context.outputs.environment }}"
echo " Run Env URL ......... ${{ steps.context.outputs.environment_url }}"
echo " Run Deployment ...... ${{ steps.context.outputs.deployment_id }}"
echo " Run Deployment URL .. ${{ steps.context.outputs.deployment_url }}"
echo " Run Deployment ...... ${{ steps.context.outputs.deployment_id }}"
echo " Run Runner Name ..... ${{ steps.context.outputs.runner_name }}"
echo " Run Runner ID ....... ${{ steps.context.outputs.runner_id }}"
echo " Year ................ ${YEAR}"
echo " Now ................. ${NOW}"
echo " Now (Short) ......... ${NOW_SHORT}"
echo " Now (Long) .......... ${NOW_LONG}"
echo " Now (Docker) ........ ${NOW_DOCKER}"
echo " Now (Docker TS) ..... ${NOW_DOCKER_TS}"
echo "‎"
echo "‎"
echo "―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――"
echo "‎"
echo "‎"
tree -I node_modules -I .git
echo "‎"
echo "‎"
echo "―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――"
echo "‎"
echo "‎"
# #
# Assign > Get Issue Title
#
# this step simply gets the title set for a new issue created by a user and sets it as an env
# #
- name: >-
🏷️ Get Issue Title
uses: actions/github-script@v7
id: task_get_title
with:
github-token: ${{ secrets.ADMINSERV_TOKEN_CL || github.token }}
script: |
let iss_title = `${ context.payload.issue.title }`;
core.setOutput( 'issue_title', iss_title )
core.info( `Setting env issue title: ${ iss_title }` )
console.log( "\n\n" )
# #
# Labels > Bugs
#
# this step scans the title and body of a new submitted issue for certain keywords.
# this step will then re-name the issue with a title which contains the type of issue at the front
# with whatever label is set for PREFIX_BUG; title change will look like the following:
# - EuropaServ changed the title
# [-] test issue found bug here
# [+] 🐛 Bug: test issue found bug here
# - EuropaServ added [ Type › Bug ]
#
# There are four main types of tickets:
# 1. 🐛 Bug
# 2. 💡 Feature
# 3. 🗺️ Roadmap
# 4. ⚠ Urgent
#
# If the ticket is classified as a "Bug", the title of the ticket will be re-named to include `🐛 Bug` at the beginning
# of the issue name, but then that title will be carried over to the next type of ticket to check the title again.
# #
- name: >-
🏷️ ${{ env.PREFIX_BUG }} › Assignment
uses: actions/github-script@v7
id: task_issues_bugs
with:
github-token: ${{ secrets.ADMINSERV_TOKEN_CL || github.token }}
script: |
const issueLabels = await github.rest.issues.listLabelsOnIssue(
{
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number
});
let add_labels = issueLabels.data.map( label => label.name );
let iss_title = `${{ steps.task_get_title.outputs.issue_title }}` || `${ context.payload.issue.title }`;
let iss_body = `${ context.payload.issue.body }`;
let iss_author = `${ context.payload.issue.user.login }`;
const iss_title_lc = iss_title.toLowerCase( );
console.log( "Bug Title ..................... " + iss_title )
console.log( "Bug Output .................... " + `${{ steps.task_get_title.outputs.issue_title }}` )
console.log( "Bug Payload ................... " + `${ context.payload.issue.title }` )
/*
Tags
*/
const bug_tag = `${{ env.PREFIX_BUG }}:`;
const bug_lbl = `${{ env.LABEL_BUG }}`;
const feat_tag = `${{ env.PREFIX_FEATURE }}:`;
const feat_lbl = `${{ env.LABEL_FEATURE }}`;
const urgn_tag = `${{ env.PREFIX_URGENT }}:`;
const urgn_lbl = `${{ env.LABEL_URGENT }}`;
const road_tag = `${{ env.PREFIX_ROADMAP }}:`;
const road_lbl = `${{ env.LABEL_ROADMAP }}`;
/*
Bugs
Find regex based phrases
Regex:
https://regex101.com/r/Z99Gnq/2
*/
const words = [ "bug", "broke", "issue", "fail", "wont work" ];
const bTriggerWordInTitle = words.some( s => s.includes( iss_title_lc ) || iss_title_lc.includes( s ) );
const findWordList = /^\b(?:I?\s*have\s*(?:a|an)\s*(?:issue|problem|bug))|(?:problem\swith)|(?:will\s*not\s*work)|(?:it\s*is\s*(?:broken|broke|stuck))|(?:found\s*(?:an?|the)\s*(?:bug|issue))|(?:can\s*I\s*fix\s*the\s*(?:bug|issue))|(?:(?:does not|doesn'?t|don'?t|won'?t|can'?t|can\s?not|will\s*not)\s*(?:work|load|function))|(?:it\s*(?:will\s?not|won'?t|can\s?not|can'?t))\s*(?:get|find)\s*the\s*(?:website|site|webpage|page)|(?:the\s*(?:window|frame)\s*is\s*(?:blank|white|empty|missing))\b$/igm;
const bFoundMatchTitle = Boolean( findWordList.test( iss_title ) );
const bFoundMatchBody = Boolean( findWordList.test( iss_body ) );
/*
Do not change a title if the item starts with a PR: #
Regex:
https://regex101.com/r/JOrqbN/1
*/
const bug_findPRTitle = /^PR\s?#?(?:[0-9]*:)/igm;
const bug_bFoundPRTitle = Boolean( bug_findPRTitle.test( iss_title ) );
console.log( "Title Lowercase ............... " + iss_title_lc )
console.log( "Startswith " + bug_tag.toLowerCase( ) + "................ " + iss_title_lc.startsWith( bug_tag.toLowerCase( ) ) )
console.log( "Title Includes Keyword ........ " + bTriggerWordInTitle )
console.log( "Title Includes Regex .......... " + bFoundMatchTitle )
console.log( "Body Includes Regex ........... " + bFoundMatchBody )
console.log( "\n" )
/*
- Check if issue title matches the issue label "Bug:"
- Check if title contains word in words
*/
if ( iss_title_lc.startsWith( bug_tag.toLowerCase( ) ) || bTriggerWordInTitle || bFoundMatchTitle || bFoundMatchBody )
{
console.log( "⚠️ " + bug_tag + " ---------------------------------------" )
console.log( "Already starts with " + bug_tag + " ......... " + iss_title_lc.startsWith( bug_tag.toLowerCase( ) ) )
console.log( "Already starts with " + feat_tag + " ..... " + iss_title_lc.startsWith( feat_tag.toLowerCase( ) ) )
console.log( "Already starts with " + urgn_tag + " ...... " + iss_title_lc.startsWith( urgn_tag.toLowerCase( ) ) )
console.log( "Already starts with " + road_tag + " ..... " + iss_title_lc.startsWith( road_tag.toLowerCase( ) ) )
// change LBL per category
add_labels.push( `${ bug_lbl }` );
console.log( `Adding Tag ....................... ${ bug_lbl }` )
console.log( "\n" )
if ( iss_author === `${{ env.BOT_NAME_DEPENDABOT }}` )
core.info( `Skipping: Detected ${ iss_author }` )
if ( iss_author === `${{ env.BOT_NAME_RENOVATE }}` )
core.info( `Skipping: Detected ${ iss_author }` )
/*
Rename title to contain Bug:
if bug title or body contains keyword hinting at the issue being about a bug; change the title of the issue
Make sure issue / pr title doesnt already contain a beginning title tag
@ref https://jsfiddle.net/aetherinox/wj17x8mp/2/
*/
if ( iss_author !== `${{ env.BOT_NAME_DEPENDABOT }}` && !bug_bFoundPRTitle && !iss_title_lc.startsWith( bug_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( feat_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( urgn_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( road_tag.toLowerCase( ) ) )
{
console.log( "Renaming Title" )
console.log( `Old Title: .................. ${ iss_title }` )
/*
If a user creates an issue starting with our tag; strip it and add ours with the emoji instead
original: Bug: CMD windows opens then closes, can't run the script.
new: 🐛 Bug: CMD windows opens then closes, can't run the script.
*/
const removeBeginning1 = bug_tag.substring(3); // "Bug:"
let removeBeginning2 = bug_tag.substring(0); // "🐛 Bug:"
removeBeginning2 = removeBeginning2.replace(/\s/g, '') // "Bug:"
if ( iss_title.startsWith(removeBeginning1) ) // "Bug:"
{
iss_title = iss_title.slice(removeBeginning1.length);
iss_title = iss_title.trim();
}
else if ( iss_title.startsWith(removeBeginning2) ) // "🐛Bug:"
{
iss_title = iss_title.slice(removeBeginning2.length);
iss_title = iss_title.trim();
}
const title = iss_title;
let title_new = title.replace( /^\s?bug\s*(.*?)\b/gi, '' );
title_new = title.replace( /^\s?fail\s*(.*?)\b/gi, '' );
title_new = title.replace( /^\s?issue\s*(.*?)\b/gi, '' );
iss_title = `${ bug_tag } ${ title_new }`;
}
console.log( `New Title: ...................... ${ iss_title }` )
await github.rest.issues.update(
{
owner: context.repo.owner, repo: context.repo.repo, issue_number: context.issue.number,
title: `${ iss_title }`, labels: add_labels
} );
}
core.setOutput( 'issue_title', iss_title )
console.log( "\n\n" )
# #
# Labels > Features
#
# this step scans the title and body of a new submitted issue for certain keywords.
# this step will then re-name the issue with a title which contains the type of issue at the front
# with whatever label is set for PREFIX_FEATURE; title change will look like the following:
# - EuropaServ changed the title
# [-] Add ability to create X
# [+] 💡 Feature: Add ability to create X
# - EuropaServ added [ Type › Feature ]
#
# There are four main types of tickets:
# 1. 🐛 Bug
# 2. 💡 Feature
# 3. 🗺️ Roadmap
# 4. ⚠ Urgent
#
# If the ticket is classified as a "Feature", the title of the ticket will be re-named to include `💡 Feature` at the beginning
# of the issue name, but then that title will be carried over to the next type of ticket to check the title again.
# #
- name: >-
🏷️ ${{ env.PREFIX_FEATURE }} › Assignment
uses: actions/github-script@v7
id: task_issues_features
with:
github-token: ${{ secrets.ADMINSERV_TOKEN_CL || github.token }}
script: |
const issueLabels = await github.rest.issues.listLabelsOnIssue(
{
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number
});
let add_labels = issueLabels.data.map( label => label.name );
let iss_title = `${{ steps.task_issues_bugs.outputs.issue_title }}` || `${ context.payload.issue.title }`;
let iss_body = `${ context.payload.issue.body }`;
let iss_author = `${ context.payload.issue.user.login }`;
const iss_title_lc = iss_title.toLowerCase( );
console.log( "Feat Title .................... " + iss_title )
console.log( "Feat Output ................... " + `${{ steps.task_issues_bugs.outputs.issue_title }}` )
console.log( "Feat Payload .................. " + `${ context.payload.issue.title }` )
/*
Tags
*/
const bug_tag = `${{ env.PREFIX_BUG }}:`;
const bug_lbl = `${{ env.LABEL_BUG }}`;
const feat_tag = `${{ env.PREFIX_FEATURE }}:`;
const feat_lbl = `${{ env.LABEL_FEATURE }}`;
const urgn_tag = `${{ env.PREFIX_URGENT }}:`;
const urgn_lbl = `${{ env.LABEL_URGENT }}`;
const road_tag = `${{ env.PREFIX_ROADMAP }}:`;
const road_lbl = `${{ env.LABEL_ROADMAP }}`;
/*
Features
Find regex based phrases
Regex:
https://regex101.com/r/fR1Hm6/3
*/
const words = [ "feature", "request", "add", "addition", "enhance", "create" ];
const bTriggerWordInTitle = words.some( s => s.includes( iss_title_lc ) || iss_title_lc.includes( s ) );
const findWordList = /(?:(?:add|enjoy|would|like|can|request|include|see|could|have)\s*?(?:the|liked?|i|we|an?|the|you?)\s*?(?:to|have|an|get|ability|request|add|feature|functionality|addon|addition|plugin|create))|(?:(?:add|see|get)\s*?support\s*?(?:for|with|of))|(?:can\s*we\s*get\s*?(?:the|a)\s*?(?:ability|feature))|(?:💡 Feature:)$/igm;
const bFoundMatchTitle = Boolean( findWordList.test( iss_title ) );
const bFoundMatchBody = Boolean( findWordList.test( iss_body ) );
/*
Do not change a title if the item starts with a PR: #
Regex:
https://regex101.com/r/JOrqbN/1
*/
const feat_findPRTitle = /^PR\s?#?(?:[0-9]*:)/igm;
const feat_bFoundPRTitle = Boolean( feat_findPRTitle.test( iss_title ) );
console.log( "Title Lowercase ............... " + iss_title_lc )
console.log( "Startswith " + feat_tag.toLowerCase( ) + "............ " + iss_title_lc.startsWith( feat_tag.toLowerCase( ) ) )
console.log( "Title Includes Keyword ........ " + bTriggerWordInTitle )
console.log( "Title Includes Regex .......... " + bFoundMatchTitle )
console.log( "Body Includes Regex ........... " + bFoundMatchBody )
console.log( "\n" )
/*
- Check if issue title matches the issue label "Feature:"
- Check if title contains word in words
*/
// change TAG per category
if ( iss_title_lc.startsWith( feat_tag.toLowerCase( ) ) || bTriggerWordInTitle || bFoundMatchTitle || bFoundMatchBody )
{
console.log( "⚠️ " + feat_tag + " ---------------------------------------" )
console.log( "Already starts with " + bug_tag + " ......... " + iss_title_lc.startsWith( bug_tag.toLowerCase( ) ) )
console.log( "Already starts with " + feat_tag + " ..... " + iss_title_lc.startsWith( feat_tag.toLowerCase( ) ) )
console.log( "Already starts with " + urgn_tag + " ...... " + iss_title_lc.startsWith( urgn_tag.toLowerCase( ) ) )
console.log( "Already starts with " + road_tag + " ..... " + iss_title_lc.startsWith( road_tag.toLowerCase( ) ) )
// change LBL per category
add_labels.push( `${ feat_lbl }` );
console.log( `Adding Tag ....................... ${ feat_lbl }` )
console.log( "\n" )
if ( iss_author === `${{ env.BOT_NAME_DEPENDABOT }}` )
core.info( `Skipping: Detected ${ iss_author }` )
if ( iss_author === `${{ env.BOT_NAME_RENOVATE }}` )
core.info( `Skipping: Detected ${ iss_author }` )
/*
Rename title to contain Feature:
if feature title or body contains keyword hinting at the issue being about a feature; change the title of the issue
Make sure issue / pr title doesnt already contain a beginning title tag
@ref https://jsfiddle.net/aetherinox/wj17x8mp/2/
*/
if ( iss_author !== `${{ env.BOT_NAME_DEPENDABOT }}` && !feat_bFoundPRTitle && !iss_title_lc.startsWith( bug_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( feat_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( urgn_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( road_tag.toLowerCase( ) ) )
{
console.log( "Renaming Title" )
console.log( `Old Title: .................. ${ iss_title }` )
/*
If a user creates an issue starting with our tag; strip it and add ours with the emoji instead
original: Feature: CMD windows opens then closes, can't run the script.
new: 💡 Feature: CMD windows opens then closes, can't run the script.
*/
const removeBeginning1 = feat_tag.substring(3); // "Feature:"
let removeBeginning2 = feat_tag.substring(0); // "💡 Feature:"
removeBeginning2 = removeBeginning2.replace(/\s/g, '') // "Feature:"
if ( iss_title.startsWith(removeBeginning1) ) // "Feature:"
{
iss_title = iss_title.slice(removeBeginning1.length);
iss_title = iss_title.trim();
}
else if ( iss_title.startsWith(removeBeginning2) ) // "💡 Feature:"
{
iss_title = iss_title.slice(removeBeginning2.length);
iss_title = iss_title.trim();
}
const title = iss_title;
let title_new = title.replace( /^\s?feature\s*(.*?)\b/gi, '' );
title_new = title.replace( /^\s?request\s*(.*?)\b/gi, '' );
title_new = title.replace( /^\s?add(.*?)\s?feature\s*(.*?)\b/gi, '' );
title_new = title.replace( /^\s?add(.*?)\s?support\s*(.*?)\b/gi, '' );
iss_title = `${ feat_tag } ${ title_new }`; // change TAG per category
}
console.log( `New Title: ...................... ${ iss_title }` )
await github.rest.issues.update(
{
owner: context.repo.owner, repo: context.repo.repo, issue_number: context.issue.number,
title: `${ iss_title }`, labels: add_labels
} );
}
core.setOutput( 'issue_title', iss_title )
console.log( "\n\n" )
# #
# Labels > Roadmap
#
# this step scans the title and body of a new submitted issue for certain keywords.
# this step will then re-name the issue with a title which contains the type of issue at the front
# with whatever label is set for PREFIX_ROADMAP; title change will look like the following:
# - EuropaServ changed the title
# [-] roadmap new feature
# [+] 🗺️ Roadmap: new feature
# - EuropaServ added [ Type › Roadmap ]
#
# There are four main types of tickets:
# 1. 🐛 Bug
# 2. 💡 Feature
# 3. 🗺️ Roadmap
# 4. ⚠ Urgent
#
# If the ticket is classified as a "Roadmap", the title of the ticket will be re-named to include `🗺️ Roadmap` at the beginning
# of the issue name, but then that title will be carried over to the next type of ticket to check the title again.
# #
- name: >-
🏷️ ${{ env.PREFIX_ROADMAP }} › Assignment
uses: actions/github-script@v7
id: task_issues_roadmap
with:
github-token: ${{ secrets.ADMINSERV_TOKEN_CL || github.token }}
script: |
const issueLabels = await github.rest.issues.listLabelsOnIssue(
{
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number
});
let add_labels = issueLabels.data.map( label => label.name );
let iss_title = `${{ steps.task_issues_features.outputs.issue_title }}` || `${ context.payload.issue.title }`;
let iss_body = `${ context.payload.issue.body }`;
let iss_author = `${ context.payload.issue.user.login }`;
const iss_title_lc = iss_title.toLowerCase( );
console.log( "Road Title .................... " + iss_title )
console.log( "Road Output ................... " + `${{ steps.task_issues_features.outputs.issue_title }}` )
console.log( "Road Payload .................. " + `${ context.payload.issue.title }` )
/*
Tags
*/
const bug_tag = `${{ env.PREFIX_BUG }}:`;
const bug_lbl = `${{ env.LABEL_BUG }}`;
const feat_tag = `${{ env.PREFIX_FEATURE }}:`;
const feat_lbl = `${{ env.LABEL_FEATURE }}`;
const urgn_tag = `${{ env.PREFIX_URGENT }}:`;
const urgn_lbl = `${{ env.LABEL_URGENT }}`;
const road_tag = `${{ env.PREFIX_ROADMAP }}:`;
const road_lbl = `${{ env.LABEL_ROADMAP }}`;
/*
Roadmap
Find regex based phrases
Roadmap requires headers #Summary and #Proposal | #Objective
Regex:
https://regex101.com/r/ucajBZ/1
*/
const words = [ "roadmap", "road map", "planned" ];
const bTriggerWordInTitle = words.some( s => s.includes( iss_title_lc ) || iss_title_lc.includes( s ) );
const findWordList = /#\s*Summary[\S\s]+#\s*(?:Proposal|Objective)[^\]]+/igm;
const bFoundMatchTitle = Boolean( findWordList.test( iss_title ) );
const bFoundMatchBody = Boolean( findWordList.test( iss_body ) );
/*
Do not change a title if the item starts with a PR: #
Regex:
https://regex101.com/r/JOrqbN/1
*/
const road_findPRTitle = /^PR\s?#?(?:[0-9]*:)/igm;
const road_bFoundPRTitle = Boolean( road_findPRTitle.test( iss_title ) );
console.log( "Title Lowercase ............... " + iss_title_lc )
console.log( "Startswith " + road_tag.toLowerCase( ) + "............ " + iss_title_lc.startsWith( road_tag.toLowerCase( ) ) )
console.log( "Title Includes Keyword ........ " + bTriggerWordInTitle )
console.log( "Title Includes Regex .......... " + bFoundMatchTitle )
console.log( "Body Includes Regex ........... " + bFoundMatchBody )
console.log( "\n" )
/*
- Check if issue title matches the issue label "Roadmap:"
- Check if title contains word in words
*/
// change TAG per category
if ( iss_title_lc.startsWith( road_tag.toLowerCase( ) ) || bTriggerWordInTitle || bFoundMatchTitle || bFoundMatchBody )
{
console.log( "⚠️ " + road_tag + " ---------------------------------------" )
console.log( "Already starts with " + bug_tag + " ......... " + iss_title_lc.startsWith( bug_tag.toLowerCase( ) ) )
console.log( "Already starts with " + feat_tag + " ..... " + iss_title_lc.startsWith( feat_tag.toLowerCase( ) ) )
console.log( "Already starts with " + urgn_tag + " ...... " + iss_title_lc.startsWith( urgn_tag.toLowerCase( ) ) )
console.log( "Already starts with " + road_tag + " ..... " + iss_title_lc.startsWith( road_tag.toLowerCase( ) ) )
// change LBL per category
add_labels.push( `${ road_lbl }` );
console.log( `Adding Tag ....................... ${ road_lbl }` )
console.log( "\n" )
if ( iss_author === `${{ env.BOT_NAME_DEPENDABOT }}` )
core.info( `Skipping: Detected ${ iss_author }` )
if ( iss_author === `${{ env.BOT_NAME_RENOVATE }}` )
core.info( `Skipping: Detected ${ iss_author }` )
/*
Rename title to contain Roadmap:
if roadmap title or body contains keyword hinting at the issue being about roadmap; change the title of the issue
Make sure issue / pr title doesnt already contain a beginning title tag
@ref https://jsfiddle.net/aetherinox/wj17x8mp/2/
*/
if ( iss_author !== `${{ env.BOT_NAME_DEPENDABOT }}` && !road_bFoundPRTitle && !iss_title_lc.startsWith( bug_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( feat_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( urgn_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( road_tag.toLowerCase( ) ) )
{
console.log( "Renaming Title" )
console.log( `Old Title: .................. ${ iss_title }` )
/*
If a user creates an issue starting with our tag; strip it and add ours with the emoji instead
original: Roadmap: CMD windows opens then closes, can't run the script.
new: 🗺️ Roadmap: CMD windows opens then closes, can't run the script.
*/
const removeBeginning1 = road_tag.substring(3); // "Roadmap:"
let removeBeginning2 = road_tag.substring(0); // "🗺️ Roadmap:"
removeBeginning2 = removeBeginning2.replace(/\s/g, '') // "Roadmap:"
if ( iss_title.startsWith(removeBeginning1) ) // "Roadmap:"
{
iss_title = iss_title.slice(removeBeginning1.length);
iss_title = iss_title.trim();
}
else if ( iss_title.startsWith(removeBeginning2) ) // "🗺️ Roadmap:"
{
iss_title = iss_title.slice(removeBeginning2.length);
iss_title = iss_title.trim();
}
const title = iss_title;
let title_new = title.replace( /^\s?broad(.*?)\s?map\s*(.*?)\b/gi, '' );
title_new = title.replace( /^\s?planned\s*(.*?)\b/gi, '' );
title_new = title.replace( /^\s?broadmap\s*(.*?)\b/gi, '' );
iss_title = `${ road_tag } ${ title_new }`; // change TAG per category
}
console.log( `New Title: .................... ${ iss_title }` )
await github.rest.issues.update(
{
owner: context.repo.owner, repo: context.repo.repo, issue_number: context.issue.number,
title: `${ iss_title }`, labels: add_labels
} );
}
core.setOutput( 'issue_title', iss_title )
console.log( "\n\n" )
# #
# Labels > Urgent
#
# this step scans the title and body of a new submitted issue for certain keywords.
# this step will then re-name the issue with a title which contains the type of issue at the front
# with whatever label is set for PREFIX_URGENT; title change will look like the following:
# - EuropaServ changed the title
# [-] emergency
# [+] ⚠ Urgent: emergency
# - EuropaServ added [ Type › Urgent ]
#
# this tag can be mixed with 🐛 Bug so that a ticket gets both tags
# - EuropaServ changed the title
# [-] emergency
# [+] 🐛 Bug: urgent issue
# - EuropaServ added [ Type › Bug ], [ Type › Urgent ]
#
# There are four main types of tickets:
# 1. 🐛 Bug
# 2. 💡 Feature
# 3. 🗺️ Roadmap
# 4. ⚠ Urgent
#
# If the ticket is classified as a "Urgent", the title of the ticket will be re-named to include `⚠ Urgent` at the beginning
# of the issue name, but then that title will be carried over to the next type of ticket to check the title again.
# #
- name: >-
🏷️ ${{ env.PREFIX_URGENT }} › Assignment
uses: actions/github-script@v7
id: task_issues_urgent
with:
github-token: ${{ secrets.ADMINSERV_TOKEN_CL || github.token }}
script: |
const issueLabels = await github.rest.issues.listLabelsOnIssue(
{
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number
});
let add_labels = issueLabels.data.map( label => label.name );
let iss_title = `${{ steps.task_issues_urgent.outputs.issue_title }}` || `${ context.payload.issue.title }`;
let iss_body = `${ context.payload.issue.body }`;
let iss_author = `${ context.payload.issue.user.login }`;
const iss_title_lc = iss_title.toLowerCase( );
console.log( "Urgn Title .................... " + iss_title )
console.log( "Urgn Output ................... " + `${{ steps.task_issues_urgent.outputs.issue_title }}` )
console.log( "Urgn Payload .................. " + `${ context.payload.issue.title }` )
/*
Tags
*/
const bug_tag = `${{ env.PREFIX_BUG }}:`;
const bug_lbl = `${{ env.LABEL_BUG }}`;
const feat_tag = `${{ env.PREFIX_FEATURE }}:`;
const feat_lbl = `${{ env.LABEL_FEATURE }}`;
const urgn_tag = `${{ env.PREFIX_URGENT }}:`;
const urgn_lbl = `${{ env.LABEL_URGENT }}`;
const road_tag = `${{ env.PREFIX_ROADMAP }}:`;
const road_lbl = `${{ env.LABEL_ROADMAP }}`;
/*
Urgent
Find regex based phrases
Regex:
https://regex101.com/r/eE9tJX/2
*/
const words = [ "urgent", "urgency", "emergency", "important", "critical" ];
const bTriggerWordInTitle = words.some( s => s.includes( iss_title_lc ) || iss_title_lc.includes( s ) );
const findWordList = /(?:(?:this)?is\s*a?n?\s*?(?:emergency|urgent|important|vital|acute|crucial|grave|pressing|serious|top.?priority|high.?priority))|(?:reply|respond|answer|write|address)\s*(?:immediate|quick|asap|urgent|now|fast|(?:as)?\s*(?:soon|quick|immediate|fast))(?:ly)?|(?:need\s*(?:help|support|fixed|answer|reply|response)!)|(?:emergency|critical|urgen(?:t|cy)|high.?priority)/igm;
const bFoundMatchTitle = Boolean( findWordList.test( iss_title ) );
const bFoundMatchBody = Boolean( findWordList.test( iss_body ) );
/*
Do not change a title if the item starts with a PR: #
Regex:
https://regex101.com/r/JOrqbN/1
*/
const urgn_findPRTitle = /^PR\s?#?(?:[0-9]*:)/igm;
const urgn_bFoundPRTitle = Boolean( urgn_findPRTitle.test( iss_title ) );
console.log( "Title Lowercase ............... " + iss_title_lc )
console.log( "Startswith " + urgn_tag.toLowerCase( ) + "............. " + iss_title_lc.startsWith( urgn_tag.toLowerCase( ) ) )
console.log( "Title Includes Keyword ........ " + bTriggerWordInTitle )
console.log( "Title Includes Regex .......... " + bFoundMatchTitle )
console.log( "Body Includes Regex ........... " + bFoundMatchBody )
console.log( "\n" )
/*
- Check if issue title matches the issue label "Urgent:"
- Check if title contains word in words
*/
// change TAG per category
if ( iss_title_lc.startsWith( urgn_tag.toLowerCase( ) ) || bTriggerWordInTitle || bFoundMatchTitle || bFoundMatchBody )
{
console.log( "⚠️ " + urgn_tag + " ---------------------------------------" )
console.log( "Already starts with " + bug_tag + " ......... " + iss_title_lc.startsWith( bug_tag.toLowerCase( ) ) )
console.log( "Already starts with " + feat_tag + " ..... " + iss_title_lc.startsWith( feat_tag.toLowerCase( ) ) )
console.log( "Already starts with " + urgn_tag + " ...... " + iss_title_lc.startsWith( urgn_tag.toLowerCase( ) ) )
console.log( "Already starts with " + road_tag + " ..... " + iss_title_lc.startsWith( road_tag.toLowerCase( ) ) )
// change LBL per category
add_labels.push( `${ urgn_lbl }` );
console.log( `Adding Tag ....................... ${ urgn_lbl }` )
console.log( "\n" )
if ( iss_author === `${{ env.BOT_NAME_DEPENDABOT }}` )
core.info( `Skipping: Detected ${ iss_author }` )
if ( iss_author === `${{ env.BOT_NAME_RENOVATE }}` )
core.info( `Skipping: Detected ${ iss_author }` )
/*
Rename title to contain Urgent:
if urgent title or body contains keyword hinting at the issue being about urgent; change the title of the issue
Make sure issue / pr title doesnt already contain a beginning title tag
@ref https://jsfiddle.net/aetherinox/wj17x8mp/2/
*/
if ( iss_author !== `${{ env.BOT_NAME_DEPENDABOT }}` && !urgn_bFoundPRTitle && !iss_title_lc.startsWith( bug_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( feat_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( urgn_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( road_tag.toLowerCase( ) ) )
{
console.log( "Renaming Title" )
console.log( `Old Title: .................. ${ iss_title }` )
/*
If a user creates an issue starting with our tag; strip it and add ours with the emoji instead
original: Urgent: CMD windows opens then closes, can't run the script.
new: ⚠ Urgent: CMD windows opens then closes, can't run the script.
*/
const removeBeginning1 = urgn_tag.substring(3); // "Urgent:"
let removeBeginning2 = urgn_tag.substring(0); // "⚠ Urgent:"
removeBeginning2 = removeBeginning2.replace(/\s/g, '') // "Urgent:"
if ( iss_title.startsWith(removeBeginning1) ) // "Urgent:"
{
iss_title = iss_title.slice(removeBeginning1.length);
iss_title = iss_title.trim();
}
else if ( iss_title.startsWith(removeBeginning2) ) // "⚠ Urgent:"
{
iss_title = iss_title.slice(removeBeginning2.length);
iss_title = iss_title.trim();
}
const title = context.payload.issue.title;
let title_new = title.replace( /^\s?emergency\s*(.*?)\b/gi, '' );
title_new = title.replace( /^\s?urgent\s*(.*?)\b/gi, '' );
title_new = title.replace( /^\s?urgency\s*(.*?)\b/gi, '' );
title_new = title.replace( /^\s?important\s*(.*?)\b/gi, '' );
title_new = title.replace( /^\s?critical\s*(.*?)\b/gi, '' );
iss_title = `${ urgn_tag } ${ title_new }`;
}
console.log( `New Title: ...................... ${ iss_title }` )
await github.rest.issues.update(
{
owner: context.repo.owner, repo: context.repo.repo, issue_number: context.issue.number,
title: `${ iss_title }`, labels: add_labels
} );
}
core.setOutput( 'issue_title', iss_title )
console.log( "\n\n" )
# #
# Job > Phrase Search
#
# Checks a message for certain keywords and then responds to the user as a reply / comment
# #
job-phrase-search:
name: >-
🏷️ Labels › Phrase Search
needs:
- job-labels-create
runs-on: ubuntu-latest
# runs-on: apollo-x64
timeout-minutes: 5
permissions:
contents: 'read'
id-token: 'write'
issues: 'write'
steps:
# #
# Phrase Search > Checkout
# #
- name: >-
☑️ Prepare
id: issues-labels-check-checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
# #
# Phrase Search > Search
#
# if an issue message contains certain keywords; have our bot reply with helpful links and information.
# #
- name: >-
👄 Search Phrases
uses: actions/github-script@v7
with:
github-token: ${{ secrets.ADMINSERV_TOKEN_CL || github.token }}
script: |
const fs = require( 'fs' );
const iss_title = `${ context.payload.issue.title }`;
const iss_body = `${ context.payload.issue.body }`;
let message = [ "\n<br />\n" ]
let bHasMessage = false
/*********************************************
Keyword > Help
**********************************************/
let HE_message =
`
💡 It appears you might need help, please check the resources below for documentation that might assist with your issue:
- [Documentation](${{github.event.repository.url}})
---
<sub>I am a bot reaching out to you with an automated response. If the above info doesn't apply to you, please ignore it.</sub>
`;
/*
found searched word "for help"
append / prepare message for bot to send
*/
const HEfindWordList = /^\b(?:have\s*(?:a|some)?\s*question*s?)|(?:can\s*you\s*(?:tell|help)\s*me)|(?:need\s*(?:some)?\s*(?:help|assistance|guidance))|(?:how\s*can\s*I\s*find)|(?:point\s*me\s*in\s*the\s*direction)|(?:where\s*can\s*I\s*find)|(?:where\s*(?:\N*)\s*(?:\N*)\s*find)|(?:please\s*help)|(?:where\s*\N*\s*(?:located|at))|(?:documentation)\b$/igm;
const HEbFoundMatchTitle = Boolean( HEfindWordList.test( iss_title ) );
const HEbFoundMatchBody = Boolean( HEfindWordList.test( iss_body ) );
if ( HEbFoundMatchTitle || HEbFoundMatchBody )
{
message.push ( HE_message );
bHasMessage = true;
}
/*
Bot has message to send
*/
if ( bHasMessage == true )
{
await github.rest.issues.createComment(
{
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: message.join('\n'),
} );
}
# #
# Job > Add Assignees
# #
job-assign-assignees:
name: >-
✍️ Issue › Assignees
runs-on: ubuntu-latest
# runs-on: apollo-x64
timeout-minutes: 5
needs: [ job-assign-labels ]
# disable
#
# if: |
# always()
# && contains( needs.*.result, 'success' )
# && !contains( needs.*.result, 'failure' )
if: false
permissions:
contents: write
steps:
# #
# [ Assignees] Assign
# #
- name: >-
✍️ Set Assignees
uses: actions/github-script@v7
with:
github-token: ${{ secrets.ADMINSERV_TOKEN_CL || github.token }}
script: |
const assignees = [ `${{ github.repository_owner }}` ];
if ( assignees.length > 0 )
{
try
{
await github.rest.issues.addAssignees(
{
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
assignees
});
}
catch ( error )
{
core.setFailed( error.message );
}
}