diff --git a/.gitea/workflows/test.yaml b/.gitea/workflows/test.yaml index 36301a8..4145ac4 100644 --- a/.gitea/workflows/test.yaml +++ b/.gitea/workflows/test.yaml @@ -1,10 +1,10 @@ -name: "test" -run-name: "test" +name: "tests" +run-name: "tests" on: push jobs: - test: - runs-on: action + test-gomod: + runs-on: wind steps: - uses: actions/checkout@v4 @@ -26,6 +26,28 @@ jobs: shell: bash run: go version | grep "go version go1.24.0 linux/amd64" + - name: "check go installed command" + shell: bash + run: mctl -v | grep "mctl version v0.3.4" + + test-versioninput: + runs-on: wind + steps: + - uses: actions/checkout@v4 + - name: "install go with version input" + shell: bash + env: + GO_INSTALL_COMMANDS: code.jakeyoungdev.com/jake/mctl@v0.3.4 + GO_INSTALL_VERSION: 1.23.2 + GO_INSTALL_ARCH: amd64 + run: | + chmod +x install.sh + ./install.sh + + - name: "check go version" + shell: bash + run: go version | grep "go version go1.23.2 linux/amd64" + - name: "check go installed command" shell: bash run: mctl -v | grep "mctl version v0.3.4" \ No newline at end of file diff --git a/README.md b/README.md index 60f987b..6ae6a55 100644 --- a/README.md +++ b/README.md @@ -4,25 +4,26 @@ An extremely simple github action to install golang and golang commands (using " ## Usage -Use a tagged release to avoid unexpected changes that may come to the master branch +Use a tagged release to avoid unexpected changes that may come to the main branch ```yaml name: "install go" - uses: https://code.jakeyoungdev.com/actions/install-go@master + uses: https://code.jakeyoungdev.com/actions/install-go@main with: commands: | code.jakeyoungdev.com/jake/mctl@v0.3.3 ``` #### Go verions -Go version is determined using the go.mod file in the root of working directory. Go files are pulled directly from the go download [site](https://go.dev/dl/) and all go commands are installed using 'go install' after setup. If a Go version is already present the 'purge' input must be set to 'yes' to avoid errors. +The go version installed is either determined by the version input, or the version found in a go.mod file if the input is not set. Go files are pulled directly from the Go download [site](https://go.dev/dl/) and all go commands are installed using 'go install' after setup. If a different version of Go is already installed the 'purge' input must be set to 'yes' to remove it and avoid errors. + #### Inputs Some inputs are available to customize the installation |Input|Required|Values|Default|Description| |---|---|---|---|---| -|arch|no|any arch for Go|amd64|system architecture for golang -|purge|no|yes/no|no|remove any golang files found on system before install +|arch|no|any arch for Go|amd64|system architecture for go +|purge|no|yes/no|no|remove any go files found on system before install |commands|no|any public go repositories|.|links to any commands to be installed using 'go install' - +|version|no|any go version|version in go.mod file|the go version to install ## Issues This repo is a as brain-dead as I could make it and is intended to be as fast and low-level as possible. Please open an issue for any problems or suggestions. \ No newline at end of file diff --git a/action.yaml b/action.yaml index dbe0be6..90de116 100644 --- a/action.yaml +++ b/action.yaml @@ -13,6 +13,9 @@ inputs: description: "Optional, any commands to be installed with 'go install', must include version" required: false default: "." + version: + description: "Optional, the Go version to install if no go.mod file is present" + required: false runs: using: composite steps: @@ -22,4 +25,5 @@ runs: env: GO_INSTALL_COMMANDS: ${{ inputs.commands }} GO_INSTALL_ARCH: ${{ inputs.arch }} - GO_INSTALL_PURGE: ${{ inputs.purge }} \ No newline at end of file + GO_INSTALL_PURGE: ${{ inputs.purge }} + GO_INSTALL_VERSION: ${{ inputs.version }} \ No newline at end of file diff --git a/install.sh b/install.sh index 20ab819..f6224cf 100755 --- a/install.sh +++ b/install.sh @@ -1,15 +1,17 @@ #!/bin/bash -#installs any commands set in the command input value +## +# installs commands using "go install" if any are set in the commands input +## function installCommands { - #if commands input is set pull the input and install them all using 'go install' - if [[ "$GO_INSTALL_COMMANDS" != "." ]]; then # "." is used as a default - #allows for multiple cmds using | + # "." is used as a default, meaning no commands were added + if [[ "$GO_INSTALL_COMMANDS" != "." ]]; then + #splitting into an array allows for multiple cmds using | INPUT_ARR=( $GO_INSTALL_COMMANDS ) for i in "${INPUT_ARR[@]}"; do echo "Installing go command from ${i}" if go install ${i}; then - echo "Command setup for ${i}" + echo "Installed ${i}" else echo "FATAL: Unable to install ${i} with go" exit 1 @@ -18,41 +20,52 @@ function installCommands { fi } -#start script -echo "Starting Golang install" +## +# fix version ensures we have a patch level version on our go version string from the go.mod file +## +function fixVersion { + DL_VSPL=( $DL_VERSION_RAW ) + DL_VERSION="${DL_VSPL[1]}" + + # -P uses perl syntax + DL_VERSION_PAD_CHECK="$(grep "^go [0-9]+.[0-9]+.[0-9]+" go.mod -P)" + if [[ -z "$DL_VERSION_PAD_CHECK" ]]; then + DL_VERSION="$DL_VERSION"".0" + echo "Fixing version number to ${DL_VERSION}" + fi +} + +#start -#validate version and architecture echo "Parsing go version" -#looking for go version in go.mod file, only checking up to minor version ignoring patch value to allow for stable versions -# -P uses perl syntax -DL_VERSION_RAW="$(grep "^go [0-9]+.[0-9]+" go.mod -P)" -if [[ -z "$DL_VERSION_RAW" ]]; then - echo "FATAL: Unable to pull version from go.mod" - exit 1 +#check install version field first +if [[ -z "$GO_INSTALL_VERSION" ]]; then + echo "No version input found, checking go.mod files" + # -P uses perl syntax + DL_VERSION_RAW="$(grep "^go [0-9]+.[0-9]+" go.mod -P)" + if [[ -z "$DL_VERSION_RAW" ]]; then + echo "FATAL: No Go version found, set version input if no go.mod file is present" + exit 1 + else + fixVersion + fi +else + echo "Version input found" + DL_VERSION=$GO_INSTALL_VERSION fi -echo "Found go version: ${DL_VERSION_RAW}" + +echo "Found go version: ${DL_VERSION}" DL_ARCH=$GO_INSTALL_ARCH -DL_VSPL=( $DL_VERSION_RAW ) -DL_VERSION="${DL_VSPL[1]}" - -#ensure we have patch-level version, if not add 0 for stable releases -# -P uses perl syntax -DL_VERSION_PAD_CHECK="$(grep "^go [0-9]+.[0-9]+.[0-9]+" go.mod -P)" -if [[ -z "$DL_VERSION_PAD_CHECK" ]]; then - DL_VERSION="$DL_VERSION"".0" - echo "Fixing version number to ${DL_VERSION}" -fi - echo "Checking if go is already installed" #check if go is already present before starting install process and delete files if purge input is set -# -v writes string that indicates command or command path to output, prevents command not found error +# -v writes string that indicates command or command path to output, prevents command not found error if go isn't installed GO_CHECK=$(command -v go) if [[ "$GO_CHECK" ]]; then #if the version of go matches the requested version, skip GVC=$(go version) if [[ "$GVC" == "go version go${DL_VERSION} linux/${DL_ARCH}" ]]; then - echo "Go ${DL_VERSION} already installed, skipping!" + echo "Go ${DL_VERSION} already installed, skipping go setup" installCommands exit 0 fi @@ -67,11 +80,11 @@ if [[ "$GO_CHECK" ]]; then fi fi -echo "Ready for install" - +echo "Ready to install" echo "Downloading go files for ${DL_VERSION}/${DL_ARCH}" PATH_FOR_FILES=/usr/local/go PATH_FOR_TAR=/usr/local +#creating our files with proper file perms sudo mkdir -v -m 0777 -p "$PATH_FOR_FILES" #wget @@ -84,12 +97,13 @@ sudo mkdir -v -m 0777 -p "$PATH_FOR_FILES" # - extract from pipe as a file # -C change to GOPATH directory if sudo wget -qO- "https://golang.org/dl/go${DL_VERSION}.linux-${DL_ARCH}.tar.gz" | sudo tar -zxf - -C "$PATH_FOR_TAR"; then - echo "Files downloaded" + echo "Files downloaded successfully" else echo "FATAL: Unable to download and extract files" + exit 1 fi -echo "Setting path for go command" +echo "Adding go to path" export PATH=$PATH:$PATH_FOR_FILES/bin echo "$PATH_FOR_FILES/bin" >> "$GITHUB_PATH" #set action path too