diff --git a/README.md b/README.md index 245eb5527..cdc9a127c 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,8 @@ `v7` of the Codecov GitHub Action bumps the [Codecov Wrapper](https://github.com/codecov/wrapper) submodule, which now fetches the Codecov Uploader PGP verification key from the `codecovsecops` Keybase account. +`v7.1.0` updates the wrapper to `0.3.0`, which adds an optional `cleanup` input to download the CLI into a temporary directory, and accepts CircleCI-style `1`/`0` values for `skip_validation` and `use_pypi`. + ## v6 Release `v6` of the Codecov GitHub Action support node24 @@ -137,6 +139,7 @@ Codecov's Action supports inputs from the user. These inputs, along with their d | :--- | :--- | :---: | | `base_sha` | 'The base SHA to select. This is only used in the "pr-base-picking" run command' | Optional | `binary` | The file location of a pre-downloaded version of the CLI. If specified, integrity checking will be bypassed. | Optional +| `cleanup` | If true, download the CLI into a temporary directory and clean it up after the run. Off by default. | Optional | `codecov_yml_path` | The location of the codecov.yml file. This is currently ONLY used for automated test selection (https://docs.codecov.com/docs/getting-started-with-ats). Note that for all other cases, the Codecov yaml will need to be located as described here: https://docs.codecov.com/docs/codecov-yaml#can-i-name-the-file-codecovyml | Optional | `commit_parent` | SHA (with 40 chars) of what should be the parent of this commit. | Optional | `directory` | Folder to search for coverage files. Default to the current working directory | Optional diff --git a/action.yml b/action.yml index b247abebf..1dd2688c4 100644 --- a/action.yml +++ b/action.yml @@ -10,6 +10,10 @@ inputs: binary: description: 'The file location of a pre-downloaded version of the CLI. If specified, integrity checking will be bypassed.' required: false + cleanup: + description: 'If true, download the CLI into a temporary directory and clean it up after the run. Off by default to preserve legacy behavior of downloading into the current working directory.' + required: false + default: 'false' codecov_yml_path: description: 'The location of the codecov.yml file. This is crrently ONLY used for automated test selection (https://docs.codecov.com/docs/getting-started-with-ats). Note that for all other cases, the Codecov yaml will need to be located as described here: https://docs.codecov.com/docs/codecov-yaml#can-i-name-the-file-codecovyml' required: false @@ -317,6 +321,7 @@ runs: CC_BINARY: ${{ inputs.binary }} CC_BUILD: ${{ inputs.override_build }} CC_BUILD_URL: ${{ inputs.override_build_url }} + CC_CLEANUP: ${{ inputs.cleanup }} CC_CODE: ${{ inputs.report_code }} CC_DIR: ${{ inputs.directory }} CC_DISABLE_FILE_FIXES: ${{ inputs.disable_file_fixes }} diff --git a/dist/codecov.sh b/dist/codecov.sh index b7eba518e..f1c23a63f 100755 --- a/dist/codecov.sh +++ b/dist/codecov.sh @@ -37,11 +37,12 @@ g="\033[0;32m" # info/debug r="\033[0;31m" # errors x="\033[0m" retry="--retry 5 --retry-delay 2" -CC_WRAPPER_VERSION="0.2.9" +CC_WRAPPER_VERSION="0.3.0" CC_VERSION="${CC_VERSION:-latest}" CC_FAIL_ON_ERROR="${CC_FAIL_ON_ERROR:-false}" CC_RUN_CMD="${CC_RUN_CMD:-upload-coverage}" CC_CLI_TYPE=${CC_CLI_TYPE:-"codecov-cli"} +CC_CLEANUP="${CC_CLEANUP:-false}" say " _____ _ / ____| | | | | ___ __| | ___ ___ _____ __ @@ -63,7 +64,7 @@ then else exit_if_error "Could not find binary file $CC_BINARY" fi -elif [ "$CC_USE_PYPI" == "true" ]; +elif [ "$CC_USE_PYPI" == "true" ] || [ "$CC_USE_PYPI" == "1" ]; then if ! pip install "${CC_CLI_TYPE}$([ "$CC_VERSION" == "latest" ] && echo "" || echo "==$CC_VERSION")"; then exit_if_error "Could not install via pypi." @@ -77,6 +78,14 @@ then CC_COMMAND="${CC_CLI_TYPE}" fi else + CC_DOWNLOAD_DIR="." + if [ "$CC_CLEANUP" == "true" ]; then + CC_DOWNLOAD_DIR=$(mktemp -d) + cleanup_downloads() { + rm -rf "$CC_DOWNLOAD_DIR" + } + trap cleanup_downloads EXIT + fi if [ -n "$CC_OS" ]; then say "$g==>$x Overridden OS: $b${CC_OS}$x" @@ -93,7 +102,7 @@ else fi CC_FILENAME="${CC_CLI_TYPE%-cli}" [[ $CC_OS == "windows" ]] && CC_FILENAME+=".exe" - CC_COMMAND="./$CC_FILENAME" + CC_COMMAND="$CC_DOWNLOAD_DIR/$CC_FILENAME" [[ $CC_OS == "macos" ]] && \ ! command -v gpg 2>&1 >/dev/null && \ HOMEBREW_NO_AUTO_UPDATE=1 brew install gpg @@ -101,24 +110,36 @@ else CC_URL="$CC_URL/${CC_VERSION}" CC_URL="$CC_URL/${CC_OS}/${CC_FILENAME}" say "$g ->$x Downloading $b${CC_URL}$x" - curl -O $retry "$CC_URL" + curl -o "$CC_COMMAND" $retry "$CC_URL" say "$g==>$x Finishing downloading $b${CC_OS}:${CC_VERSION}$x" v_url="https://cli.codecov.io/api/${CC_OS}/${CC_VERSION}" v=$(curl $retry --retry-all-errors -s "$v_url" -H "Accept:application/json" | tr \{ '\n' | tr , '\n' | tr \} '\n' | grep "\"version\"" | awk -F'"' '{print $4}' | tail -1) say " Version: $b$v$x" say " " fi -if [ "$CC_SKIP_VALIDATION" == "true" ] || [ -n "$CC_BINARY" ] || [ "$CC_USE_PYPI" == "true" ]; +if [ "$CC_SKIP_VALIDATION" == "true" ] || [ "$CC_SKIP_VALIDATION" == "1" ] || [ -n "$CC_BINARY" ] || [ "$CC_USE_PYPI" == "true" ] || [ "$CC_USE_PYPI" == "1" ]; then say "$r==>$x Bypassing validation..." - if [ "$CC_SKIP_VALIDATION" == "true" ]; + if [ "$CC_SKIP_VALIDATION" == "true" ] || [ "$CC_SKIP_VALIDATION" == "1" ]; then chmod +x "$CC_COMMAND" fi else - echo "$(curl -s https://keybase.io/codecovsecops/pgp_keys.asc)" | \ - gpg --no-default-keyring --import - # One-time step + gpg_key_url="https://keybase.io/codecovsecops/pgp_keys.asc" + gpg_import_ok=false + for gpg_attempt in 1 2 3; do + if curl -sf $retry "$gpg_key_url" | gpg --no-default-keyring --import; then + gpg_import_ok=true + break + fi + if [ "$gpg_attempt" -lt 3 ]; then + say "$r ->$x GPG key import attempt $gpg_attempt failed, retrying..." + sleep 2 + fi + done + if [ "$gpg_import_ok" != "true" ]; then + exit_if_error "Could not import GPG verification key after 3 attempts. Please contact Codecov if problem continues" + fi say "$g==>$x Verifying GPG signature integrity" sha_url="https://cli.codecov.io" sha_url="${sha_url}/${CC_VERSION}/${CC_OS}" @@ -126,14 +147,14 @@ else say "$g ->$x Downloading $b${sha_url}$x" say "$g ->$x Downloading $b${sha_url}.sig$x" say " " - curl -Os $retry --connect-timeout 2 "$sha_url" - curl -Os $retry --connect-timeout 2 "${sha_url}.sig" - if ! gpg --verify "${CC_FILENAME}.SHA256SUM.sig" "${CC_FILENAME}.SHA256SUM"; + curl -o "$CC_DOWNLOAD_DIR/${CC_FILENAME}.SHA256SUM" -s $retry --connect-timeout 2 "$sha_url" + curl -o "$CC_DOWNLOAD_DIR/${CC_FILENAME}.SHA256SUM.sig" -s $retry --connect-timeout 2 "${sha_url}.sig" + if ! gpg --verify "$CC_DOWNLOAD_DIR/${CC_FILENAME}.SHA256SUM.sig" "$CC_DOWNLOAD_DIR/${CC_FILENAME}.SHA256SUM"; then exit_if_error "Could not verify signature. Please contact Codecov if problem continues" fi - if ! (shasum -a 256 -c "${CC_FILENAME}.SHA256SUM" 2>/dev/null || \ - sha256sum -c "${CC_FILENAME}.SHA256SUM"); + if ! (cd "$CC_DOWNLOAD_DIR" && (shasum -a 256 -c "${CC_FILENAME}.SHA256SUM" 2>/dev/null || \ + sha256sum -c "${CC_FILENAME}.SHA256SUM")); then exit_if_error "Could not verify SHASUM. Please contact Codecov if problem continues" fi @@ -143,11 +164,16 @@ else fi if [ -n "$CC_BINARY_LOCATION" ]; then - mkdir -p "$CC_BINARY_LOCATION" && mv "$CC_FILENAME" $_ + mkdir -p "$CC_BINARY_LOCATION" && mv "$CC_COMMAND" "$CC_BINARY_LOCATION/$CC_FILENAME" + CC_COMMAND="$CC_BINARY_LOCATION/$CC_FILENAME" say "$g==>$x ${CC_CLI_TYPE} binary moved to ${CC_BINARY_LOCATION}" fi if [ "$CC_DOWNLOAD_ONLY" = "true" ]; then + if [ "$CC_CLEANUP" == "true" ] && [ -z "$CC_BINARY_LOCATION" ]; then + cp "$CC_COMMAND" "./$CC_FILENAME" + CC_COMMAND="./$CC_FILENAME" + fi say "$g==>$x ${CC_CLI_TYPE} download only called. Exiting..." exit fi diff --git a/src/scripts b/src/scripts index bad8df56c..ce44ce7e2 160000 --- a/src/scripts +++ b/src/scripts @@ -1 +1 @@ -Subproject commit bad8df56cd845fa9c6115a924bbd3215e1926ec8 +Subproject commit ce44ce7e24763e2eee9897591963422ed672fede diff --git a/src/version b/src/version index 66ce77b7e..a3fcc7121 100644 --- a/src/version +++ b/src/version @@ -1 +1 @@ -7.0.0 +7.1.0