Skip to content

Commit 0b5e8ca

Browse files
committed
feat: Ensure cli builder uses proper version of the collector
1 parent c83cd28 commit 0b5e8ca

File tree

6 files changed

+128
-93
lines changed

6 files changed

+128
-93
lines changed

cmd/nrdot-collector-builder/cmd/manifest.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ package cmd
44

55
import (
66
"fmt"
7+
78
"newrelic-collector-builder/cmd/manifest"
89

910
"github.com/spf13/cobra"

cmd/nrdot-collector-builder/cmd/manifest/update.go

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@ package manifest
55
import (
66
"encoding/json"
77
"fmt"
8-
"newrelic-collector-builder/internal/manifest"
98
"path/filepath"
109

10+
"newrelic-collector-builder/internal/manifest"
11+
1112
"github.com/knadh/koanf/parsers/yaml"
1213
"github.com/knadh/koanf/v2"
1314
"golang.org/x/mod/semver"
@@ -36,7 +37,8 @@ var UpdateCmd = &cobra.Command{
3637
return nil
3738
}
3839

39-
var otelColVersion string
40+
var currentVersions manifest.Versions
41+
var nextVersions manifest.Versions
4042

4143
for _, match := range matches {
4244
cfg, _, err := initConfig(match, verbose)
@@ -53,14 +55,18 @@ var UpdateCmd = &cobra.Command{
5355
return fmt.Errorf("go not found: %w", err)
5456
}
5557

56-
if err = cfg.SetOtelColVersion(); err != nil {
57-
return fmt.Errorf("go not found: %w", err)
58+
if err = cfg.SetVersions(); err != nil {
59+
return fmt.Errorf("versions not found: %w", err)
5860
}
5961

6062
if err = cfg.ParseModules(); err != nil {
6163
return fmt.Errorf("invalid module configuration: %w", err)
6264
}
6365

66+
if (currentVersions.BetaCoreVersion == "") || semver.Compare(cfg.Versions.BetaCoreVersion, currentVersions.BetaCoreVersion) > 0 {
67+
currentVersions = cfg.Versions
68+
}
69+
6470
updatedCfg, err := manifest.UpdateConfigModules(cfg)
6571
if err != nil {
6672
return fmt.Errorf("failed to update configuration: %w", err)
@@ -70,17 +76,19 @@ var UpdateCmd = &cobra.Command{
7076
return fmt.Errorf("failed to write configuration file: %w", err)
7177
}
7278

73-
if otelColVersion == "" || semver.Compare(otelColVersion, updatedCfg.OtelColVersion) > 0 {
74-
otelColVersion = updatedCfg.OtelColVersion
79+
if (nextVersions.BetaCoreVersion == "") || semver.Compare(updatedCfg.Versions.BetaCoreVersion, nextVersions.BetaCoreVersion) > 0 {
80+
nextVersions = updatedCfg.Versions
7581
}
7682
}
7783

7884
if jsonOutput {
7985
// print JSON output of all otel versions
8086
output := struct {
81-
OtelColVersion string `json:"otelColVersion"`
87+
NextVersions manifest.Versions `json:"nextVersions"`
88+
CurrentVersions manifest.Versions `json:"currentVersions"`
8289
}{
83-
OtelColVersion: otelColVersion,
90+
NextVersions: nextVersions,
91+
CurrentVersions: currentVersions,
8492
}
8593
b, err := json.Marshal(output)
8694
if err != nil {

cmd/nrdot-collector-builder/internal/manifest/config.go

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313

1414
"go.uber.org/multierr"
1515
"go.uber.org/zap"
16+
"golang.org/x/mod/semver"
1617
"gopkg.in/yaml.v3"
1718
)
1819

@@ -22,15 +23,21 @@ var errMissingGoMod = errors.New("missing gomod specification for module")
2223
const coreModule = "go.opentelemetry.io/collector"
2324
const contribModule = "github.com/open-telemetry/opentelemetry-collector-contrib"
2425

26+
type Versions struct {
27+
BetaCoreVersion string `json:"betaCoreVersion"`
28+
BetaContribVersion string `json:"betaContribVersion"`
29+
StableCoreVersion string `json:"stableCoreVersion"`
30+
}
31+
2532
// Config holds the builder's configuration
2633
type Config struct {
2734
Logger *zap.Logger
2835
Path string `mapstructure:"-"` // path to the config file
2936
Dir string `mapstructure:"-"` // path to the config directory
3037

31-
OtelColVersion string `mapstructure:"-"` // only used be the go.mod template
32-
Verbose bool `mapstructure:"-"`
33-
YamlNode yaml.Node `mapstructure:"-"`
38+
Versions Versions `mapstructure:"-"` // only used be the go.mod template
39+
Verbose bool `mapstructure:"-"`
40+
YamlNode yaml.Node `mapstructure:"-"`
3441

3542
Distribution Distribution `mapstructure:"dist"`
3643
Exporters []Module `mapstructure:"exporters"`
@@ -95,17 +102,44 @@ func isOtelComponent(component Module) bool {
95102
return false
96103
}
97104

98-
func (c *Config) SetOtelColVersion() error {
105+
func isStableVersion(version string) bool {
106+
// Check if the version is a stable version (not a pre-release)
107+
if semver.Compare(version, "v1.0.0") >= 0 {
108+
return true
109+
}
110+
return false
111+
}
112+
113+
func (c *Config) SetVersions() error {
114+
115+
versions := Versions{}
116+
99117
for _, component := range c.allOtelComponents() {
100-
if isOtelCoreComponent(component.GoMod) {
101-
c.OtelColVersion = strings.Split(component.GoMod, " ")[1]
102-
break
118+
if isOtelComponent(component) {
119+
componentVersion := strings.Split(component.GoMod, " ")[1]
120+
if isOtelCoreComponent(component.GoMod) {
121+
if isStableVersion(componentVersion) {
122+
versions.StableCoreVersion = componentVersion
123+
} else {
124+
versions.BetaCoreVersion = componentVersion
125+
}
126+
}
127+
128+
if isOtelContribComponent(component.GoMod) && !isStableVersion(componentVersion) {
129+
versions.BetaContribVersion = componentVersion
130+
}
131+
132+
if versions.StableCoreVersion != "" && versions.BetaCoreVersion != "" && versions.BetaContribVersion != "" {
133+
break
134+
}
103135
}
104136
}
105137

106-
if c.OtelColVersion == "" {
107-
return fmt.Errorf("failed to set OpenTelemetry Collector version")
138+
if versions.BetaCoreVersion == "" {
139+
return fmt.Errorf("missing beta core version")
108140
}
141+
142+
c.Versions = versions
109143
return nil
110144
}
111145

cmd/nrdot-collector-builder/internal/manifest/config_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,38 @@ func TestConfig_IsOtelContribComponent(t *testing.T) {
8585
assert.True(t, isOtelContribComponent("github.com/open-telemetry/opentelemetry-collector-contrib/component"))
8686
assert.False(t, isOtelContribComponent("github.com/some/other/module"))
8787
}
88+
89+
func TestConfig_SetVersions(t *testing.T) {
90+
cfg := &Config{
91+
Extensions: []Module{
92+
{GoMod: "github.com/open-telemetry/opentelemetry-collector-contrib/component v0.1.0"},
93+
},
94+
Receivers: []Module{
95+
{GoMod: "go.opentelemetry.io/collector v1.0.0"},
96+
{GoMod: "go.opentelemetry.io/collector/component v0.1.0"},
97+
},
98+
}
99+
100+
err := cfg.SetVersions()
101+
assert.NoError(t, err)
102+
103+
assert.Equal(t, "v1.0.0", cfg.Versions.StableCoreVersion)
104+
assert.Equal(t, "v0.1.0", cfg.Versions.BetaCoreVersion)
105+
assert.Equal(t, "v0.1.0", cfg.Versions.BetaContribVersion)
106+
}
107+
108+
func TestConfig_SetVersions_MissingCore(t *testing.T) {
109+
cfg := &Config{
110+
Extensions: []Module{
111+
{GoMod: "github.com/open-telemetry/opentelemetry-collector-contrib/component v0.1.0"},
112+
},
113+
Receivers: []Module{
114+
{GoMod: "go.opentelemetry.io/collector v1.0.0"},
115+
},
116+
}
117+
118+
err := cfg.SetVersions()
119+
assert.Error(t, err)
120+
assert.Contains(t, err.Error(), "missing beta core version")
121+
122+
}

cmd/nrdot-collector-builder/internal/manifest/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ func CopyAndUpdateConfigModules(cfg *Config, updates map[string][]string) (*Conf
156156
cfgCopy.ConfmapProviders = update(cfg.ConfmapProviders)
157157
cfgCopy.ConfmapConverters = update(cfg.ConfmapConverters)
158158

159-
cfgCopy.SetOtelColVersion()
159+
cfgCopy.SetVersions()
160160

161161
return &cfgCopy, nil
162162
}

scripts/bump-component-versions.sh

Lines changed: 32 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,28 @@
11
#!/bin/bash
22
set -e
33

4+
GO=''
5+
6+
while getopts d:g: flag
7+
do
8+
case "${flag}" in
9+
g) GO=${OPTARG};;
10+
*) exit 1;;
11+
esac
12+
done
413

5-
# Function to validate semantic version and strip leading 'v'
6-
validate_and_strip_version() {
7-
local var_name=$1
8-
local version=${!var_name}
9-
# Strip leading 'v' if present
10-
version=${version#v}
11-
if [[ ! $version =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
12-
echo "Invalid version: $version. Must be a semantic version (e.g., 1.2.3)."
13-
exit 1
14-
fi
15-
eval "$var_name='$version'"
16-
}
17-
18-
19-
# Get the most recent release tag from the open-telemetry/opentelemetry-collector-contrib repo
20-
get_latest_otel_release_tag() {
21-
local repo="open-telemetry/opentelemetry-collector-releases"
22-
local latest_tag=$(curl --silent "https://api.github.com/repos/$repo/releases/latest" | jq -r .tag_name)
23-
if [[ -z $latest_tag ]]; then
24-
echo "Failed to fetch the latest release tag from $repo."
25-
exit 1
26-
fi
27-
28-
validate_and_strip_version latest_tag
29-
echo "$latest_tag"
30-
}
31-
32-
33-
otel_version=$(get_latest_otel_release_tag)
34-
manifest_url="https://raw.githubusercontent.com/open-telemetry/opentelemetry-collector-releases/refs/tags/v${otel_version}/distributions/otelcol/manifest.yaml"
35-
manifest_content=$(curl --silent "$manifest_url")
36-
37-
# Extract the distribution version from the manifest content
38-
next_beta_core=$(echo "$manifest_content" | awk '/^.*go\.opentelemetry\.io\/collector\/.* v0/ {print $4; exit}')
39-
next_beta_contrib=$(echo "$manifest_content" | awk '/^.*github\.com\/open-telemetry\/opentelemetry-collector-contrib\/.* v0/ {print $4; exit}')
40-
next_stable=$(echo "$manifest_content" | awk '/^.*go\.opentelemetry\.io\/collector\/.* v1/ {print $4; exit}')
41-
42-
validate_and_strip_version next_beta_core
43-
validate_and_strip_version next_beta_contrib
44-
validate_and_strip_version next_stable
45-
46-
echo "Next beta core version: $next_beta_core"
47-
echo "Next beta contrib version: $next_beta_contrib"
48-
echo "Next stable version: $next_stable"
49-
50-
# Get the current versions from the manifest.yaml files
51-
current_beta_core=$(awk '/^.*go\.opentelemetry\.io\/collector\/.* v0/ {print $4; exit}' distributions/nrdot-collector-host/manifest.yaml)
52-
current_beta_contrib=$(awk '/^.*github\.com\/open-telemetry\/opentelemetry-collector-contrib\/.* v0/ {print $4; exit}' distributions/nrdot-collector-host/manifest.yaml)
53-
current_stable=$(awk '/^.*go\.opentelemetry\.io\/collector\/.* v1/ {print $4; exit}' distributions/nrdot-collector-host/manifest.yaml)
14+
[[ -n "$GO" ]] || GO='go'
5415

55-
validate_and_strip_version current_beta_core
56-
validate_and_strip_version current_beta_contrib
57-
validate_and_strip_version current_stable
16+
# Store the current directory
17+
ORIGINAL_DIR=$(pwd)
5818

59-
echo "Current beta core version: $current_beta_core"
60-
echo "Current beta contrib version: $current_beta_contrib"
61-
echo "Current stable version: $current_stable"
19+
# Change to the CLI tool directory
20+
cd "$(dirname "$0")/../cmd/nrdot-collector-builder" || exit 1
6221

22+
OUTPUT=$(${GO} run main.go manifest update --json --config "../../distributions/*/manifest.yaml")
6323

64-
# add escape characters to the current versions to work with sed
65-
escaped_current_beta_core=${current_beta_core//./\\.}
66-
escaped_current_beta_contrib=${current_beta_contrib//./\\.}
67-
escaped_current_stable=${current_stable//./\\.}
24+
# Return to the original directory
25+
cd "$ORIGINAL_DIR" || exit 1
6826

6927
# Determine the OS and set the sed -i command accordingly
7028
if [[ "$OSTYPE" == "darwin"* ]]; then
@@ -78,19 +36,18 @@ else
7836
}
7937
fi
8038

81-
# Update versions in each manifest file
82-
echo "Updating core beta version from $current_beta_core to $next_beta_core,"
83-
echo "core stable version from $current_stable to $next_stable,"
84-
echo "contrib beta version from $current_beta_contrib to $next_beta_contrib,"
85-
for file in ./distributions/*/manifest.yaml; do
86-
if [ -f "$file" ]; then
87-
sed_inplace "s/\(^.*go\.opentelemetry\.io\/collector\/.*\) v$escaped_current_beta_core/\1 v$next_beta_core/" "$file"
88-
sed_inplace "s/\(^.*github\.com\/open-telemetry\/opentelemetry-collector-contrib\/.*\) v$escaped_current_beta_contrib/\1 v$next_beta_contrib/" "$file"
89-
sed_inplace "s/\(^.*go\.opentelemetry\.io\/collector\/.*\) v$escaped_current_stable/\1 v$next_stable/" "$file"
90-
else
91-
echo "File $file does not exist"
92-
fi
93-
done
94-
95-
# Update Makefile OCB version
96-
sed_inplace "s/OTELCOL_BUILDER_VERSION ?= $escaped_current_beta_core/OTELCOL_BUILDER_VERSION ?= $next_beta_core/" Makefile
39+
# Extract the current beta core version
40+
current_beta_core=$(echo "$OUTPUT" | jq -r '.currentVersions.betaCoreVersion')
41+
current_beta_core=${current_beta_core#v}
42+
escaped_current_beta_core=${current_beta_core//./\\.}
43+
next_beta_core=$(echo "$OUTPUT" | jq -r '.nextVersions.betaCoreVersion')
44+
next_beta_core=${next_beta_core#v}
45+
46+
# If the current beta core version is not equal to the next beta core version, update the Makefile
47+
if [[ "$current_beta_core" != "$next_beta_core" ]]; then
48+
echo "Updating Makefile from $current_beta_core to $next_beta_core"
49+
# Update Makefile OCB version
50+
sed_inplace "s/OTELCOL_BUILDER_VERSION ?= $escaped_current_beta_core/OTELCOL_BUILDER_VERSION ?= $next_beta_core/" Makefile
51+
else
52+
echo "No update needed for the Makefile."
53+
fi

0 commit comments

Comments
 (0)