diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index ac757fa7b..faa2c32ca 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -7,7 +7,9 @@ body:
id: description
attributes:
label: Describe the bug
- description: What is the problem? A clear and concise description of the bug.
+ description: |
+ What is the problem? A clear and concise description of the bug.
+ Note: Issues related to JFrog security features such as Xray, audit, scan, etc., should be opened on the [jfrog-cli-security repository](https://github.com/jfrog/jfrog-cli-security/issues/new?template=bug_report.yml).
validations:
required: true
diff --git a/.github/workflows/mavenTests.yml b/.github/workflows/mavenTests.yml
index dd6f6af29..88b438b19 100644
--- a/.github/workflows/mavenTests.yml
+++ b/.github/workflows/mavenTests.yml
@@ -30,11 +30,11 @@ jobs:
- name: Setup Go with cache
uses: jfrog/.github/actions/install-go-with-cache@main
- - name: Setup Maven v3.8.8 for macOS
+ # Fixed Maven version to avoid updating to 3.9, which includes breaking changes.
+ - name: Setup Maven v3.8.8
uses: stCarolas/setup-maven@v4.5
with:
maven-version: 3.8.8
- if: runner.os == 'macOS'
- name: Install local Artifactory
uses: jfrog/.github/actions/install-local-artifactory@main
diff --git a/.github/workflows/prepareDarwinBinariesForRelease.yml b/.github/workflows/prepareDarwinBinariesForRelease.yml
new file mode 100644
index 000000000..7a977bdbc
--- /dev/null
+++ b/.github/workflows/prepareDarwinBinariesForRelease.yml
@@ -0,0 +1,57 @@
+name: Sign Darwin Binaries for Release
+on:
+ workflow_dispatch:
+ inputs:
+ releaseVersion:
+ description: "Release version"
+ required: true
+ binaryFileName:
+ description: 'Binary file name'
+ required: true
+env:
+ binaryFileName: ${{ github.event.inputs.binaryFileName }}
+ releaseVersion: ${{ github.event.inputs.releaseVersion }}
+jobs:
+ # Builds, signs, notarize and uploads the macOS binaries
+ prepareBinary:
+ name: Prepare-Binary
+ runs-on: macos-latest
+ strategy:
+ matrix:
+ goarch: [ arm64, amd64 ]
+ steps:
+ # Setup
+ - name: Setup Go
+ uses: actions/setup-go@v5
+ with:
+ go-version: 1.23.x
+ cache: false
+
+ - name: Checkout Source
+ uses: actions/checkout@v4
+ with:
+ ref: v2
+
+ # Builds the executable and moves it inside the app template
+ - name: Build and Move Executable
+ run: |
+ ./build/build.sh ${{ env.binaryFileName }}
+ mv ${{ env.binaryFileName }} ./build/apple_release/${{ env.binaryFileName }}.app/Contents/MacOS
+
+ - name: Sign & Notarize
+ env:
+ APPLE_CERT_DATA: ${{ secrets.APPLE_CERT_DATA }}
+ APPLE_CERT_PASSWORD: ${{ secrets.APPLE_CERT_PASSWORD }}
+ APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
+ APPLE_ACCOUNT_ID: ${{ secrets.APPLE_ACCOUNT_ID }}
+ APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
+ APP_TEMPLATE_PATH: ./build/apple_release/${{ env.binaryFileName }}.app
+ run: ./build/apple_release/scripts/darwin-sign-and-notarize.sh
+
+ - name: Upload Artifact
+ uses: actions/upload-artifact@v4
+ with:
+ name: ${{ env.binaryFileName }}-darwin-v${{ env.releaseVersion }}-${{ matrix.goarch }}
+ path: ./${{ env.binaryFileName }}
+ retention-days: 1
+ if-no-files-found: error
\ No newline at end of file
diff --git a/Jenkinsfile b/Jenkinsfile
index ebd7e36e0..c559b8639 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -31,7 +31,7 @@ node("docker-ubuntu20-xlarge") {
repo = 'jfrog-cli'
sh 'rm -rf temp'
sh 'mkdir temp'
- def goRoot = tool 'go-1.23.3'
+ def goRoot = tool 'go-1.23.4'
env.GOROOT="$goRoot"
env.PATH+=":${goRoot}/bin:/tmp/node-${nodeVersion}-linux-x64/bin"
env.GO111MODULE="on"
@@ -105,6 +105,7 @@ def runRelease(architectures) {
version = getCliVersion(builderPath)
print "CLI version: $version"
}
+
configRepo21()
try {
@@ -118,6 +119,12 @@ def runRelease(architectures) {
}
}
+ // We sign darwin binaries throughout GitHub actions to use MacOS machine,
+ // the binaries will be uploaded to GitHub packages
+ stage('Prepare Signed MacOS binaries') {
+ triggerDarwinBinariesSigningWorkflow()
+ }
+
// We sign the binary also for the standalone Windows executable, and not just for Windows executable packaged inside Chocolaty.
downloadToolsCert()
print "Uploading version $version to Repo21"
@@ -257,7 +264,7 @@ def cleanupRepo21() {
def buildRpmAndDeb(version, architectures) {
boolean built = false
- withCredentials([file(credentialsId: 'rpm-gpg-key2', variable: 'rpmGpgKeyFile'), string(credentialsId: 'rpm-sign-passphrase', variable: 'rpmSignPassphrase')]) {
+ withCredentials([file(credentialsId: 'rpm-gpg-key3', variable: 'rpmGpgKeyFile'), string(credentialsId: 'rpm-sign-passphrase', variable: 'rpmSignPassphrase')]) {
def dirPath = "${pwd()}/jfrog-cli/build/deb_rpm/${identifier}/pkg"
def gpgPassphraseFilePath = "$dirPath/RPM-GPG-PASSPHRASE-jfrog-cli"
writeFile(file: gpgPassphraseFilePath, text: "$rpmSignPassphrase")
@@ -314,7 +321,12 @@ def uploadCli(architectures) {
for (int i = 0; i < architectures.size(); i++) {
def currentBuild = architectures[i]
stage("Build and upload ${currentBuild.pkg}") {
- buildAndUpload(currentBuild.goos, currentBuild.goarch, currentBuild.pkg, currentBuild.fileExtension)
+ // MacOS binaries should be downloaded from GitHub packages, as they are signed there.
+ if (currentBuild.goos == 'darwin') {
+ uploadSignedDarwinBinaries(currentBuild.goarch,currentBuild.pkg)
+ } else {
+ buildAndUpload(currentBuild.goos, currentBuild.goarch, currentBuild.pkg, currentBuild.fileExtension)
+ }
}
}
}
@@ -511,3 +523,34 @@ def dockerLogin(){
sh "echo $REPO21_PASSWORD | docker login $REPO_NAME_21 -u=$REPO21_USER --password-stdin"
}
}
+
+
+/**
+ * Triggers Github action that signs and notarize the MacOS binaries.
+ * The artifacts will be uploaded to Github artifacts
+ */
+def triggerDarwinBinariesSigningWorkflow() {
+ withCredentials([string(credentialsId: 'jfrog-cli-packages-github-token', variable: "GITHUB_ACCESS_TOKEN")]) {
+ stage("Sign MacOS binaries") {
+ sh ('export GITHUB_ACCESS_TOKEN=$GITHUB_ACCESS_TOKEN')
+ sh """#!/bin/bash
+ chmod +x ${repo}/build/apple_release/scripts/trigger-sign-mac-OS-workflow.sh
+ bash ${repo}/build/apple_release/scripts/trigger-sign-mac-OS-workflow.sh ${cliExecutableName} ${releaseVersion}
+ """
+ }
+ }
+}
+
+/**
+ * Uploads signed darwin binaries from Github artifacts and uploads to releases
+ */
+def uploadSignedDarwinBinaries(goarch,pkg) {
+ withCredentials([string(credentialsId: 'jfrog-cli-packages-github-token', variable: "GITHUB_ACCESS_TOKEN")]) {
+ sh('export GITHUB_ACCESS_TOKEN=$GITHUB_ACCESS_TOKEN')
+ sh """#!/bin/bash
+ chmod +x ${repo}/build/apple_release/scripts/download-signed-mac-OS-binaries.sh
+ ${repo}/build/apple_release/scripts/download-signed-mac-OS-binaries.sh ${cliExecutableName} ${releaseVersion} ${goarch}
+ $builderPath rt u ./${cliExecutableName} ecosys-jfrog-cli/$identifier/$version/${pkg}/ --flat
+ """
+ }
+}
\ No newline at end of file
diff --git a/artifactory/cli.go b/artifactory/cli.go
index 89a8aab0c..a84be2bef 100644
--- a/artifactory/cli.go
+++ b/artifactory/cli.go
@@ -118,6 +118,7 @@ import (
buildinfocmd "github.com/jfrog/jfrog-client-go/artifactory/buildinfo"
"github.com/jfrog/jfrog-client-go/artifactory/services"
clientutils "github.com/jfrog/jfrog-client-go/utils"
+ utilsForLC "github.com/jfrog/jfrog-client-go/utils"
"github.com/jfrog/jfrog-client-go/utils/errorutils"
"github.com/jfrog/jfrog-client-go/utils/log"
"github.com/jszwec/csvutil"
@@ -133,6 +134,7 @@ const (
userCategory = "User Management"
transferCategory = "Transfer Between Artifactory Instances"
otherCategory = "Other"
+ releaseBundlesV2 = "release-bundles-v2"
)
func GetCommands() []cli.Command {
@@ -1269,14 +1271,17 @@ func prepareDownloadCommand(c *cli.Context) (*spec.SpecFiles, error) {
var downloadSpec *spec.SpecFiles
var err error
+
if c.IsSet("spec") {
downloadSpec, err = cliutils.GetSpec(c, true, true)
} else {
downloadSpec, err = createDefaultDownloadSpec(c)
}
+
if err != nil {
return nil, err
}
+
setTransitiveInDownloadSpec(downloadSpec)
err = spec.ValidateSpec(downloadSpec.Files, false, true)
if err != nil {
@@ -1290,6 +1295,7 @@ func downloadCmd(c *cli.Context) error {
if err != nil {
return err
}
+
fixWinPathsForDownloadCmd(downloadSpec, c)
configuration, err := cliutils.CreateDownloadConfiguration(c)
if err != nil {
@@ -1330,6 +1336,54 @@ func downloadCmd(c *cli.Context) error {
return cliutils.GetCliError(err, result.SuccessCount(), result.FailCount(), cliutils.IsFailNoOp(c))
}
+func checkRbExistenceInV2(c *cli.Context) (bool, error) {
+ bundleNameAndVersion := c.String("bundle")
+ parts := strings.Split(bundleNameAndVersion, "/")
+ rbName := parts[0]
+ rbVersion := parts[1]
+
+ lcDetails, err := createLifecycleDetailsByFlags(c)
+ if err != nil {
+ return false, err
+ }
+
+ lcServicesManager, err := utils.CreateLifecycleServiceManager(lcDetails, false)
+ if err != nil {
+ return false, err
+ }
+
+ return lcServicesManager.IsReleaseBundleExist(rbName, rbVersion, c.String("project"))
+}
+
+func createLifecycleDetailsByFlags(c *cli.Context) (*coreConfig.ServerDetails, error) {
+ lcDetails, err := cliutils.CreateServerDetailsWithConfigOffer(c, true, commonCliUtils.Platform)
+ if err != nil {
+ return nil, err
+ }
+ if lcDetails.Url == "" {
+ return nil, errors.New("platform URL is mandatory for lifecycle commands")
+ }
+ PlatformToLifecycleUrls(lcDetails)
+ return lcDetails, nil
+}
+
+func PlatformToLifecycleUrls(lcDetails *coreConfig.ServerDetails) {
+ // For tests only. in prod - this "if" will always return false
+ if strings.Contains(lcDetails.Url, "artifactory/") {
+ lcDetails.ArtifactoryUrl = utilsForLC.AddTrailingSlashIfNeeded(lcDetails.Url)
+ lcDetails.LifecycleUrl = strings.Replace(
+ utilsForLC.AddTrailingSlashIfNeeded(lcDetails.Url),
+ "artifactory/",
+ "lifecycle/",
+ 1,
+ )
+ } else {
+ lcDetails.ArtifactoryUrl = utilsForLC.AddTrailingSlashIfNeeded(lcDetails.Url) + "artifactory/"
+ lcDetails.LifecycleUrl = utilsForLC.AddTrailingSlashIfNeeded(lcDetails.Url) + "lifecycle/"
+ }
+ lcDetails.Url = ""
+}
+
func uploadCmd(c *cli.Context) (err error) {
if c.NArg() > 0 && c.IsSet("spec") {
return cliutils.PrintHelpAndReturnError("No arguments should be sent when the spec option is used.", c)
@@ -2648,8 +2702,9 @@ func createDefaultDownloadSpec(c *cli.Context) (*spec.SpecFiles, error) {
if err != nil {
return nil, err
}
+
return spec.NewBuilder().
- Pattern(strings.TrimPrefix(c.Args().Get(0), "/")).
+ Pattern(getSourcePattern(c)).
Props(c.String("props")).
ExcludeProps(c.String("exclude-props")).
Build(c.String("build")).
@@ -2674,6 +2729,53 @@ func createDefaultDownloadSpec(c *cli.Context) (*spec.SpecFiles, error) {
BuildSpec(), nil
}
+func getSourcePattern(c *cli.Context) string {
+ var source string
+ var isRbv2 bool
+ var err error
+
+ if c.IsSet("bundle") {
+ // If the bundle flag is set, we need to check if the bundle exists in rbv2
+ isRbv2, err = checkRbExistenceInV2(c)
+ if err != nil {
+ log.Error("Error occurred while checking if the bundle exists in rbv2:", err.Error())
+ }
+ }
+
+ if isRbv2 {
+ // RB2 will be downloaded like a regular artifact, path: projectKey-release-bundles-v2/rbName/rbVersion
+ source, err = buildSourceForRbv2(c)
+ if err != nil {
+ log.Error("Error occurred while building source path for rbv2:", err.Error())
+ return ""
+ }
+ } else {
+ source = strings.TrimPrefix(c.Args().Get(0), "/")
+ }
+
+ return source
+}
+
+func buildSourceForRbv2(c *cli.Context) (string, error) {
+ bundleNameAndVersion := c.String("bundle")
+ projectKey := c.String("project")
+ source := projectKey
+
+ // Reset bundle flag
+ err := c.Set("bundle", "")
+ if err != nil {
+ return "", err
+ }
+
+ // If projectKey is not empty, append "-" to it
+ if projectKey != "" {
+ source += "-"
+ }
+ // Build RB path: projectKey-release-bundles-v2/rbName/rbVersion/
+ source += releaseBundlesV2 + "/" + bundleNameAndVersion + "/"
+ return source, nil
+}
+
func setTransitiveInDownloadSpec(downloadSpec *spec.SpecFiles) {
transitive := os.Getenv(coreutils.TransitiveDownload)
if transitive == "" {
diff --git a/artifactory_test.go b/artifactory_test.go
index 9ab9cd2b1..61f13fb2f 100644
--- a/artifactory_test.go
+++ b/artifactory_test.go
@@ -67,6 +67,8 @@ import (
// https://jira.jfrog.org/browse/JA-2620
// Minimum Artifactory version with Terraform support
const terraformMinArtifactoryVersion = "7.38.4"
+const deleteReleaseBundleV1ApiUrl = "artifactory/api/release/bundles/"
+const deleteReleaseBundleV2ApiUrl = "lifecycle/api/v2/release_bundle/records/"
// JFrog CLI for Artifactory sub-commands (jfrog rt ...)
var artifactoryCli *coretests.JfrogCli
@@ -223,10 +225,11 @@ func TestArtifactorySimpleUploadSpecUsingConfig(t *testing.T) {
inttestutils.VerifyExistInArtifactory(tests.GetSimpleUploadExpectedRepo1(), searchFilePath, serverDetails, t)
cleanArtifactoryTest()
}
+
func TestReleaseBundleImportOnPrem(t *testing.T) {
// Cleanup
defer func() {
- deleteReceivedReleaseBundle(t, "cli-tests", "2")
+ deleteReceivedReleaseBundle(t, deleteReleaseBundleV1ApiUrl, "cli-tests", "2")
cleanArtifactoryTest()
}()
initArtifactoryTest(t, "")
@@ -240,6 +243,35 @@ func TestReleaseBundleImportOnPrem(t *testing.T) {
assert.NoError(t, lcCli.Exec("rbi", testFilePath))
}
+func TestReleaseBundleV2Download(t *testing.T) {
+ buildNumber := "5"
+ defer func() {
+ deleteReceivedReleaseBundle(t, deleteReleaseBundleV2ApiUrl, tests.LcRbName1, buildNumber)
+ inttestutils.DeleteBuild(serverDetails.ArtifactoryUrl, tests.RtBuildName1, artHttpDetails)
+ cleanArtifactoryTest()
+ }()
+ initArtifactoryTest(t, "")
+ initLifecycleTest(t, signingKeyOptionalArtifactoryMinVersion)
+
+ runRt(t, "upload", "testdata/a/a1.in", tests.RtRepo1, "--build-name="+tests.RtBuildName1, "--build-number="+buildNumber)
+ runRt(t, "build-publish", tests.RtBuildName1, buildNumber)
+
+ // Create RBV2
+ err := lcCli.Exec("rbc", tests.LcRbName1, buildNumber, "--build-name="+tests.RtBuildName1, "--build-number="+buildNumber)
+ assert.NoError(t, err)
+
+ runRt(t, "download", "--bundle="+tests.LcRbName1+"/"+buildNumber)
+
+ wd, err := os.Getwd()
+ assert.NoError(t, err, "Failed to get current dir")
+ exists, err := fileutils.IsDirExists(filepath.Join(wd, tests.LcRbName1), false)
+
+ assert.NoError(t, err)
+ assert.True(t, exists)
+
+ clientTestUtils.RemoveAllAndAssert(t, filepath.Join(wd, tests.LcRbName1))
+}
+
func TestArtifactoryUploadPathWithSpecialCharsAsNoRegex(t *testing.T) {
initArtifactoryTest(t, "")
filePath := getSpecialCharFilePath()
@@ -5654,10 +5686,10 @@ func sendArtifactoryTrustedPublicKey(t *testing.T, artHttpDetails httputils.Http
assert.NoError(t, err)
}
-func deleteReceivedReleaseBundle(t *testing.T, bundleName, bundleVersion string) {
+func deleteReceivedReleaseBundle(t *testing.T, url, bundleName, bundleVersion string) {
client, err := httpclient.ClientBuilder().Build()
assert.NoError(t, err)
- deleteApi := path.Join("artifactory/api/release/bundles/", bundleName, bundleVersion)
+ deleteApi := path.Join(url, bundleName, bundleVersion)
_, _, err = client.SendDelete(*tests.JfrogUrl+deleteApi, []byte{}, artHttpDetails, "Deleting release bundle")
assert.NoError(t, err)
}
diff --git a/build/apple_release/jf.app/Contents/Info.plist b/build/apple_release/jf.app/Contents/Info.plist
new file mode 100644
index 000000000..d7bfe9283
--- /dev/null
+++ b/build/apple_release/jf.app/Contents/Info.plist
@@ -0,0 +1,14 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en-US
+ CFBundleName
+ JFrog-CLI
+ CFBundleDisplayName
+ JFrog-CLI
+ CFBundleIdentifier
+ com.jfrog.jfrog-cli
+
+
\ No newline at end of file
diff --git a/build/apple_release/jf.app/Contents/MacOs/README.md b/build/apple_release/jf.app/Contents/MacOs/README.md
new file mode 100644
index 000000000..587b84285
--- /dev/null
+++ b/build/apple_release/jf.app/Contents/MacOs/README.md
@@ -0,0 +1,32 @@
+# Apple Bundle Structure README
+
+This README file serves as a guide to maintaining the integrity of the Apple bundle structure required for macOS applications. It is crucial to keep this file and adhere to the outlined structure to ensure the application functions correctly on macOS.
+
+## Structure Overview
+
+The Apple bundle for a macOS application typically has the following directory structure:### Key Components
+```
+ YOUR_APP.app
+ ├── Contents
+ ├── MacOS
+ │ └── YOUR_APP (executable file)
+ └── Info.plist
+
+```
+- **YOUR_APP.app**: This is the root directory of your application bundle. Replace `YOUR_APP` with the name of your application.
+
+- **Contents**: A mandatory directory that contains all the files needed by the application.
+
+- **MacOS**: This directory should contain the executable file for your application. The name of the executable should match the `YOUR_APP` part of your application bundle's name.
+
+- **Info.plist**: A required file that contains configuration and permissions for your application. It informs the macOS about how your app should be treated and what capabilities it has.
+
+### Important Notes
+
+- **Do Not Delete**: This README file and the structure it describes are essential for the application's deployment and functionality on macOS. Removing or altering the structure may result in application failures.
+
+- **Executable File**: Ensure your application's executable file is placed inside the `MacOS` directory. The executable's name must match the `YOUR_APP` portion of your application bundle's name for macOS to recognize and launch it correctly.
+
+- **Info.plist Configuration**: Properly configure the `Info.plist` file according to your application's needs. This file includes critical information such as the app version, display name, permissions, and more.
+
+By adhering to this structure and guidelines, you ensure that your macOS application is packaged correctly for distribution and use.
\ No newline at end of file
diff --git a/build/apple_release/jfrog.app/Contents/Info.plist b/build/apple_release/jfrog.app/Contents/Info.plist
new file mode 100644
index 000000000..d7bfe9283
--- /dev/null
+++ b/build/apple_release/jfrog.app/Contents/Info.plist
@@ -0,0 +1,14 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en-US
+ CFBundleName
+ JFrog-CLI
+ CFBundleDisplayName
+ JFrog-CLI
+ CFBundleIdentifier
+ com.jfrog.jfrog-cli
+
+
\ No newline at end of file
diff --git a/build/apple_release/jfrog.app/Contents/MacOs/README.md b/build/apple_release/jfrog.app/Contents/MacOs/README.md
new file mode 100644
index 000000000..587b84285
--- /dev/null
+++ b/build/apple_release/jfrog.app/Contents/MacOs/README.md
@@ -0,0 +1,32 @@
+# Apple Bundle Structure README
+
+This README file serves as a guide to maintaining the integrity of the Apple bundle structure required for macOS applications. It is crucial to keep this file and adhere to the outlined structure to ensure the application functions correctly on macOS.
+
+## Structure Overview
+
+The Apple bundle for a macOS application typically has the following directory structure:### Key Components
+```
+ YOUR_APP.app
+ ├── Contents
+ ├── MacOS
+ │ └── YOUR_APP (executable file)
+ └── Info.plist
+
+```
+- **YOUR_APP.app**: This is the root directory of your application bundle. Replace `YOUR_APP` with the name of your application.
+
+- **Contents**: A mandatory directory that contains all the files needed by the application.
+
+- **MacOS**: This directory should contain the executable file for your application. The name of the executable should match the `YOUR_APP` part of your application bundle's name.
+
+- **Info.plist**: A required file that contains configuration and permissions for your application. It informs the macOS about how your app should be treated and what capabilities it has.
+
+### Important Notes
+
+- **Do Not Delete**: This README file and the structure it describes are essential for the application's deployment and functionality on macOS. Removing or altering the structure may result in application failures.
+
+- **Executable File**: Ensure your application's executable file is placed inside the `MacOS` directory. The executable's name must match the `YOUR_APP` portion of your application bundle's name for macOS to recognize and launch it correctly.
+
+- **Info.plist Configuration**: Properly configure the `Info.plist` file according to your application's needs. This file includes critical information such as the app version, display name, permissions, and more.
+
+By adhering to this structure and guidelines, you ensure that your macOS application is packaged correctly for distribution and use.
\ No newline at end of file
diff --git a/build/apple_release/scripts/darwin-sign-and-notarize.sh b/build/apple_release/scripts/darwin-sign-and-notarize.sh
new file mode 100755
index 000000000..bc21fc3da
--- /dev/null
+++ b/build/apple_release/scripts/darwin-sign-and-notarize.sh
@@ -0,0 +1,99 @@
+#!/bin/bash
+
+# Script Purpose: Automate the process of signing and notarizing a macOS binary.
+
+# Input:
+# - APPLE_CERT_DATA: Base64 encoded data of the Apple Developer certificate.
+# - APPLE_CERT_PASSWORD: Password for the Apple Developer certificate.
+# - APPLE_TEAM_ID: Identifier for the Apple Developer Team.
+# - APPLE_ACCOUNT_ID: Apple Developer Account ID.
+# - APPLE_APP_SPECIFIC_PASSWORD: Password for app-specific services on the Apple Developer Account.
+# - APP_TEMPLATE_PATH: Path to the .app bundle template.
+
+# Output:
+# A signed and notarized binary file in the current directory, ready for distribution.
+
+validate_app_template_structure() {
+ [ ! -d "$APP_TEMPLATE_PATH" ] && { echo "Error: $APP_TEMPLATE_PATH directory does not exist."; exit 1; }
+ [ ! -d "$APP_TEMPLATE_PATH/Contents" ] && { echo "Error: Contents directory does not exist in $APP_TEMPLATE_PATH."; exit 1; }
+ [ ! -d "$APP_TEMPLATE_PATH/Contents/MacOS" ] && { echo "Error: MacOS directory does not exist in $APP_TEMPLATE_PATH/Contents."; exit 1; }
+ [ ! -f "$APP_TEMPLATE_PATH/Contents/Info.plist" ] && { echo "Error: Info.plist file does not exist in $APP_TEMPLATE_PATH/Contents."; exit 1; }
+
+ local app_name_without_extension
+ app_name_without_extension=$(basename "$APP_TEMPLATE_PATH" .app)
+ export BINARY_FILE_NAME=$app_name_without_extension
+
+ [ ! -f "$APP_TEMPLATE_PATH/Contents/MacOS/$BINARY_FILE_NAME" ] && { echo "Error: $BINARY_FILE_NAME executable not found inside the MacOS folder."; exit 1; }
+}
+
+validate_inputs() {
+ [ -z "$APPLE_CERT_DATA" ] && { echo "Error: Missing APPLE_CERT_DATA environment variable."; exit 1; }
+ [ -z "$APPLE_CERT_PASSWORD" ] && { echo "Error: Missing APPLE_CERT_PASSWORD environment variable."; exit 1; }
+ [ -z "$APPLE_TEAM_ID" ] && { echo "Error: Missing APPLE_TEAM_ID environment variable."; exit 1; }
+
+ validate_app_template_structure
+}
+
+prepare_keychain_and_certificate() {
+ local temp_dir
+ temp_dir=$(mktemp -d)
+ local keychain_name="macos-build.keychain"
+
+ echo "$APPLE_CERT_DATA" | base64 --decode > "$temp_dir/certs.p12"
+
+ security create-keychain -p "$APPLE_CERT_PASSWORD" $keychain_name
+ security default-keychain -s $keychain_name
+ security unlock-keychain -p "$APPLE_CERT_PASSWORD" $keychain_name
+ security set-keychain-settings -t 3600 -u $keychain_name
+
+ security import "$temp_dir/certs.p12" -k ~/Library/Keychains/$keychain_name -P "$APPLE_CERT_PASSWORD" -T /usr/bin/codesign || { echo "Error: Failed to import certificate into keychain."; exit 1; }
+
+ security set-key-partition-list -S apple-tool:,apple: -s -k "$APPLE_CERT_PASSWORD" -D "$APPLE_TEAM_ID" -t private $keychain_name
+}
+
+sign_binary() {
+ codesign -s "$APPLE_TEAM_ID" --timestamp --deep --options runtime --force "$APP_TEMPLATE_PATH/Contents/MacOS/$BINARY_FILE_NAME" || { echo "Error: Failed to sign the binary."; exit 1; }
+ echo "Successfully signed the binary."
+}
+
+notarize_app() {
+ local temp_dir
+ temp_dir=$(mktemp -d)
+ local current_dir
+ current_dir=$(pwd)
+
+ cp -r "$APP_TEMPLATE_PATH" "$temp_dir"
+ cd "$temp_dir" || exit
+
+ local temp_zipped_name="${BINARY_FILE_NAME}-zipped.zip"
+ ditto -c -k --keepParent "$BINARY_FILE_NAME.app" "./$temp_zipped_name" || { echo "Error: Failed to zip the app."; exit 1; }
+
+ xcrun notarytool submit "$temp_zipped_name" --apple-id "$APPLE_ACCOUNT_ID" --team-id "$APPLE_TEAM_ID" --password "$APPLE_APP_SPECIFIC_PASSWORD" --wait || { echo "Error: Failed to notarize the app."; exit 1; }
+ echo "Notarization successful."
+
+ unzip -o "$temp_zipped_name"
+ xcrun stapler staple "$BINARY_FILE_NAME.app" || { echo "Error: Failed to staple the ticket to the app."; exit 1; }
+ echo "Stapling successful."
+
+ cp "./$BINARY_FILE_NAME.app/Contents/MacOS/$BINARY_FILE_NAME" "$current_dir"
+ cd "$current_dir" || exit
+ rm -rf "$temp_dir"
+}
+
+# Cleans up resources used during the process.
+cleanup() {
+ echo "Deleting keychain..."
+ security delete-keychain "macos-build.keychain"
+ echo "Deleting temporary certificate files..."
+ rm -rf "$temp_dir/certs.p12"
+}
+
+main() {
+ validate_inputs
+ prepare_keychain_and_certificate
+ sign_binary
+ notarize_app
+ cleanup
+}
+
+main
\ No newline at end of file
diff --git a/build/apple_release/scripts/download-signed-mac-OS-binaries.sh b/build/apple_release/scripts/download-signed-mac-OS-binaries.sh
new file mode 100755
index 000000000..1c1d22f38
--- /dev/null
+++ b/build/apple_release/scripts/download-signed-mac-OS-binaries.sh
@@ -0,0 +1,84 @@
+#!/bin/bash
+
+# Script Purpose: Download signed macOS binaries for a specific version and architecture.
+# The name of the CLI executable to be processed - jfrog or jf
+cliExecutableName=$1
+
+# The version of the release being processed
+releaseVersion=$2
+
+# The architecture of the macOS binary to be downloaded - amd64 or arm64
+goarch=$3
+
+# GitHub Access Token for authentication from ENV
+
+# Function to retrieve the specific artifact URL with retries
+get_specific_artifact_url_with_retries() {
+ local max_retries=10
+ # Cooldown in seconds between retries
+ local cooldown=20
+ local retry_count=0
+
+ while [ $retry_count -lt $max_retries ]; do
+ # Fetch the list of artifacts from GitHub
+ response=$(curl -L --retry 3 \
+ -H "Accept: application/vnd.github+json" \
+ -H "Authorization: Bearer $GITHUB_ACCESS_TOKEN" \
+ -H "X-GitHub-Api-Version: 2022-11-28" \
+ -s https://api.github.com/repos/jfrog/jfrog-cli/actions/artifacts)
+
+ # Parse the response to find the URL of the desired artifact
+ if ! artifactUrl=$(echo "$response" | jq -r "first(.artifacts[] | select(.name | contains(\"$cliExecutableName-darwin-v$releaseVersion-$goarch\")) | .archive_download_url)"); then
+ artifactUrl=""
+ fi
+
+ # If a valid URL is found, return it
+ if [[ "$artifactUrl" =~ ^https?://.+ ]]; then
+ echo "$artifactUrl"
+ return 0
+ else
+ # If not found, retry after a cooldown period
+ retry_count=$((retry_count+1))
+ sleep $cooldown
+ fi
+ done
+
+ # If the maximum number of retries is exceeded, report failure
+ echo "Curl request failed after $max_retries attempts."
+ return 1
+}
+
+# Function to download and extract the signed macOS binaries
+downloadSignedMacOSBinaries() {
+ echo "Downloading Signed macOS Binaries for goarch: $goarch, release version: $releaseVersion"
+
+ # Attempt to get the specific artifact URL
+ if ! artifactUrl=$(get_specific_artifact_url_with_retries); then
+ echo "Failed to retrieve the artifact URL after multiple attempts."
+ exit 1
+ fi
+
+ echo "Downloading signed executable from $artifactUrl"
+ curl -L \
+ -H "Accept: application/vnd.github+json" \
+ -H "Authorization: Bearer $GITHUB_ACCESS_TOKEN" \
+ -H "X-GitHub-Api-Version: 2022-11-28" \
+ "$artifactUrl" -o artifact.zip
+
+ echo "installing zip..."
+ apt-get update
+ apt-get install unzip
+
+ # Extract the artifact and clean up
+ unzip artifact.zip
+ rm -rf artifact.zip
+
+ # Check if the executable exists
+ if [ ! -f "$cliExecutableName" ]; then
+ echo "Error: Executable $cliExecutableName not found."
+ exit 1
+ fi
+}
+
+# Start the process
+downloadSignedMacOSBinaries
\ No newline at end of file
diff --git a/build/apple_release/scripts/trigger-sign-mac-OS-workflow.sh b/build/apple_release/scripts/trigger-sign-mac-OS-workflow.sh
new file mode 100644
index 000000000..40d5e14c3
--- /dev/null
+++ b/build/apple_release/scripts/trigger-sign-mac-OS-workflow.sh
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+
+# This script triggers a GitHub Actions workflow to sign and notarize macOS binaries.
+
+# The name of the CLI executable to be processed
+cliExecutableName=$1
+
+# The version of the release being processed
+releaseVersion=$2
+
+# GitHub Access Token for authentication from ENV
+
+
+
+# Trigger
+curl -L \
+ --retry 3 \
+ -X POST \
+ -H "Accept: application/vnd.github+json" \
+ -H "Authorization: Bearer $GITHUB_ACCESS_TOKEN" \
+ -H "X-GitHub-Api-Version: 2022-11-28" \
+ https://api.github.com/repos/jfrog/jfrog-cli/actions/workflows/prepareDarwinBinariesForRelease.yml/dispatches \
+ -d "{\"ref\":\"v2\",\"inputs\":{\"releaseVersion\":\"$releaseVersion\",\"binaryFileName\":\"$cliExecutableName\"}}"
\ No newline at end of file
diff --git a/build/npm/v2-jf/package-lock.json b/build/npm/v2-jf/package-lock.json
index 1bcb4c79e..0f3b7382c 100644
--- a/build/npm/v2-jf/package-lock.json
+++ b/build/npm/v2-jf/package-lock.json
@@ -1,5 +1,5 @@
{
"name": "jfrog-cli-v2-jf",
- "version": "2.73.0",
+ "version": "2.73.1",
"lockfileVersion": 1
}
diff --git a/build/npm/v2-jf/package.json b/build/npm/v2-jf/package.json
index 061476dca..c28b14d14 100644
--- a/build/npm/v2-jf/package.json
+++ b/build/npm/v2-jf/package.json
@@ -1,6 +1,6 @@
{
"name": "jfrog-cli-v2-jf",
- "version": "2.73.0",
+ "version": "2.73.1",
"description": "🐸 Command-line interface for JFrog Artifactory, Xray, Distribution, Pipelines and Mission Control 🐸",
"homepage": "https://github.com/jfrog/jfrog-cli",
"preferGlobal": true,
diff --git a/build/npm/v2/package-lock.json b/build/npm/v2/package-lock.json
index a93b3ba46..8b2298fce 100644
--- a/build/npm/v2/package-lock.json
+++ b/build/npm/v2/package-lock.json
@@ -1,5 +1,5 @@
{
"name": "jfrog-cli-v2",
- "version": "2.73.0",
+ "version": "2.73.1",
"lockfileVersion": 2
}
diff --git a/build/npm/v2/package.json b/build/npm/v2/package.json
index 6bee8d64c..1b9e53702 100644
--- a/build/npm/v2/package.json
+++ b/build/npm/v2/package.json
@@ -1,6 +1,6 @@
{
"name": "jfrog-cli-v2",
- "version": "2.73.0",
+ "version": "2.73.1",
"description": "🐸 Command-line interface for JFrog Artifactory, Xray, Distribution, Pipelines and Mission Control 🐸",
"homepage": "https://github.com/jfrog/jfrog-cli",
"preferGlobal": true,
diff --git a/docs/general/summary/help.go b/docs/general/summary/help.go
index 6bb556945..f53eafd52 100644
--- a/docs/general/summary/help.go
+++ b/docs/general/summary/help.go
@@ -3,7 +3,5 @@ package summary
var Usage = []string{"csm"}
func GetDescription() string {
- return `Generates a Summary of recorded CLI commands there were executed on the current machine.
- The report is generated in Markdown format and saved in the directory stored in the JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR environment variable.
-`
+ return `Generates a Summary of recorded CLI commands there were executed on the current machine. The report is generated in Markdown format and saved in the directory stored in the JFROG_CLI_COMMAND_SUMMARY_OUTPUT_DIR environment variable.`
}
diff --git a/docs/general/token/help.go b/docs/general/token/help.go
index 07d65ef51..d7dc4124d 100644
--- a/docs/general/token/help.go
+++ b/docs/general/token/help.go
@@ -3,8 +3,7 @@ package token
var Usage = []string{"atc", "atc "}
func GetDescription() string {
- return `Creates an access token. By default, an user-scoped token will be created.
- Administrator may provide the scope explicitly with '--scope', or implicitly with '--groups', '--grant-admin'.`
+ return `Creates an access token. By default, an user-scoped token will be created. Administrator may provide the scope explicitly with '--scope', or implicitly with '--groups', '--grant-admin'.`
}
func GetArguments() string {
diff --git a/go.mod b/go.mod
index c51dc8755..df843a14d 100644
--- a/go.mod
+++ b/go.mod
@@ -1,6 +1,6 @@
module github.com/jfrog/jfrog-cli
-go 1.23.3
+go 1.23.4
replace (
// Should not be updated to 0.2.6 due to a bug (https://github.com/jfrog/jfrog-cli-core/pull/372)
@@ -19,10 +19,10 @@ require (
github.com/jfrog/build-info-go v1.10.8
github.com/jfrog/gofrog v1.7.6
github.com/jfrog/jfrog-cli-artifactory v0.1.11
- github.com/jfrog/jfrog-cli-core/v2 v2.57.6
+ github.com/jfrog/jfrog-cli-core/v2 v2.57.7
github.com/jfrog/jfrog-cli-platform-services v1.6.0
- github.com/jfrog/jfrog-cli-security v1.14.0
- github.com/jfrog/jfrog-client-go v1.49.0
+ github.com/jfrog/jfrog-cli-security v1.14.1
+ github.com/jfrog/jfrog-client-go v1.49.1
github.com/jszwec/csvutil v1.10.0
github.com/manifoldco/promptui v0.9.0
github.com/stretchr/testify v1.10.0
@@ -40,7 +40,7 @@ require (
github.com/BurntSushi/toml v1.4.0 // indirect
github.com/CycloneDX/cyclonedx-go v0.9.0 // indirect
github.com/Microsoft/go-winio v0.6.2 // indirect
- github.com/ProtonMail/go-crypto v1.1.2 // indirect
+ github.com/ProtonMail/go-crypto v1.1.3 // indirect
github.com/VividCortex/ewma v1.2.0 // indirect
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect
github.com/andybalholm/brotli v1.1.0 // indirect
@@ -53,7 +53,7 @@ require (
github.com/containerd/platforms v0.2.1 // indirect
github.com/cpuguy83/dockercfg v0.3.2 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect
- github.com/cyphar/filepath-securejoin v0.2.4 // indirect
+ github.com/cyphar/filepath-securejoin v0.2.5 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/distribution/reference v0.6.0 // indirect
github.com/docker/go-connections v0.5.0 // indirect
@@ -65,8 +65,8 @@ require (
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/gfleury/go-bitbucket-v1 v0.0.0-20230825095122-9bc1711434ab // indirect
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
- github.com/go-git/go-billy/v5 v5.5.0 // indirect
- github.com/go-git/go-git/v5 v5.12.0 // indirect
+ github.com/go-git/go-billy/v5 v5.6.0 // indirect
+ github.com/go-git/go-git/v5 v5.13.0 // indirect
github.com/go-logr/logr v1.4.2 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
@@ -130,7 +130,7 @@ require (
github.com/shirou/gopsutil/v3 v3.23.12 // indirect
github.com/shoenig/go-m1cpu v0.1.6 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
- github.com/skeema/knownhosts v1.2.2 // indirect
+ github.com/skeema/knownhosts v1.3.0 // indirect
github.com/sourcegraph/conc v0.3.0 // indirect
github.com/spf13/afero v1.11.0 // indirect
github.com/spf13/cast v1.6.0 // indirect
@@ -140,7 +140,7 @@ require (
github.com/tklauser/go-sysconf v0.3.12 // indirect
github.com/tklauser/numcpus v0.6.1 // indirect
github.com/ulikunitz/xz v0.5.12 // indirect
- github.com/vbauerster/mpb/v8 v8.8.3 // indirect
+ github.com/vbauerster/mpb/v8 v8.9.1 // indirect
github.com/virtuald/go-ordered-json v0.0.0-20170621173500-b18e6e673d74 // indirect
github.com/xanzy/go-gitlab v0.110.0 // indirect
github.com/xanzy/ssh-agent v0.3.3 // indirect
@@ -179,3 +179,7 @@ require (
// replace github.com/jfrog/build-info-go => github.com/jfrog/build-info-go v1.8.9-0.20241220065541-91828d43d8b9
// replace github.com/jfrog/gofrog => github.com/jfrog/gofrog dev
+
+// replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250101110857-b26e9a6644c6
+
+// replace github.com/jfrog/jfrog-client-go => github.com/jfrog/jfrog-client-go v1.28.1-0.20250112155823-f3d607f5d854
diff --git a/go.sum b/go.sum
index a14ac0b20..86a74c655 100644
--- a/go.sum
+++ b/go.sum
@@ -13,8 +13,8 @@ github.com/CycloneDX/cyclonedx-go v0.9.0/go.mod h1:NE/EWvzELOFlG6+ljX/QeMlVt9VKc
github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
-github.com/ProtonMail/go-crypto v1.1.2 h1:A7JbD57ThNqh7XjmHE+PXpQ3Dqt3BrSAC0AL0Go3KS0=
-github.com/ProtonMail/go-crypto v1.1.2/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE=
+github.com/ProtonMail/go-crypto v1.1.3 h1:nRBOetoydLeUb4nHajyO2bKqMLfWQ/ZPwkXqXxPxCFk=
+github.com/ProtonMail/go-crypto v1.1.3/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE=
github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow=
github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4=
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8=
@@ -62,8 +62,8 @@ github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46t
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
-github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg=
-github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
+github.com/cyphar/filepath-securejoin v0.2.5 h1:6iR5tXJ/e6tJZzzdMc1km3Sa7RRIVBKAK32O2s7AYfo=
+github.com/cyphar/filepath-securejoin v0.2.5/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
@@ -81,8 +81,8 @@ github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD
github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 h1:2tV76y6Q9BB+NEBasnqvs7e49aEBFI8ejC89PSnWH+4=
github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707/go.mod h1:qssHWj60/X5sZFNxpG4HBPDHVqxNm4DfnCKgrbZOT+s=
github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY=
-github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU=
-github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM=
+github.com/elazarl/goproxy v1.2.1 h1:njjgvO6cRG9rIqN2ebkqy6cQz2Njkx7Fsfv/zIZqgug=
+github.com/elazarl/goproxy v1.2.1/go.mod h1:YfEbZtqP4AetfO6d40vWchF3znWX7C7Vd6ZMfdL8z64=
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
@@ -97,16 +97,16 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/gfleury/go-bitbucket-v1 v0.0.0-20230825095122-9bc1711434ab h1:+7KwW/yy/ThnRXW9khailFFncxJiiFpxyk5BI9GK9pI=
github.com/gfleury/go-bitbucket-v1 v0.0.0-20230825095122-9bc1711434ab/go.mod h1:IqOZzks2wlWCIai0esXnZPdPwxF2yOz0HcCYw5I4pCg=
-github.com/gliderlabs/ssh v0.3.7 h1:iV3Bqi942d9huXnzEF2Mt+CY9gLu8DNM4Obd+8bODRE=
-github.com/gliderlabs/ssh v0.3.7/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8=
+github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c=
+github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU=
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI=
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic=
-github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU=
-github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow=
+github.com/go-git/go-billy/v5 v5.6.0 h1:w2hPNtoehvJIxR00Vb4xX94qHQi/ApZfX+nBE2Cjio8=
+github.com/go-git/go-billy/v5 v5.6.0/go.mod h1:sFDq7xD3fn3E0GOwUSZqHo9lrkmx8xJhA0ZrfvjBRGM=
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4=
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII=
-github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys=
-github.com/go-git/go-git/v5 v5.12.0/go.mod h1:FTM9VKtnI2m65hNI/TenDDDnUf2Q9FHnXYjuz9i5OEY=
+github.com/go-git/go-git/v5 v5.13.0 h1:vLn5wlGIh/X78El6r3Jr+30W16Blk0CTcxTYcYPWi5E=
+github.com/go-git/go-git/v5 v5.13.0/go.mod h1:Wjo7/JyVKtQgUNdXYXIepzWfJQkUEIGvkvVkiXRR/zw=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
@@ -173,14 +173,14 @@ github.com/jfrog/jfrog-apps-config v1.0.1 h1:mtv6k7g8A8BVhlHGlSveapqf4mJfonwvXYL
github.com/jfrog/jfrog-apps-config v1.0.1/go.mod h1:8AIIr1oY9JuH5dylz2S6f8Ym2MaadPLR6noCBO4C22w=
github.com/jfrog/jfrog-cli-artifactory v0.1.11 h1:tYGQpkGZVHwYxApKhMXgY1V25QaLFaTbjsoq0l3Bf4w=
github.com/jfrog/jfrog-cli-artifactory v0.1.11/go.mod h1:rVBTbanRnG9CXyAYRJ2O6h2fJMa+fsGB+3swUB/qEt0=
-github.com/jfrog/jfrog-cli-core/v2 v2.57.6 h1:kI5BqDW8Q4R5HkTUPSAObTqyIgQ9z7DqeFYGOEC1zPk=
-github.com/jfrog/jfrog-cli-core/v2 v2.57.6/go.mod h1:h5pzOZUb5ChGcGrXCYr3nPyXcTZjeGW2Rm1Zceo8Afg=
+github.com/jfrog/jfrog-cli-core/v2 v2.57.7 h1:2cZS9C5jBYpyCF4PoUzvGCnwFA7CsvG6jszCj1I3tsg=
+github.com/jfrog/jfrog-cli-core/v2 v2.57.7/go.mod h1:ueB6LtU+gW7/hTyfKyka/BHi52oo5lEH46RodTly1PU=
github.com/jfrog/jfrog-cli-platform-services v1.6.0 h1:2fBIDxnQaFWStZqMEUI2I3nkNjDmknxxHcmpeLxtocc=
github.com/jfrog/jfrog-cli-platform-services v1.6.0/go.mod h1:u3lMRG7XC8MeUy/OPkHkZnsgCMIi0br4sjk2/W1Pm8I=
-github.com/jfrog/jfrog-cli-security v1.14.0 h1:mGm/ya0Qh0YdBS7ATgmQi1r8MEkbM8Hh/ml4UPkuu/4=
-github.com/jfrog/jfrog-cli-security v1.14.0/go.mod h1:KGfZVb4je4fiWm+OTNWdyi8V3c2TAkNDZHxsUUEM2GE=
-github.com/jfrog/jfrog-client-go v1.49.0 h1:NaTK6+LQBEJafL//6ntnS/eVx1dZMJnxydALwWHKORQ=
-github.com/jfrog/jfrog-client-go v1.49.0/go.mod h1:ohIfKpMBCQsE9kunrKQ1wvoExpqsPLaluRFO186B5EM=
+github.com/jfrog/jfrog-cli-security v1.14.1 h1:80Sbml/tzJEsxXj7dERrRRaBz5mlfuB8qBKUdEJ7MtU=
+github.com/jfrog/jfrog-cli-security v1.14.1/go.mod h1:3F3H36AX7vt3wLo1Ht0LByUo9SyDWhOV39zfoV2h/Zs=
+github.com/jfrog/jfrog-client-go v1.49.1 h1:AdJ+x+BSka3pCVDu6MCEvojwOmXvy1Q5S0dILvpfoDw=
+github.com/jfrog/jfrog-client-go v1.49.1/go.mod h1:ohIfKpMBCQsE9kunrKQ1wvoExpqsPLaluRFO186B5EM=
github.com/jszwec/csvutil v1.10.0 h1:upMDUxhQKqZ5ZDCs/wy+8Kib8rZR8I8lOR34yJkdqhI=
github.com/jszwec/csvutil v1.10.0/go.mod h1:/E4ONrmGkwmWsk9ae9jpXnv9QT8pLHEPcCirMFhxG9I=
github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k=
@@ -256,8 +256,8 @@ github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
github.com/nwaples/rardecode v1.1.3 h1:cWCaZwfM5H7nAD6PyEdcVnczzV8i/JtotnyW/dD9lEc=
github.com/nwaples/rardecode v1.1.3/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0=
-github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI=
-github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M=
+github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
+github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug=
@@ -311,8 +311,8 @@ github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnj
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
-github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A=
-github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo=
+github.com/skeema/knownhosts v1.3.0 h1:AM+y0rI04VksttfwjkSTNQorvGqmwATnvnAHpSgc0LY=
+github.com/skeema/knownhosts v1.3.0/go.mod h1:sPINvnADmT/qYH1kfv+ePMmOBTH6Tbl7b5LvTDjFK7M=
github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=
@@ -353,8 +353,8 @@ github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc=
github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
github.com/urfave/cli v1.22.16 h1:MH0k6uJxdwdeWQTwhSO42Pwr4YLrNLwBtg1MRgTqPdQ=
github.com/urfave/cli v1.22.16/go.mod h1:EeJR6BKodywf4zciqrdw6hpCPk68JO9z5LazXZMn5Po=
-github.com/vbauerster/mpb/v8 v8.8.3 h1:dTOByGoqwaTJYPubhVz3lO5O6MK553XVgUo33LdnNsQ=
-github.com/vbauerster/mpb/v8 v8.8.3/go.mod h1:JfCCrtcMsJwP6ZwMn9e5LMnNyp3TVNpUWWkN+nd4EWk=
+github.com/vbauerster/mpb/v8 v8.9.1 h1:LH5R3lXPfE2e3lIGxN7WNWv3Hl5nWO6LRi2B0L0ERHw=
+github.com/vbauerster/mpb/v8 v8.9.1/go.mod h1:4XMvznPh8nfe2NpnDo1QTPvW9MVkUhbG90mPWvmOzcQ=
github.com/virtuald/go-ordered-json v0.0.0-20170621173500-b18e6e673d74 h1:JwtAtbp7r/7QSyGz8mKUbYJBg2+6Cd7OjM8o/GNOcVo=
github.com/virtuald/go-ordered-json v0.0.0-20170621173500-b18e6e673d74/go.mod h1:RmMWU37GKR2s6pgrIEB4ixgpVCt/cf7dnJv3fuH1J1c=
github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4=
diff --git a/lifecycle_test.go b/lifecycle_test.go
index 4913d5f91..4367e8205 100644
--- a/lifecycle_test.go
+++ b/lifecycle_test.go
@@ -30,7 +30,7 @@ import (
const (
artifactoryLifecycleMinVersion = "7.68.3"
- signingKeyOptionalArtifactoryMinVersion = "7.101.1"
+ signingKeyOptionalArtifactoryMinVersion = "7.104.1"
gpgKeyPairName = "lc-tests-key-pair"
lcTestdataPath = "lifecycle"
releaseBundlesSpec = "release-bundles-spec.json"
diff --git a/utils/cliutils/cli_consts.go b/utils/cliutils/cli_consts.go
index b9f682d50..780a07df5 100644
--- a/utils/cliutils/cli_consts.go
+++ b/utils/cliutils/cli_consts.go
@@ -4,7 +4,7 @@ import "time"
const (
// General CLI constants
- CliVersion = "2.73.0"
+ CliVersion = "2.73.1"
ClientAgent = "jfrog-cli-go"
// CLI base commands constants: