install.fairie/.config/taskfiles/install/Taskfile.yml

392 lines
14 KiB
YAML
Raw Normal View History

2022-12-24 12:04:59 -08:00
---
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