392 lines
14 KiB
YAML
392 lines
14 KiB
YAML
|
---
|
||
|
version: '3'
|
||
|
|
||
|
tasks:
|
||
|
brewfile:
|
||
|
deps:
|
||
|
- :install:software:brew
|
||
|
log:
|
||
|
error: Encountered error while installing Homebrew software bundle defined in `.config/Brewfile`
|
||
|
start: Installing Homebrew software bundle defined in `.config/Brewfile`
|
||
|
success: Successfully installed Homebrew software bundle defined in `.config/Brewfile`
|
||
|
cmds:
|
||
|
- brew tap Homebrew/bundle
|
||
|
- mkdir -p local
|
||
|
- cp .config/Brewfile local/Brewfile.common
|
||
|
- brew bundle install --file local/Brewfile.common
|
||
|
- |
|
||
|
if [ -f local/Brewfile ]; then
|
||
|
brew bundle install --file local/Brewfile
|
||
|
fi
|
||
|
|
||
|
extras:
|
||
|
cmds:
|
||
|
- task: :install:software:gcc
|
||
|
- task: :install:software:sshfs
|
||
|
- task: :install:software:gcloud
|
||
|
|
||
|
install-doctor:
|
||
|
log:
|
||
|
error: Error encountered while installing {{.SOFTWARE}} via https://install.doctor
|
||
|
start: Ensuring {{.SOFTWARE}} is installed using Install Doctor
|
||
|
success: Successfully installed `{{.SOFTWARE}}` via Install Doctor
|
||
|
cmds:
|
||
|
- |
|
||
|
.config/log info 'Installing `{{.SOFTWARE}}` by running `curl -sS https://install.doctor/{{.SOFTWARE}} | bash`'
|
||
|
curl -sS https://install.doctor/{{.SOFTWARE}} | bash
|
||
|
status:
|
||
|
- type {{.SOFTWARE}} &> /dev/null || [[ '{{.DOCKER_ENVIRONMENT}}' == "true" ]]
|
||
|
|
||
|
modules:global:
|
||
|
deps:
|
||
|
- :install:software:volta
|
||
|
- :install:software:yq
|
||
|
run: once
|
||
|
log:
|
||
|
error: Error pre-loading NPM global packages
|
||
|
start: Pre-loading NPM global packages
|
||
|
success: Finished pre-loading NPM global packages
|
||
|
cmds:
|
||
|
- |
|
||
|
PKGS="$(yq eval '.tasks[].cmds[0].vars.NPM_PACKAGE' .config/taskfiles/install/Taskfile-npm.yml | tr '\n' ' ')"
|
||
|
for PKG in $PKGS; do
|
||
|
if [ -f "$(echo $NODE_PATH | sed 's/^://' | sed 's/:.*//')/$PKG" ]; then
|
||
|
LIST="$LIST $PKG"
|
||
|
fi
|
||
|
done
|
||
|
if [ -n "$LIST" ]; then
|
||
|
.config/log info "Installing the following NPM packages globally - $LIST"
|
||
|
volta install $LIST
|
||
|
fi
|
||
|
status:
|
||
|
- '[[ "${container:=}" == "docker" ]]'
|
||
|
|
||
|
modules:local:
|
||
|
cmds:
|
||
|
- task: modules:local:init
|
||
|
status:
|
||
|
- '[ -n "$BUILD_DATE" ] && [ -f /.dockerenv ]'
|
||
|
|
||
|
modules:local:init:
|
||
|
deps:
|
||
|
- :install:npm:{{.NPM_PROGRAM}}
|
||
|
- :install:software:jq
|
||
|
vars:
|
||
|
PREVIOUS_DEPS:
|
||
|
sh: |
|
||
|
if [ -f .task/npm-deps ]; then
|
||
|
cat .task/npm-deps
|
||
|
else
|
||
|
echo ""
|
||
|
fi
|
||
|
env:
|
||
|
DEPS:
|
||
|
sh: jq -r -S '.dependencies + .devDependencies + .optionalDependencies + .peerDependencies' package.json
|
||
|
PREVIOUS_DEPS: '{{.PREVIOUS_DEPS}}'
|
||
|
SEMANTIC_PYTHON_POST_INSTALL: '{{if eq .SEMANTIC_RELEASE "true"}}true{{else}}false{{end}}'
|
||
|
run: when_changed
|
||
|
log:
|
||
|
error: Encountered error while installing local NPM dependencies
|
||
|
start: Installing local NPM dependencies
|
||
|
success: Successfully installed local NPM dependencies
|
||
|
cmds:
|
||
|
- task: tslib
|
||
|
- |
|
||
|
{{.NPM_PROGRAM}} config set loglevel error --location project
|
||
|
{{.NPM_PROGRAM}} config set strict-peer-dependencies false --location project
|
||
|
- cmd: |
|
||
|
if [ "$DEPS" != "$PREVIOUS_DEPS" ] || [ ! -d node_modules ]; then
|
||
|
if [ -n "$AUTO_UPDATE_NPM_PACKAGES" ]; then
|
||
|
{{.NPM_PROGRAM}} update
|
||
|
else
|
||
|
{{.NPM_PROGRAM}} install {{if eq .NPM_PROGRAM "pnpm"}}--public-hoist-pattern *types* \
|
||
|
--no-optional --loglevel error --strict-peer-dependencies false \
|
||
|
--public-hoist-pattern *eslint* --public-hoist-pattern @prettier/plugin-* \
|
||
|
--public-hoist-pattern *prettier-plugin-* --public-hoist-pattern *jest* {{end}}|| EXIT_CODE=$?
|
||
|
if [ -n "$EXIT_CODE" ]; then
|
||
|
.config/log info 'Running `{{.NPM_PROGRAM}} update` because install had non-zero exit code '"(Code $EXIT_CODE)"
|
||
|
{{.NPM_PROGRAM}} update
|
||
|
fi
|
||
|
fi
|
||
|
fi
|
||
|
mkdir -p .task
|
||
|
echo "$DEPS" > .task/npm-deps
|
||
|
ignore_error: true
|
||
|
sources:
|
||
|
- package.json
|
||
|
|
||
|
modules:local:lockfiles:
|
||
|
cmds:
|
||
|
- task: :install:npm:pnpm-lock-export
|
||
|
- task: :install:npm:synp
|
||
|
- |
|
||
|
if [ ! -f package-lock.json ]; then
|
||
|
pnpm-lock-export
|
||
|
MOVE_PACKAGE_LOCK=true
|
||
|
fi
|
||
|
if [ ! -f yarn.lock ] && [ -f package-lock.json ]; then
|
||
|
synp --source-file package-lock.json
|
||
|
mkdir -p local
|
||
|
mv yarn.lock local/yarn.lock
|
||
|
fi
|
||
|
if [ -n "$MOVE_PACKAGE_LOCK" ]; then
|
||
|
mkdir -p local
|
||
|
mv package-lock.json local/package-lock.json
|
||
|
fi
|
||
|
sources:
|
||
|
- pnpm-lock.yaml
|
||
|
|
||
|
modules:local:sync:
|
||
|
deps:
|
||
|
- modules:local
|
||
|
log:
|
||
|
error: Error while synchronizing `NPM_KEEP_UPDATED` packages with the latest version(s)
|
||
|
start: Ensuring `NPM_KEEP_UPDATED` NPM packages are the latest version
|
||
|
success: '`NPM_KEEP_UPDATED` packages are all the latest version'
|
||
|
cmds:
|
||
|
- |
|
||
|
TMP_REFRESH="$(mktemp)"
|
||
|
TMP_LIST="$(mktemp)"
|
||
|
function updateAvailable() {
|
||
|
LATEST="$(npm view $1 version)"
|
||
|
LOCAL="$(jq -r '.version' ./node_modules/$1/package.json)"
|
||
|
if ! printf '%s\n%s\n' "$LATEST" "$LOCAL" | sort -V -c > /dev/null; then
|
||
|
.config/log info "Version $LATEST is available for $1 (currently version $LOCAL)"
|
||
|
echo "true" > "$TMP_REFRESH"
|
||
|
fi
|
||
|
}
|
||
|
for PATTERN in {{if .CLI_ARGS}}{{.CLI_ARGS}}{{else}}{{.NPM_KEEP_UPDATED}}{{end}}; do
|
||
|
while read PATHH; do
|
||
|
if [ -f "$PATHH/package.json" ]; then
|
||
|
PKG="$(echo $PATHH | sed 's/.\/node_modules\///')"
|
||
|
PACKAGE_LIST="$(cat "$TMP_LIST") ${PKG}@latest"
|
||
|
echo "$PACKAGE_LIST" > "$TMP_LIST"
|
||
|
updateAvailable "$PKG" &
|
||
|
fi
|
||
|
done < <(find ./node_modules/$PATTERN -maxdepth 0)
|
||
|
done
|
||
|
wait
|
||
|
PACKAGE_LIST="$(cat "$TMP_LIST")"
|
||
|
REFRESH_PACKAGES="$(cat $TMP_REFRESH)"
|
||
|
if [[ "$REFRESH_PACKAGES" == 'true' ]]; then
|
||
|
PACKAGE_LIST="$(echo $PACKAGE_LIST | sed 's/^.//')"
|
||
|
.config/log info "Updating NPM packages configured to sync with latest version since one or more of them have an update available"
|
||
|
{{.NPM_PROGRAM}} update $PACKAGE_LIST
|
||
|
.config/log success 'Successfully updated to the following - `'"$PACKAGE_LIST"'`'
|
||
|
else
|
||
|
{{if .CLI_ARGS}}
|
||
|
.config/log info '`{{.CLI_ARGS}}` is already the latest version'
|
||
|
{{else}}
|
||
|
.config/log info "NPM packages configured to sync with latest version are all up-to-date"
|
||
|
{{end}}
|
||
|
fi
|
||
|
|
||
|
path:add:
|
||
|
vars:
|
||
|
UNAME:
|
||
|
sh: uname
|
||
|
log:
|
||
|
error: Failed to modify PATH
|
||
|
start: Adding `$HOME/{{.PATH_STRING}}` to the PATH in $HOME/.profile
|
||
|
cmds:
|
||
|
- |
|
||
|
if [ '{{OS}}' == 'darwin' ] || [ '{{OS}}' == 'linux' ]; then
|
||
|
# shellcheck disable=SC2016
|
||
|
PATH_STRING='PATH="$HOME/{{.PATH_STRING}}:$PATH"'
|
||
|
if ! grep "$PATH_STRING" "$HOME/.profile" > /dev/null; then
|
||
|
echo -e "export ${PATH_STRING}\n" >> "$HOME/.profile"
|
||
|
.config/log info "Updated the PATH variable to include ~/{{.PATH_STRING}} in $HOME/.profile"
|
||
|
fi
|
||
|
elif [[ '{{.UNAME}}' == 'CYGWIN'* ]] || [[ '{{.UNAME}}' == 'MINGW'* ]]; then
|
||
|
.config/log error "Windows is not directly supported. Use WSL or Docker." && exit 1
|
||
|
elif [[ "$OSTYPE" == 'freebsd'* ]]; then
|
||
|
.config/log error "FreeBSD support not added yet" && exit 1
|
||
|
else
|
||
|
.config/log error "System type not recognized ($OSTYPE)"
|
||
|
fi
|
||
|
|
||
|
profile:add:
|
||
|
log:
|
||
|
error: Error modifying $HOME/.profile
|
||
|
start: Adding `{{.PROFILE_STRING}}` to $HOME/.profile
|
||
|
success: Successfully modified $HOME/.profile
|
||
|
cmds:
|
||
|
- |
|
||
|
if [ '{{OS}}' == 'darwin' ] || [ '{{OS}}' == 'linux' ]; then
|
||
|
# shellcheck disable=SC2016
|
||
|
PROFILE_STRING='{{.PROFILE_STRING}}'
|
||
|
if ! cat "$HOME/.profile" | grep "$PATH_STRING" > /dev/null; then
|
||
|
echo -e "${PROFILE_STRING}\n" >> "$HOME/.profile"
|
||
|
.config/log info 'Added `{{.PROFILE_STRING}}` to '"$HOME/.profile"
|
||
|
fi
|
||
|
elif [[ "$OSTYPE" == 'cygwin' ]] || [[ "$OSTYPE" == 'msys' ]] || [[ "$OSTYPE" == 'win32' ]]; then
|
||
|
.config/log error "Windows is not directly supported. Use WSL or Docker." && exit 1
|
||
|
elif [[ "$OSTYPE" == 'freebsd'* ]]; then
|
||
|
.config/log error "FreeBSD support not added yet" && exit 1
|
||
|
else
|
||
|
.config/log error "System type not recognized"
|
||
|
fi
|
||
|
|
||
|
scoop:scan:
|
||
|
deps:
|
||
|
- :install:software:jq
|
||
|
env:
|
||
|
TMP:
|
||
|
sh: mktemp
|
||
|
log:
|
||
|
error: Error while extracting Scoop information
|
||
|
start: Extracting Scoop information
|
||
|
success: Successfully extracted Scoop information
|
||
|
cmds:
|
||
|
- jq --arg scoops "$(jq -n '[["Project", "Description"], (inputs | ["**[" + .homepage + "](" + .homepage + ")**", .description ])]' Scoops/*.json)"
|
||
|
'.scoop_var_chart = $scoops' .variables.json > "$TMP" && mv "$TMP" .variables.json
|
||
|
|
||
|
system:upgrade:
|
||
|
log:
|
||
|
error: Encountered error while upgrading system
|
||
|
start: Upgrading system packages
|
||
|
cmds:
|
||
|
- task: system:upgrade:apk
|
||
|
- task: system:upgrade:apt-get
|
||
|
- task: system:upgrade:dnf
|
||
|
- task: system:upgrade:pacman
|
||
|
- task: system:upgrade:yum
|
||
|
- task: system:upgrade:macos
|
||
|
|
||
|
system:upgrade:apk:
|
||
|
cmds:
|
||
|
- |
|
||
|
if [ "$USER" == "root" ]; then
|
||
|
.config/log info 'TODO'
|
||
|
elif type sudo &> /dev/null && sudo -n true; then
|
||
|
.config/log info 'TODO'
|
||
|
elif type sudo &> /dev/null; then
|
||
|
.config/log info 'TODO'
|
||
|
else
|
||
|
.config/log warn '`sudo` unavailable and user has no permissions'
|
||
|
fi
|
||
|
status:
|
||
|
- '[ -z "$(which apk)" ]'
|
||
|
|
||
|
system:upgrade:apt-get:
|
||
|
cmds:
|
||
|
- |
|
||
|
if [ "$USER" == "root" ]; then
|
||
|
apt-get update
|
||
|
apt-get install -y {{.PACKAGE}}
|
||
|
elif type sudo &> /dev/null && sudo -n true; then
|
||
|
sudo apt-get update
|
||
|
sudo apt -y upgrade
|
||
|
elif type sudo &> /dev/null; then
|
||
|
.config/log info 'Running `sudo apt-get update`'
|
||
|
sudo apt-get update
|
||
|
.config/log info 'Running `sudo apt -y upgrade`'
|
||
|
sudo apt -y upgrade
|
||
|
else
|
||
|
.config/log warn '`sudo` unavailable and user has no permissions'
|
||
|
fi
|
||
|
status:
|
||
|
- '[ -z "$(which apt-get)" ]'
|
||
|
|
||
|
system:upgrade:dnf:
|
||
|
cmds:
|
||
|
- |
|
||
|
if [ "$USER" == "root" ]; then
|
||
|
dnf clean all
|
||
|
dnf check-update
|
||
|
dnf update
|
||
|
elif type sudo &> /dev/null && sudo -n true; then
|
||
|
sudo dnf clean all
|
||
|
sudo dnf check-update
|
||
|
sudo dnf update
|
||
|
elif type sudo &> /dev/null; then
|
||
|
.config/log info 'Running `sudo dnf clean all`'
|
||
|
sudo dnf clean all
|
||
|
.config/log info 'Running `sudo dnf check-update`'
|
||
|
sudo dnf check-update
|
||
|
.config/log info 'Running `sudo dnf update`'
|
||
|
sudo dnf update
|
||
|
else
|
||
|
.config/log warn '`sudo` unavailable and user has no permissions'
|
||
|
fi
|
||
|
status:
|
||
|
- '[ -z "$(which dnf)" ]'
|
||
|
|
||
|
system:upgrade:macos:
|
||
|
cmds:
|
||
|
- echo "TODO Upgrade macOS system version via CLI"
|
||
|
status:
|
||
|
- '[ "{{OS}}" != "darwin" ]'
|
||
|
|
||
|
system:upgrade:pacman:
|
||
|
cmds:
|
||
|
- |
|
||
|
if [ "$USER" == "root" ]; then
|
||
|
.config/log 'TODO'
|
||
|
elif type sudo &> /dev/null && sudo -n true; then
|
||
|
.config/log 'TODO'
|
||
|
elif type sudo &> /dev/null; then
|
||
|
.config/log 'TODO'
|
||
|
else
|
||
|
.config/log warn '`sudo` unavailable and user has no permissions'
|
||
|
fi
|
||
|
status:
|
||
|
- '[ -z "$(which pacman)" ]'
|
||
|
|
||
|
system:upgrade:yum:
|
||
|
cmds:
|
||
|
- |
|
||
|
if [ "$USER" == "root" ]; then
|
||
|
yum clean all
|
||
|
yum update
|
||
|
elif type sudo &> /dev/null && sudo -n true; then
|
||
|
sudo yum clean all
|
||
|
sudo yum update
|
||
|
elif type sudo &> /dev/null; then
|
||
|
.config/log info 'Running `sudo yum clean all`'
|
||
|
sudo yum clean all
|
||
|
.config/log info 'Running `sudo yum update`'
|
||
|
sudo yum update
|
||
|
else
|
||
|
.config/log warn '`sudo` unavailable and user has no permissions'
|
||
|
fi
|
||
|
status:
|
||
|
- '[ -z "$(which yum)" ]'
|
||
|
|
||
|
tslib:
|
||
|
vars:
|
||
|
TSLIB_MSG: You can potentially optimize your bundle by setting `importHelpers` in compilerOptions
|
||
|
in tsconfig.json to `true`. After importHelpers is set to true, the taskfiles will automatically
|
||
|
install tslib.
|
||
|
run: once
|
||
|
log:
|
||
|
error: Failed to probe `tslib`
|
||
|
start: Checking if `tslib` is being used
|
||
|
cmds:
|
||
|
- |
|
||
|
if [[ "$(jq -r '.dependencies.tslib' package.json)" == 'null' ]]; then
|
||
|
if [ "$(jq -r '.compilerOptions.importHelpers' tsconfig.json)" != 'true' ]; then
|
||
|
.config/log info '{{.TSLIB_MSG}}'
|
||
|
else
|
||
|
.config/log info 'Adding `tslib` to dependencies since `importHelpers` is set to true in tsconfig.json'
|
||
|
TMP="$(mktemp)"
|
||
|
jq '.dependencies.tslib = "latest"' package.json > "$TMP"
|
||
|
mv "$TMP" package.json
|
||
|
fi
|
||
|
fi
|
||
|
status:
|
||
|
- '[ ! -f tsconfig.json ]'
|
||
|
|
||
|
ventoy:
|
||
|
cmds:
|
||
|
- task: :install:ventoy:install
|
||
|
- task: ventoy:init
|
||
|
preconditions:
|
||
|
- sh: test -d /run/media/user/Ventoy
|
||
|
msg: The `/run/media/user/Ventoy` mounted USB directory must be available!
|
||
|
|
||
|
ventoy:init:
|
||
|
deps:
|
||
|
- :install:ventoy:clone
|
||
|
- :install:ventoy:download
|