Compare commits

..

11 Commits
6.1.0 ... 7.0.0

Author SHA1 Message Date
Brooke Kuhlmann
d78eb3063d Added version release notes. 2019-01-01 12:16:07 -07:00
Brooke Kuhlmann
a547d061b2 Updated to Git Cop 3.0.0.
Includes enhanced support for XDG environment variables which don't
require support of additional tools like [direnv](https://direnv.net).

[Changes](https://github.com/bkuhlmann/git-cop/releases/tag/3.0.0).
2019-01-01 10:21:29 -07:00
Brooke Kuhlmann
f58f146074 Added Circle CI Bundler cache.
Speeds up the builds by pulling from the Bundler cache (when Gemfile
has not changed).
2018-12-30 10:45:52 -07:00
Brooke Kuhlmann
6c2de5a5bb Fixed Circle CI cache for Ruby version.
Was missing the checksum which would cause Ruby to be downloaded and
rebuilt each time.

The Docker image has been updated to use an unspecified version to
reduce version maintenance.

The `CI_RUBY_VERSION` environment variable was introduced to be
dynamically set based on value in the `.ruby-version` for improved
maintainability.
2018-12-30 10:01:44 -07:00
Brooke Kuhlmann
4d9ad7315d Removed download file function.
No longer used or recommended now that the `install_*` functions
consistently install applications in the correct location based on
application name.
2018-12-29 15:13:36 -07:00
Brooke Kuhlmann
a895090ca9 Fixed program installs.
Modifies and renames the original `install_file` function so it
calculates install path based on application name. This ensures
`install_program` has the same behavior as found with similar install
functions:
  - `install_dmg_app`
  - `install_dmg_pkg`
  - `install_zip_app`
  - `install_zip_pkg`
  - `install_tar_app`
2018-12-29 15:13:36 -07:00
Brooke Kuhlmann
0c7ae2ba4e Added README boot disk documentation.
Provides an additional reference for convenience when the scripts for
creating the boot disk are no longer available.
2018-12-29 14:06:03 -07:00
Brooke Kuhlmann
caa2adb45c Removed Java development tools from setup.
These tools were originally necessary for some of the Homebrew
applications to install successfully (especially Elasticsearch) but
those requirements are no longer necessary. This also reduces the setup
friction by requiring less manual work on behalf of the installer.
2018-12-29 14:06:03 -07:00
Brooke Kuhlmann
cc75094d5f Added README troubleshooting section.
Discovered this situation while wanting to rebuild a recently rebuilt
machine of the same operation system version. At first, thought the
original bootdisk was corrupted but turns out the system NVRAM/PRAM was
causing the issue.
2018-12-29 14:06:03 -07:00
Brooke Kuhlmann
d03762425a Fixed installation of apps with no extension.
Some apps are binaries packaged within a DMG, zip, etc. that have no
extension but are executable. These are meant to go in the
`/usr/local/bin` folder.

This corresponds with the code found in the `installers.sh` file (see
the `install_app` function).
2018-12-29 14:06:03 -07:00
Brooke Kuhlmann
2d58c953e1 Updated to Ruby 2.6.0.
[Changes](https://is.gd/MuTHWG).
2018-12-25 11:29:03 -07:00
8 changed files with 142 additions and 95 deletions

View File

@@ -1 +1 @@
2.5.3
2.6.0

View File

@@ -1,3 +1,16 @@
# 7.0.0 (2019-01-01)
- Fixed Circle CI cache for Ruby version.
- Fixed installation of apps with no extension.
- Fixed program installs.
- Added Circle CI Bundler cache.
- Added README boot disk documentation.
- Added README troubleshooting section.
- Updated to Git Cop 3.0.0.
- Updated to Ruby 2.6.0.
- Removed Java development tools from setup.
- Removed download file function.
# 6.1.0 (2018-11-01)
- Updated to Java SE Development Kit 11.

View File

@@ -3,4 +3,4 @@
source "https://rubygems.org"
gem "rake", "~> 12.0"
gem "git-cop", "~> 2.2"
gem "git-cop", "~> 3.0"

View File

@@ -26,7 +26,9 @@ the two projects are meant to be used:
- [Requirements](#requirements)
- [Setup](#setup)
- [Usage](#usage)
- [Boot Disk](#boot-disk)
- [Customization](#customization)
- [Troubleshooting](#troubleshooting)
- [Versioning](#versioning)
- [Code of Conduct](#code-of-conduct)
- [Contributions](#contributions)
@@ -41,9 +43,7 @@ the two projects are meant to be used:
- Provides a command line interface, written in Bash, with no additional dependencies for
installation and management of a macOS machine.
- Supports macOS boot disk creation for fresh install of operating system.
- Downloads and installs development tools (required by Homebrew):
- [Xcode Command Line Tools](https://developer.apple.com/xcode)
- [Java SE Development Kit](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)
- Downloads and installs [Xcode Command Line Tools](https://developer.apple.com/xcode).
- Downloads, installs, and configures [Homebrew Formulas](http://brew.sh).
- Downloads, installs, and configures [Homebrew Casks](https://caskroom.github.io).
- Downloads, installs, and configures
@@ -72,7 +72,7 @@ Current Version (stable):
git clone https://github.com/bkuhlmann/mac_os.git
cd mac_os
git checkout 6.1.0
git checkout 7.0.0
Master Version (unstable):
@@ -125,6 +125,31 @@ been loaded.
It is recommended that the `mac_os` project directory not be deleted and kept on the local machine
in order to manage installed software and benefit from future upgrades.
### Boot Disk
When attempting to create a boot disk via `bin/run B`, you'll be presented with the following
documentation (provided here for reference):
macOS Boot Disk Tips
- Use a USB drive (8GB or higher).
- Use Disk Utility to format the USB drive as "Mac OS Extended (Journaled)".
- Use Disk Utility to label the USB drive as "Untitled".
macOS Boot Disk Usage:
1. Insert the USB boot disk into the machine to be upgraded.
2. Reboot the machine.
3. Hold down the OPTION key before the Apple logo appears.
4. Select the USB boot disk from the menu.
5. Use Disk Utility to format the machine's drive as "APFS (Encrypted)".
6. Install the new operating system.
macOS Reinstall:
1. Click the Apple icon from the operating system main menu.
2. Select the "Restart..." menu option.
3. Hold down the COMMAND+R keys before the Apple logo appears.
4. Wait for the macOS installer to load from the recovery partition.
5. Use the dialog options to launch Disk Utility, reinstall the system, etc.
### Customization
All executable scripts can be found in the `bin` folder:
@@ -152,6 +177,16 @@ project is built upon the functions found in the `lib` folder. See the
- `lib/settings.sh`: Defines global settings for software applications, extensions, etc.
## Troubleshooting
When using the boot disk, you might experience a situation where you see a black screen with a white
circle and diagonal line running through it. This means macOS lost or can't find the boot disk for
some reason. To correct this, shut down and boot up the system again while holding down the
`OPTION+COMMAND+R+P` keys simultaneously. You might want to wait for the system boot sound to happen
a few times before releasing the keys. This will clear the system NVRAM/PRAM. At this point you can
shut down and restart the system following the boot disk instructions (the boot disk will be
recognized now).
## Versioning
Read [Semantic Versioning](https://semver.org) for details. Briefly, it means:

View File

@@ -11,13 +11,3 @@ if [[ "$xcode_response" != "y" ]]; then
printf "ERROR: Xcode CLI tools must be installed before proceeding.\n"
exit 1
fi
printf "Installing $JAVA_LABEL...\n"
printf "%s\n" "You must manually accept the license and download the $JAVA_LABEL: $JAVA_DOWNLOAD_URL."
open $JAVA_DOWNLOAD_URL
read -p "Have you completed the $JAVA_LABEL install (y/n)? " java_response
if [[ "$java_response" != "y" ]]; then
printf "ERROR: $JAVA_LABEL must be installed before proceeding.\n"
exit 1
fi

View File

@@ -3,7 +3,7 @@ jobs:
build:
working_directory: ~/project
docker:
- image: circleci/ruby:2.5
- image: circleci/ruby
environment:
BUNDLE_JOBS: 3
BUNDLE_RETRY: 3
@@ -12,19 +12,47 @@ jobs:
steps:
- checkout
- run:
name: Environment Setup
command: |
printf "%s\n" 'export CI_RUBY_VERSION=$(cat ".ruby-version" | tr -d "\n")' >> $BASH_ENV
- type: cache-restore
name: Bundler Cache Restore
key: bundle-{{ checksum "Gemfile" }}
name: Ruby Restore
key: ruby-{{checksum ".ruby-version"}}
- run:
name: Ruby Install
command: |
curl https://cache.ruby-lang.org/pub/ruby/${CI_RUBY_VERSION::-2}/ruby-$CI_RUBY_VERSION.tar.bz2 > ../ruby-$CI_RUBY_VERSION.tar.gz
cd ..
tar --extract --bzip2 --verbose --file ruby-$CI_RUBY_VERSION.tar.gz
cd ruby-$CI_RUBY_VERSION
./configure
make
make update-gems
make extract-gems
sudo make install
- type: cache-save
name: Ruby Store
key: ruby-{{checksum ".ruby-version"}}
paths:
- ../ruby-$CI_RUBY_VERSION
- type: cache-restore
name: Bundler Restore
key: bundler-{{checksum "Gemfile"}}
- run:
name: Bundler Install
command: |
gem update --system
bundle check || bundle install
bundle install --path vendor/bundle
- type: cache-save
name: Bundler Cache Store
key: bundle-{{ checksum "Gemfile" }}
name: Bundler Store
key: bundler-{{checksum "Gemfile"}}
paths:
- vendor/bundle

View File

@@ -9,11 +9,11 @@ install_dmg_app() {
local mount_point="/Volumes/$2"
local app_name="$3"
local install_path=$(get_install_path "$app_name")
local download_file="download.dmg"
local work_file="download.dmg"
if [[ ! -e "$install_path" ]]; then
download_installer "$url" "$download_file"
mount_image "$MAC_OS_WORK_PATH/$download_file"
download_file "$url" "$work_file"
mount_image "$MAC_OS_WORK_PATH/$work_file"
install_app "$mount_point" "$app_name"
unmount_image "$mount_point"
verify_application "$app_name"
@@ -28,11 +28,11 @@ install_dmg_pkg() {
local mount_point="/Volumes/$2"
local app_name="$3"
local install_path=$(get_install_path "$app_name")
local download_file="download.dmg"
local work_file="download.dmg"
if [[ ! -e "$install_path" ]]; then
download_installer "$url" "$download_file"
mount_image "$MAC_OS_WORK_PATH/$download_file"
download_file "$url" "$work_file"
mount_image "$MAC_OS_WORK_PATH/$work_file"
install_pkg "$mount_point" "$app_name"
unmount_image "$mount_point"
printf "Installed: $app_name.\n"
@@ -47,15 +47,15 @@ install_zip_app() {
local url="$1"
local app_name="$2"
local install_path=$(get_install_path "$app_name")
local download_file="download.zip"
local work_file="download.zip"
if [[ ! -e "$install_path" ]]; then
download_installer "$url" "$download_file"
download_file "$url" "$work_file"
(
printf "Preparing...\n"
cd "$MAC_OS_WORK_PATH"
unzip -q "$download_file"
unzip -q "$work_file"
find . -type d -name "$app_name" -print -exec cp -pR {} . > /dev/null 2>&1 \;
)
@@ -66,6 +66,30 @@ install_zip_app() {
}
export -f install_zip_app
# Installs a package via a zip file.
# Parameters: $1 (required) - URL, $2 (required) - Application name.
install_zip_pkg() {
local url="$1"
local app_name="$2"
local install_path=$(get_install_path "$app_name")
local work_file="download.zip"
if [[ ! -e "$install_path" ]]; then
download_file "$url" "$work_file"
(
printf "Preparing...\n"
cd "$MAC_OS_WORK_PATH"
unzip -q "$work_file"
)
install_pkg "$MAC_OS_WORK_PATH" "$app_name"
printf "Installed: $app_name.\n"
verify_application "$app_name"
fi
}
export -f install_zip_pkg
# Installs an application via a tar file.
# Parameters: $1 (required) - URL, $2 (required) - Application name, $3 (required) - Decompress options.
install_tar_app() {
@@ -73,15 +97,15 @@ install_tar_app() {
local app_name="$2"
local options="$3"
local install_path=$(get_install_path "$app_name")
local download_file="download.tar"
local work_file="download.tar"
if [[ ! -e "$install_path" ]]; then
download_installer "$url" "$download_file"
download_file "$url" "$work_file"
(
printf "Preparing...\n"
cd "$MAC_OS_WORK_PATH"
tar "$options" "$download_file"
tar "$options" "$work_file"
)
install_app "$MAC_OS_WORK_PATH" "$app_name"
@@ -91,29 +115,23 @@ install_tar_app() {
}
export -f install_tar_app
# Installs a package via a zip file.
# Parameters: $1 (required) - URL, $2 (required) - Application name.
install_zip_pkg() {
# Installs program (single file).
# Parameters: $1 (required) - URL, $2 (required) - Program name.
install_program() {
local url="$1"
local app_name="$2"
local install_path=$(get_install_path "$app_name")
local download_file="download.zip"
local program_name="$2"
local install_path=$(get_install_path "$program_name")
if [[ ! -e "$install_path" ]]; then
download_installer "$url" "$download_file"
(
printf "Preparing...\n"
cd "$MAC_OS_WORK_PATH"
unzip -q "$download_file"
)
install_pkg "$MAC_OS_WORK_PATH" "$app_name"
printf "Installed: $app_name.\n"
verify_application "$app_name"
printf "Installing: $install_path...\n"
download_file "$url" "$program_name"
mv "$MAC_OS_WORK_PATH/$program_name" "$install_path"
chmod 755 "$install_path"
printf "Installed: $program_name.\n"
verify_application "$program_name"
fi
}
export -f install_zip_pkg
export -f install_program
# Installs application code from a Git repository.
# Parameters: $1 (required) - Repository URL, $2 (required) - Install path, $3 (optional) - Git clone options.
@@ -154,9 +172,9 @@ install_git_project() {
}
export -f install_git_project
# Downloads an installer to local disk.
# Parameters: $1 (required) - URL, $2 (required) - File name, $3 (required) - HTTP header.
download_installer() {
# Downloads remote file to local disk.
# Parameters: $1 (required) - URL, $2 (required) - File name, $3 (optional) - HTTP header.
download_file() {
local url="$1"
local file_name="$2"
local http_header="$3"
@@ -166,38 +184,7 @@ download_installer() {
mkdir $MAC_OS_WORK_PATH
curl --header "$http_header" --location --retry 3 --retry-delay 5 --fail --silent --show-error "$url" >> "$MAC_OS_WORK_PATH/$file_name"
}
export -f download_installer
# Downloads an installer to the $HOME/Downloads folder for manual use.
# Parameters: $1 (required) - URL, $2 (required) - File name.
download_only() {
if [[ -e "$HOME/Downloads/$2" ]]; then
printf "Downloaded: $2.\n"
else
printf "Downloading $1...\n"
download_installer "$1" "$2"
mv "$MAC_OS_WORK_PATH/$2" "$HOME/Downloads"
fi
}
export -f download_only
# Installs a single file.
# Parameters: $1 (required) - URL, $2 (required) - Install path.
install_file() {
local file_url="$1"
local file_name=$(get_file_name "$1")
local install_path="$2"
if [[ ! -e "$install_path" ]]; then
printf "Installing: $install_path...\n"
download_installer "$file_url" "$file_name"
mkdir -p $(dirname "$install_path")
mv "$MAC_OS_WORK_PATH/$file_name" "$install_path"
printf "Installed: $file_name.\n"
verify_path "$install_path"
fi
}
export -f install_file
export -f download_file
# Installs an application.
# Parameters: $1 (required) - Application source path, $2 (required) - Application name.
@@ -208,6 +195,8 @@ install_app() {
printf "Installing: $install_root/$2...\n"
case $file_extension in
'')
cp -a "$1/$2" "$install_root";;
'app')
cp -a "$1/$2" "$install_root";;
'prefPane')

View File

@@ -1,19 +1,11 @@
#! /usr/bin/env bash
# Defines global settings.
# General
set -o nounset
set -o errexit
set -o pipefail
IFS=$'\n\t'
# Globals
export MAC_OS_BOOT_DISK_CREATOR="/Applications/Install macOS Mojave.app/Contents/Resources/createinstallmedia"
export MAC_OS_BOOT_DISK_PATH="/Volumes/Untitled"
export MAC_OS_WORK_PATH=/tmp/downloads
export MAC_OS_CONFIG_PATH="../mac_os-config"
# Java
export JAVA_LABEL="Java SE Development Kit"
export JAVA_DOWNLOAD_URL="https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html"