Compare commits

..

4 Commits

Author SHA1 Message Date
Tom Hu
9dee4adabc fix: download CLI to temp dir and retry GPG key import
Fixes two regressions in the wrapper script:

1. Dirty git state (#1851, #1804): The binary, SHA256SUM, and
   SHA256SUM.sig files were downloaded into the working directory
   (repo root) and never cleaned up. Now downloads to a mktemp -d
   directory with an EXIT trap that removes it automatically.

2. GPG import failures (#1876): The key import used
   `echo "$(curl ...)" | gpg --import` which strips trailing newlines
   from the PGP key, had no retries, and no error checking. Now pipes
   curl directly to gpg with a 3-attempt retry loop and explicit
   failure reporting.

Made-with: Cursor
2026-02-26 06:41:35 +09:00
Tom Hu
671740ac38 chore(release): 5.5.2 (#1902) 2025-12-10 03:20:06 +08:00
Miguel Angel Rojo
96b38e9e60 chore: disable_search alignment (#1881)
chore: disable_search alignment
2025-11-19 18:34:32 +05:00
maxweng-sentry
9b6d1f84bd check gpg only when skip-validation = false (#1894) 2025-11-11 14:37:52 -08:00
5 changed files with 45 additions and 41 deletions

View File

@@ -1,9 +1,9 @@
## v5.6.0 ## v5.5.2
### What's Changed ### What's Changed
**Full Changelog**: https://github.com/codecov/codecov-action/compare/v5.5.1..v5.6.0 **Full Changelog**: https://github.com/codecov/codecov-action/compare/v5.5.1..v5.5.2
## v5.5.1 ## v5.5.1

View File

@@ -132,7 +132,6 @@ Codecov's Action supports inputs from the user. These inputs, along with their d
| `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 | `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 | `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 | `directory` | Folder to search for coverage files. Default to the current working directory | Optional
| `disable_checkout` | Disable checking out the repository. This is not recommended as it can cause unwanted side effects in coverage processing | Optional
| `disable_file_fixes` | Disable file fixes to ignore common lines from coverage (e.g. blank lines or empty brackets). Read more here https://docs.codecov.com/docs/fixing-reports | Optional | `disable_file_fixes` | Disable file fixes to ignore common lines from coverage (e.g. blank lines or empty brackets). Read more here https://docs.codecov.com/docs/fixing-reports | Optional
| `disable_search` | Disable search for coverage files. This is helpful when specifying what files you want to upload with the files option. | Optional | `disable_search` | Disable search for coverage files. This is helpful when specifying what files you want to upload with the files option. | Optional
| `disable_safe_directory` | Disable setting safe directory. Set to true to disable. | Optional | `disable_safe_directory` | Disable setting safe directory. Set to true to disable. | Optional
@@ -141,7 +140,7 @@ Codecov's Action supports inputs from the user. These inputs, along with their d
| `env_vars` | Environment variables to tag the upload with (e.g. PYTHON \| OS,PYTHON) | Optional | `env_vars` | Environment variables to tag the upload with (e.g. PYTHON \| OS,PYTHON) | Optional
| `exclude` | Comma-separated list of folders to exclude from search. | Optional | `exclude` | Comma-separated list of folders to exclude from search. | Optional
| `fail_ci_if_error` | On error, exit with non-zero code | Optional | `fail_ci_if_error` | On error, exit with non-zero code | Optional
| `files` | Comma-separated explicit list of files to upload. These will be added to the coverage files found for upload. If you wish to only upload the specified files, please consider using "disable-search" to disable uploading other files. | Optional | `files` | Comma-separated explicit list of files to upload. These will be added to the coverage files found for upload. If you wish to only upload the specified files, please consider using "disable_search" to disable uploading other files. | Optional
| `flags` | Comma-separated list of flags to upload to group coverage metrics. | Optional | `flags` | Comma-separated list of flags to upload to group coverage metrics. | Optional
| `force` | Only used for empty-upload run command | Optional | `force` | Only used for empty-upload run command | Optional
| `git_service` | Override the git_service (e.g. github_enterprise) | Optional | `git_service` | Override the git_service (e.g. github_enterprise) | Optional

View File

@@ -19,10 +19,6 @@ inputs:
directory: directory:
description: 'Folder to search for coverage files. Default to the current working directory' description: 'Folder to search for coverage files. Default to the current working directory'
required: false required: false
disable_checkout:
description: 'Disable checking out the repository. This is not recommended as it can cause unwanted side effects in coverage processing'
required: false
default: 'false'
disable_file_fixes: disable_file_fixes:
description: 'Disable file fixes to ignore common lines from coverage (e.g. blank lines or empty brackets). Read more here https://docs.codecov.com/docs/fixing-reports' description: 'Disable file fixes to ignore common lines from coverage (e.g. blank lines or empty brackets). Read more here https://docs.codecov.com/docs/fixing-reports'
required: false required: false
@@ -54,7 +50,7 @@ inputs:
required: false required: false
default: 'false' default: 'false'
files: files:
description: 'Comma-separated list of explicit files to upload. These will be added to the coverage files found for upload. If you wish to only upload the specified files, please consider using disable-search to disable uploading other files.' description: 'Comma-separated list of explicit files to upload. These will be added to the coverage files found for upload. If you wish to only upload the specified files, please consider using disable_search to disable uploading other files.'
required: false required: false
flags: flags:
description: 'Comma-separated list of flags to upload to group coverage metrics.' description: 'Comma-separated list of flags to upload to group coverage metrics.'
@@ -184,13 +180,20 @@ runs:
run: | run: |
missing_deps="" missing_deps=""
# Check for required commands # Check for always-required commands
for cmd in bash git curl gpg; do for cmd in bash git curl; do
if ! command -v "$cmd" >/dev/null 2>&1; then if ! command -v "$cmd" >/dev/null 2>&1; then
missing_deps="$missing_deps $cmd" missing_deps="$missing_deps $cmd"
fi fi
done done
# Check for gpg only if validation is not being skipped
if [ "${{ inputs.skip_validation }}" != "true" ]; then
if ! command -v gpg >/dev/null 2>&1; then
missing_deps="$missing_deps gpg"
fi
fi
# Report missing required dependencies # Report missing required dependencies
if [ -n "$missing_deps" ]; then if [ -n "$missing_deps" ]; then
echo "Error: The following required dependencies are missing:$missing_deps" echo "Error: The following required dependencies are missing:$missing_deps"
@@ -204,24 +207,6 @@ runs:
run: | run: |
CC_ACTION_VERSION=$(cat ${GITHUB_ACTION_PATH}/src/version) CC_ACTION_VERSION=$(cat ${GITHUB_ACTION_PATH}/src/version)
echo -e "\033[0;32m==>\033[0m Running Action version $CC_ACTION_VERSION" echo -e "\033[0;32m==>\033[0m Running Action version $CC_ACTION_VERSION"
- name: Check if repository is checked out
id: check_repo
shell: bash
run: |
if [ -d ".git" ]; then
echo "Repository is checked out."
echo "repo_checked_out=true" >> "$GITHUB_OUTPUT"
else
echo "Repository is NOT checked out."
echo "repo_checked_out=false" >> "$GITHUB_OUTPUT"
fi
- name: Checkout repository
if: ${{ steps.check_repo.outputs.repo_checked_out == 'false' && inputs.disable_checkout != 'true' }}
uses: actions/checkout@v5
with:
fetch-depth: 2
- name: Set safe directory - name: Set safe directory
if: ${{ inputs.disable_safe_directory != 'true' }} if: ${{ inputs.disable_safe_directory != 'true' }}
shell: bash shell: bash

42
dist/codecov.sh vendored
View File

@@ -71,6 +71,11 @@ then
fi fi
CC_COMMAND="${CC_CLI_TYPE}" CC_COMMAND="${CC_CLI_TYPE}"
else else
CC_DOWNLOAD_DIR=$(mktemp -d)
cleanup_downloads() {
rm -rf "$CC_DOWNLOAD_DIR"
}
trap cleanup_downloads EXIT
if [ -n "$CC_OS" ]; if [ -n "$CC_OS" ];
then then
say "$g==>$x Overridden OS: $b${CC_OS}$x" say "$g==>$x Overridden OS: $b${CC_OS}$x"
@@ -87,7 +92,7 @@ else
fi fi
CC_FILENAME="${CC_CLI_TYPE%-cli}" CC_FILENAME="${CC_CLI_TYPE%-cli}"
[[ $CC_OS == "windows" ]] && CC_FILENAME+=".exe" [[ $CC_OS == "windows" ]] && CC_FILENAME+=".exe"
CC_COMMAND="./$CC_FILENAME" CC_COMMAND="$CC_DOWNLOAD_DIR/$CC_FILENAME"
[[ $CC_OS == "macos" ]] && \ [[ $CC_OS == "macos" ]] && \
! command -v gpg 2>&1 >/dev/null && \ ! command -v gpg 2>&1 >/dev/null && \
HOMEBREW_NO_AUTO_UPDATE=1 brew install gpg HOMEBREW_NO_AUTO_UPDATE=1 brew install gpg
@@ -95,7 +100,7 @@ else
CC_URL="$CC_URL/${CC_VERSION}" CC_URL="$CC_URL/${CC_VERSION}"
CC_URL="$CC_URL/${CC_OS}/${CC_FILENAME}" CC_URL="$CC_URL/${CC_OS}/${CC_FILENAME}"
say "$g ->$x Downloading $b${CC_URL}$x" say "$g ->$x Downloading $b${CC_URL}$x"
curl -O $retry "$CC_URL" curl -o "$CC_DOWNLOAD_DIR/$CC_FILENAME" $retry "$CC_URL"
say "$g==>$x Finishing downloading $b${CC_OS}:${CC_VERSION}$x" say "$g==>$x Finishing downloading $b${CC_OS}:${CC_VERSION}$x"
v_url="https://cli.codecov.io/api/${CC_OS}/${CC_VERSION}" 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) 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)
@@ -110,9 +115,19 @@ then
chmod +x "$CC_COMMAND" chmod +x "$CC_COMMAND"
fi fi
else else
echo "$(curl -s https://keybase.io/codecovsecurity/pgp_keys.asc)" | \ gpg_key_url="https://keybase.io/codecovsecurity/pgp_keys.asc"
gpg --no-default-keyring --import gpg_import_ok=false
# One-time step for gpg_attempt in 1 2 3; do
if curl -sf $retry "$gpg_key_url" | gpg --no-default-keyring --import 2>/dev/null; then
gpg_import_ok=true
break
fi
say "$r ->$x GPG key import attempt $gpg_attempt failed, retrying..."
sleep 2
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" say "$g==>$x Verifying GPG signature integrity"
sha_url="https://cli.codecov.io" sha_url="https://cli.codecov.io"
sha_url="${sha_url}/${CC_VERSION}/${CC_OS}" sha_url="${sha_url}/${CC_VERSION}/${CC_OS}"
@@ -120,14 +135,14 @@ else
say "$g ->$x Downloading $b${sha_url}$x" say "$g ->$x Downloading $b${sha_url}$x"
say "$g ->$x Downloading $b${sha_url}.sig$x" say "$g ->$x Downloading $b${sha_url}.sig$x"
say " " say " "
curl -Os $retry --connect-timeout 2 "$sha_url" curl -o "$CC_DOWNLOAD_DIR/${CC_FILENAME}.SHA256SUM" -s $retry --connect-timeout 2 "$sha_url"
curl -Os $retry --connect-timeout 2 "${sha_url}.sig" curl -o "$CC_DOWNLOAD_DIR/${CC_FILENAME}.SHA256SUM.sig" -s $retry --connect-timeout 2 "${sha_url}.sig"
if ! gpg --verify "${CC_FILENAME}.SHA256SUM.sig" "${CC_FILENAME}.SHA256SUM"; if ! gpg --verify "$CC_DOWNLOAD_DIR/${CC_FILENAME}.SHA256SUM.sig" "$CC_DOWNLOAD_DIR/${CC_FILENAME}.SHA256SUM";
then then
exit_if_error "Could not verify signature. Please contact Codecov if problem continues" exit_if_error "Could not verify signature. Please contact Codecov if problem continues"
fi fi
if ! (shasum -a 256 -c "${CC_FILENAME}.SHA256SUM" 2>/dev/null || \ if ! (cd "$CC_DOWNLOAD_DIR" && (shasum -a 256 -c "${CC_FILENAME}.SHA256SUM" 2>/dev/null || \
sha256sum -c "${CC_FILENAME}.SHA256SUM"); sha256sum -c "${CC_FILENAME}.SHA256SUM"));
then then
exit_if_error "Could not verify SHASUM. Please contact Codecov if problem continues" exit_if_error "Could not verify SHASUM. Please contact Codecov if problem continues"
fi fi
@@ -137,11 +152,16 @@ else
fi fi
if [ -n "$CC_BINARY_LOCATION" ]; if [ -n "$CC_BINARY_LOCATION" ];
then 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}" say "$g==>$x ${CC_CLI_TYPE} binary moved to ${CC_BINARY_LOCATION}"
fi fi
if [ "$CC_DOWNLOAD_ONLY" = "true" ]; if [ "$CC_DOWNLOAD_ONLY" = "true" ];
then then
if [ -n "$CC_DOWNLOAD_DIR" ] && [ -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..." say "$g==>$x ${CC_CLI_TYPE} download only called. Exiting..."
exit exit
fi fi

View File

@@ -1 +1 @@
5.6.0 5.5.2