From e5f03e0b069776a044382cf9ded1f7485dd08315 Mon Sep 17 00:00:00 2001 From: Joe Previte Date: Thu, 23 Sep 2021 16:08:28 -0700 Subject: [PATCH 1/2] fix: add checks and handle errors brew-bump.sh feat(script): add steps-lib, is_env_var_set & test feat(brew-bump): add check for VERSION feat(brew-bump): check HOMEBREW_GITHUB_API_TOKEN feat(steps-lib): add directory_exists helper fn fix(brew-bump): check that git clone worked feat(brew-bump): add check for remote upstream fix: remove upstream command thing feat(steps-lib): add file_exists helper function feat(brew-bump): add check for git-askpass.sh feat(steps-lib): add is_executable function & test feat(brew-bump): add check for is_executable refactor: use GIT_ASKPASS as variable --- ci/steps/brew-bump.sh | 66 +++++++++++++++++++++++++++++++++---- ci/steps/steps-lib.sh | 47 ++++++++++++++++++++++++++ test/scripts/steps-lib.bats | 46 ++++++++++++++++++++++++++ 3 files changed, 152 insertions(+), 7 deletions(-) create mode 100755 ci/steps/steps-lib.sh create mode 100644 test/scripts/steps-lib.bats diff --git a/ci/steps/brew-bump.sh b/ci/steps/brew-bump.sh index f3f9be7c..ded41bec 100755 --- a/ci/steps/brew-bump.sh +++ b/ci/steps/brew-bump.sh @@ -5,6 +5,21 @@ main() { cd "$(dirname "$0")/../.." # Only sourcing this so we get access to $VERSION source ./ci/lib.sh + source ./ci/steps/steps-lib.sh + + echo "Checking environment variables" + + # We need VERSION to bump the brew formula + if [[ $(is_env_var_set "VERSION") -eq 1 ]]; then + echo "VERSION is not set" + exit 1 + fi + + # We need HOMEBREW_GITHUB_API_TOKEN to push up commits + if [[ $(is_env_var_set "HOMEBREW_GITHUB_API_TOKEN") -eq 1 ]]; then + echo "HOMEBREW_GITHUB_API_TOKEN is not set" + exit 1 + fi # NOTE: we need to make sure cdrci/homebrew-core # is up-to-date @@ -13,27 +28,62 @@ main() { echo "Cloning cdrci/homebrew-core" git clone https://github.com/cdrci/homebrew-core.git + # Make sure the git clone step is successful + if [[ $(directory_exists "homebrew-core") -eq 1 ]]; then + echo "git clone failed. Cannot find homebrew-core directory." + ls -la + exit 1 + fi + echo "Changing into homebrew-core directory" cd homebrew-core && pwd - echo "Adding Homebrew/homebrew-core as $(upstream)" + echo "Adding Homebrew/homebrew-core" git remote add upstream https://github.com/Homebrew/homebrew-core.git + # Make sure the git remote step is successful + if ! git config remote.upstream.url > /dev/null; then + echo "git remote add upstream failed." + echo "Could not find upstream in list of remotes." + git remote -v + exit 1 + fi + + # TODO@jsjoeio - can I somehow check that this succeeded? echo "Fetching upstream Homebrew/hombrew-core commits" git fetch upstream + # TODO@jsjoeio - can I somehow check that this succeeded? echo "Merging in latest Homebrew/homebrew-core changes" git merge upstream/master echo "Pushing changes to cdrci/homebrew-core fork on GitHub" - # Source: https://serverfault.com/a/912788 - # shellcheck disable=SC2016,SC2028 - echo '#!/bin/sh\nexec echo "$HOMEBREW_GITHUB_API_TOKEN"' > "$HOME"/.git-askpass.sh - # Ensure it's executable since we just created it - chmod +x "$HOME/.git-askpass.sh" + # GIT_ASKPASS lets us use the password when pushing without revealing it in the process list # See: https://serverfault.com/a/912788 - GIT_ASKPASS="$HOME/.git-askpass.sh" git push https://cdr-oss@github.com/cdr-oss/homebrew-core.git --all + GIT_ASKPASS="$HOME/git-askpass.sh" + # Source: https://serverfault.com/a/912788 + # shellcheck disable=SC2016,SC2028 + echo '#!/bin/sh\nexec echo "$HOMEBREW_GITHUB_API_TOKEN"' > "$GIT_ASKPASS" + + # Make sure the git-askpass.sh file creation is successful + if [[ $(file_exists "git-askpass.sh") -eq 1 ]]; then + echo "git-askpass.sh not found in $HOME." + ls -la "$HOME" + exit 1 + fi + + # Ensure it's executable since we just created it + chmod +x "$GIT_ASKPASS" + + # Make sure the git-askpass.sh file is executable + if [[ $(is_executable "$GIT_ASKPASS") -eq 1 ]]; then + echo "git-askpass.sh is not executable." + ls -la "$GIT_ASKPASS" + exit 1 + fi + + git push https://cdr-oss@github.com/cdr-oss/homebrew-core.git --all # Find the docs for bump-formula-pr here # https://github.com/Homebrew/brew/blob/master/Library/Homebrew/dev-cmd/bump-formula-pr.rb#L18 @@ -50,6 +100,8 @@ main() { # Clean up and remove homebrew-core cd .. rm -rf homebrew-core + + # TODO@jsjoeio - check that homebrew-core was removed } main "$@" diff --git a/ci/steps/steps-lib.sh b/ci/steps/steps-lib.sh new file mode 100755 index 00000000..1b07acde --- /dev/null +++ b/ci/steps/steps-lib.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash + +# This is a library which contains functions used inside ci/steps +# +# We separated it into it's own file so that we could easily unit test +# these functions and helpers + +# Checks whether and environment variable is set. +# Source: https://stackoverflow.com/a/62210688/3015595 +is_env_var_set() { + local name="${1:-}" + if test -n "${!name:-}"; then + echo 0 + else + echo 1 + fi +} + +# Checks whether a directory exists. +directory_exists() { + local dir="${1:-}" + if [[ -d "${dir:-}" ]]; then + echo 0 + else + echo 1 + fi +} + +# Checks whether a file exists. +file_exists() { + local file="${1:-}" + if test -f "${file:-}"; then + echo 0 + else + echo 1 + fi +} + +# Checks whether a file is executable. +is_executable() { + local file="${1:-}" + if [ -f "${file}" ] && [ -r "${file}" ] && [ -x "${file}" ]; then + echo 0 + else + echo 1 + fi +} diff --git a/test/scripts/steps-lib.bats b/test/scripts/steps-lib.bats new file mode 100644 index 00000000..0764fcb3 --- /dev/null +++ b/test/scripts/steps-lib.bats @@ -0,0 +1,46 @@ +#!/usr/bin/env bats + +SCRIPT_NAME="steps-lib.sh" +SCRIPT="$BATS_TEST_DIRNAME/../../ci/steps/$SCRIPT_NAME" + +source "$SCRIPT" + +@test "is_env_var_set should return 1 if env var is not set" { + run is_env_var_set "ASDF_TEST_SET" + [ "$output" = 1 ] +} + +@test "is_env_var_set should return 0 if env var is set" { + ASDF_TEST_SET="test" run is_env_var_set "ASDF_TEST_SET" + [ "$output" = 0 ] +} + +@test "directory_exists should 1 if directory doesn't exist" { + run directory_exists "/tmp/asdfasdfasdf" + [ "$output" = 1 ] +} + +@test "directory_exists should 0 if directory exists" { + run directory_exists "$(pwd)" + [ "$output" = 0 ] +} + +@test "file_exists should 1 if file doesn't exist" { + run file_exists "hello-asfd.sh" + [ "$output" = 1 ] +} + +@test "file_exists should 0 if file exists" { + run file_exists "$SCRIPT" + [ "$output" = 0 ] +} + +@test "is_executable should 1 if file isn't executable" { + run is_executable "hello-asfd.sh" + [ "$output" = 1 ] +} + +@test "is_executable should 0 if file is executable" { + run is_executable "$SCRIPT" + [ "$output" = 0 ] +} \ No newline at end of file From 8ef950af4cadd1cc56af189cb3e7fe599dc42e08 Mon Sep 17 00:00:00 2001 From: Joe Previte Date: Fri, 24 Sep 2021 15:26:20 -0700 Subject: [PATCH 2/2] feat(brew-bump): add check for cleanup step --- ci/steps/brew-bump.sh | 33 ++++++++++++++++++++------------- ci/steps/steps-lib.sh | 16 ++++++++-------- test/scripts/steps-lib.bats | 16 ++++++++-------- 3 files changed, 36 insertions(+), 29 deletions(-) diff --git a/ci/steps/brew-bump.sh b/ci/steps/brew-bump.sh index ded41bec..6e6889c5 100755 --- a/ci/steps/brew-bump.sh +++ b/ci/steps/brew-bump.sh @@ -10,13 +10,13 @@ main() { echo "Checking environment variables" # We need VERSION to bump the brew formula - if [[ $(is_env_var_set "VERSION") -eq 1 ]]; then + if is_env_var_set "VERSION"; then echo "VERSION is not set" exit 1 fi # We need HOMEBREW_GITHUB_API_TOKEN to push up commits - if [[ $(is_env_var_set "HOMEBREW_GITHUB_API_TOKEN") -eq 1 ]]; then + if is_env_var_set "HOMEBREW_GITHUB_API_TOKEN"; then echo "HOMEBREW_GITHUB_API_TOKEN is not set" exit 1 fi @@ -29,14 +29,14 @@ main() { git clone https://github.com/cdrci/homebrew-core.git # Make sure the git clone step is successful - if [[ $(directory_exists "homebrew-core") -eq 1 ]]; then + if directory_exists "homebrew-core"; then echo "git clone failed. Cannot find homebrew-core directory." ls -la exit 1 fi echo "Changing into homebrew-core directory" - cd homebrew-core && pwd + pushd homebrew-core && pwd echo "Adding Homebrew/homebrew-core" git remote add upstream https://github.com/Homebrew/homebrew-core.git @@ -61,28 +61,31 @@ main() { # GIT_ASKPASS lets us use the password when pushing without revealing it in the process list # See: https://serverfault.com/a/912788 - GIT_ASKPASS="$HOME/git-askpass.sh" + PATH_TO_GIT_ASKPASS="$HOME/git-askpass.sh" # Source: https://serverfault.com/a/912788 # shellcheck disable=SC2016,SC2028 - echo '#!/bin/sh\nexec echo "$HOMEBREW_GITHUB_API_TOKEN"' > "$GIT_ASKPASS" + echo 'echo $HOMEBREW_GITHUB_API_TOKEN' > "$PATH_TO_ASKPASS" # Make sure the git-askpass.sh file creation is successful - if [[ $(file_exists "git-askpass.sh") -eq 1 ]]; then + if file_exists "$PATH_TO_GIT_ASKPASS"; then echo "git-askpass.sh not found in $HOME." ls -la "$HOME" exit 1 fi # Ensure it's executable since we just created it - chmod +x "$GIT_ASKPASS" + chmod +x "$PATH_TO_GIT_ASKPASS" # Make sure the git-askpass.sh file is executable - if [[ $(is_executable "$GIT_ASKPASS") -eq 1 ]]; then - echo "git-askpass.sh is not executable." - ls -la "$GIT_ASKPASS" + if is_executable "$PATH_TO_GIT_ASKPASS"; then + echo "$PATH_TO_GIT_ASKPASS is not executable." + ls -la "$PATH_TO_GIT_ASKPASS" exit 1 fi + # Export the variables so git sees them + export HOMEBREW_GITHUB_API_TOKEN="$HOMEBREW_GITHUB_API_TOKEN" + export GIT_ASKPASS="$PATH_TO_ASKPASS" git push https://cdr-oss@github.com/cdr-oss/homebrew-core.git --all # Find the docs for bump-formula-pr here @@ -98,10 +101,14 @@ main() { fi # Clean up and remove homebrew-core - cd .. + popd rm -rf homebrew-core - # TODO@jsjoeio - check that homebrew-core was removed + # Make sure homebrew-core is removed + if directory_exists "homebrew-core"; then + echo "rm -rf homebrew-core failed." + ls -la + fi } main "$@" diff --git a/ci/steps/steps-lib.sh b/ci/steps/steps-lib.sh index 1b07acde..e71378e2 100755 --- a/ci/steps/steps-lib.sh +++ b/ci/steps/steps-lib.sh @@ -10,9 +10,9 @@ is_env_var_set() { local name="${1:-}" if test -n "${!name:-}"; then - echo 0 + return 0 else - echo 1 + return 1 fi } @@ -20,9 +20,9 @@ is_env_var_set() { directory_exists() { local dir="${1:-}" if [[ -d "${dir:-}" ]]; then - echo 0 + return 0 else - echo 1 + return 1 fi } @@ -30,9 +30,9 @@ directory_exists() { file_exists() { local file="${1:-}" if test -f "${file:-}"; then - echo 0 + return 0 else - echo 1 + return 1 fi } @@ -40,8 +40,8 @@ file_exists() { is_executable() { local file="${1:-}" if [ -f "${file}" ] && [ -r "${file}" ] && [ -x "${file}" ]; then - echo 0 + return 0 else - echo 1 + return 1 fi } diff --git a/test/scripts/steps-lib.bats b/test/scripts/steps-lib.bats index 0764fcb3..2071a062 100644 --- a/test/scripts/steps-lib.bats +++ b/test/scripts/steps-lib.bats @@ -7,40 +7,40 @@ source "$SCRIPT" @test "is_env_var_set should return 1 if env var is not set" { run is_env_var_set "ASDF_TEST_SET" - [ "$output" = 1 ] + [ "$status" = 1 ] } @test "is_env_var_set should return 0 if env var is set" { ASDF_TEST_SET="test" run is_env_var_set "ASDF_TEST_SET" - [ "$output" = 0 ] + [ "$status" = 0 ] } @test "directory_exists should 1 if directory doesn't exist" { run directory_exists "/tmp/asdfasdfasdf" - [ "$output" = 1 ] + [ "$status" = 1 ] } @test "directory_exists should 0 if directory exists" { run directory_exists "$(pwd)" - [ "$output" = 0 ] + [ "$status" = 0 ] } @test "file_exists should 1 if file doesn't exist" { run file_exists "hello-asfd.sh" - [ "$output" = 1 ] + [ "$status" = 1 ] } @test "file_exists should 0 if file exists" { run file_exists "$SCRIPT" - [ "$output" = 0 ] + [ "$status" = 0 ] } @test "is_executable should 1 if file isn't executable" { run is_executable "hello-asfd.sh" - [ "$output" = 1 ] + [ "$status" = 1 ] } @test "is_executable should 0 if file is executable" { run is_executable "$SCRIPT" - [ "$output" = 0 ] + [ "$status" = 0 ] } \ No newline at end of file