Skip to content

Commit 81daf9f

Browse files
committed
Automate Updates Script
1 parent 2336893 commit 81daf9f

8 files changed

Lines changed: 371 additions & 21 deletions

File tree

10.5 MB
Binary file not shown.
Lines changed: 333 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,333 @@
1+
package main
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"io"
7+
"net/http"
8+
"os"
9+
"strings"
10+
"log"
11+
"context"
12+
"github.com/urfave/cli/v3"
13+
)
14+
15+
type Info struct {
16+
Repo string `json:"repo"`
17+
Tag string `json:"tag"`
18+
Commit string `json:"commit"`
19+
}
20+
21+
type Dependencies struct {
22+
Op_Node Info `json:"op_node"`
23+
Op_Geth Info `json:"op_geth"`
24+
Op_Reth Info `json:"op_reth"`
25+
Nethermind Info `json:"nethermind"`
26+
Base_Reth_Node Info `json:"base_reth_node"`
27+
}
28+
29+
type VersionTag []struct {
30+
Tag string `json:"tag_name"`
31+
}
32+
33+
type Commit struct {
34+
Commit string `json:"sha"`
35+
}
36+
37+
func main() {
38+
cmd := &cli.Command {
39+
Name: "updater",
40+
Usage: "Updates the dependencies in the geth, nethermind and reth Dockerfiles",
41+
Action: func(context.Context, *cli.Command) error {
42+
err := updater()
43+
if err != nil {
44+
return fmt.Errorf("error running updater: %s", err)
45+
}
46+
return nil
47+
},
48+
}
49+
50+
if err := cmd.Run(context.Background(), os.Args); err != nil {
51+
log.Fatal(err)
52+
}
53+
}
54+
55+
func updater() error {
56+
var err error
57+
58+
f, err := os.ReadFile("../versions.json")
59+
if err != nil {
60+
return fmt.Errorf("error reading versions JSON: %s", err)
61+
}
62+
63+
var dependencies Dependencies
64+
65+
err = json.Unmarshal(f, &dependencies)
66+
if err != nil {
67+
return fmt.Errorf("error unmarshaling versions JSON to dependencies: %s", err)
68+
}
69+
70+
token := os.Getenv("GITHUB_TOKEN")
71+
72+
// updating op reth version
73+
err = get_and_update_version_commit(
74+
"https://api.github.com/repos/paradigmxyz/reth/commits/"+dependencies.Op_Reth.Tag,
75+
"https://api.github.com/repos/paradigmxyz/reth/releases",
76+
"op_reth",
77+
token,
78+
&dependencies,
79+
)
80+
if err != nil {
81+
return fmt.Errorf("error getting and updating version/commit for reth: %s", err)
82+
}
83+
84+
// updating op geth version
85+
err = get_and_update_version_commit(
86+
"https://api.github.com/repos/ethereum-optimism/op-geth/commits/"+dependencies.Op_Geth.Tag,
87+
"https://api.github.com/repos/ethereum-optimism/op-geth/releases",
88+
"op_geth",
89+
token,
90+
&dependencies,
91+
)
92+
if err != nil {
93+
return fmt.Errorf("error getting and updating version/commit for op geth: %s", err)
94+
}
95+
96+
// updating op node version
97+
err = get_and_update_version_commit(
98+
"https://api.github.com/repos/ethereum-optimism/optimism/commits/"+dependencies.Op_Node.Tag,
99+
"https://api.github.com/repos/ethereum-optimism/optimism/releases",
100+
"op_node",
101+
token,
102+
&dependencies,
103+
)
104+
if err != nil {
105+
return fmt.Errorf("error getting and updating version/commit for op node: %s", err)
106+
}
107+
// updating nethermind version
108+
err = get_and_update_version_commit(
109+
"https://api.github.com/repos/NethermindEth/nethermind/commits/"+dependencies.Nethermind.Tag,
110+
"https://api.github.com/repos/NethermindEth/nethermind/releases",
111+
"nethermind",
112+
token,
113+
&dependencies,
114+
)
115+
if err != nil {
116+
return fmt.Errorf("error getting and updating version/commit for nethermind: %s", err)
117+
}
118+
119+
// updating base reth node version
120+
err = get_and_update_version_commit(
121+
"https://api.github.com/repos/base/node-reth/commits/"+dependencies.Base_Reth_Node.Tag,
122+
"https://api.github.com/repos/base/node-reth/releases",
123+
"base_reth_node",
124+
token,
125+
&dependencies,
126+
)
127+
if err != nil {
128+
return fmt.Errorf("error getting and updating version/commit for base reth node: %s", err)
129+
}
130+
131+
e := create_versions_env(dependencies)
132+
if e != nil {
133+
return fmt.Errorf("error creating versions.env: %s", e)
134+
}
135+
136+
return nil
137+
}
138+
139+
func get_and_update_version_commit(
140+
commitUrl string,
141+
versionUrl string,
142+
dependency_type,
143+
token string,
144+
dependencies *Dependencies) error {
145+
tag, err := get_version_tag(versionUrl, token)
146+
if err != nil {
147+
return fmt.Errorf("error getting "+dependency_type, " version tag: %s", err)
148+
}
149+
150+
commit, err := get_commit(commitUrl, token)
151+
if err != nil {
152+
return fmt.Errorf("error getting "+dependency_type, " commit: %s", err)
153+
}
154+
155+
e := update_version_tag_and_commit(commit, tag, dependency_type, dependencies)
156+
if e != nil {
157+
return fmt.Errorf("error updating version tag and commit: %s", e)
158+
}
159+
160+
return nil
161+
}
162+
163+
func get_version_tag(url string, token string) (string, error) {
164+
req, err := http.NewRequest("GET", url, nil)
165+
if err != nil {
166+
return "", fmt.Errorf("error creating new GET request (version tag): %s", err)
167+
}
168+
169+
req.Header.Set("Accept", "application/vnd.github+json")
170+
req.Header.Set("Authorization", "Bearer "+token)
171+
req.Header.Set("X-GitHub-Api-Version", "2022-11-28")
172+
173+
jsonBody, err := get_json_body(req)
174+
if err != nil {
175+
return "", fmt.Errorf("error getting json body: %s", err)
176+
}
177+
178+
var versionTag VersionTag
179+
180+
e := json.Unmarshal(jsonBody, &versionTag)
181+
if e != nil {
182+
return "", fmt.Errorf("error unmarshaling: %s", e)
183+
}
184+
185+
// loop to return most recent version of op-node
186+
if url == "https://api.github.com/repos/ethereum-optimism/optimism/releases" {
187+
incrementor := 0
188+
for !(strings.HasPrefix(versionTag[incrementor].Tag, "op-node")) {
189+
incrementor += 1
190+
}
191+
return versionTag[incrementor].Tag, nil
192+
}
193+
194+
return versionTag[0].Tag, nil
195+
}
196+
197+
func get_commit(url string, token string) (string, error) {
198+
req, err := http.NewRequest("GET", url, nil)
199+
if err != nil {
200+
return "", fmt.Errorf("error creating new GET request (commit): %s", err)
201+
}
202+
203+
req.Header.Set("Accept", "application/vnd.github+json")
204+
req.Header.Set("Authorization", "Bearer "+token)
205+
req.Header.Set("X-GitHub-Api-Version", "2022-11-28")
206+
207+
jsonBody, err := get_json_body(req)
208+
if err != nil {
209+
return "", fmt.Errorf("error getting json body: %s", err)
210+
}
211+
212+
var commit Commit
213+
214+
e := json.Unmarshal(jsonBody, &commit)
215+
if e != nil {
216+
fmt.Println("Error unmarshaling")
217+
return "", fmt.Errorf("error unmarshaling: %s", e)
218+
}
219+
220+
return string(commit.Commit), nil
221+
}
222+
223+
func get_json_body(req *http.Request) ([]byte, error) {
224+
client := &http.Client{}
225+
226+
resp, err := client.Do(req)
227+
if err != nil {
228+
return nil, fmt.Errorf("error making GET request to client: %s", err)
229+
}
230+
defer resp.Body.Close()
231+
232+
if resp.StatusCode != http.StatusOK {
233+
return nil, fmt.Errorf("received http status code when getting json body: %s", resp.Status)
234+
}
235+
236+
jsonBody, err := io.ReadAll(resp.Body)
237+
if err != nil {
238+
return nil, fmt.Errorf("error reading json body: %s", err)
239+
}
240+
241+
return jsonBody, nil
242+
}
243+
244+
func update_version_tag_and_commit(
245+
commit string,
246+
tag string,
247+
dependency_type string,
248+
dependencies *Dependencies) error {
249+
if dependency_type == "op_reth" {
250+
dependencies.Op_Reth.Tag = tag
251+
dependencies.Op_Reth.Commit = commit
252+
err := write_to_versions_env(*dependencies)
253+
if err != nil {
254+
return fmt.Errorf("error writing to versions (op reth): %s", err)
255+
}
256+
} else if dependency_type == "op_node" {
257+
dependencies.Op_Node.Tag = tag
258+
dependencies.Op_Node.Commit = commit
259+
err := write_to_versions_env(*dependencies)
260+
if err != nil {
261+
return fmt.Errorf("error writing to versions (op node): %s", err)
262+
}
263+
} else if dependency_type == "op_geth" {
264+
dependencies.Op_Geth.Tag = tag
265+
dependencies.Op_Geth.Commit = commit
266+
err := write_to_versions_env(*dependencies)
267+
if err != nil {
268+
return fmt.Errorf("error writing to versions (op geth): %s", err)
269+
}
270+
} else if dependency_type == "nethermind" {
271+
dependencies.Nethermind.Tag = tag
272+
dependencies.Nethermind.Commit = commit
273+
err := write_to_versions_env(*dependencies)
274+
if err != nil {
275+
return fmt.Errorf("error writing to versions (nethermind): %s", err)
276+
}
277+
} else if dependency_type == "base_reth_node" {
278+
dependencies.Base_Reth_Node.Tag = tag
279+
dependencies.Base_Reth_Node.Commit = commit
280+
err := write_to_versions_env(*dependencies)
281+
if err != nil {
282+
return fmt.Errorf("error writing to versions (base reth node): %s", err)
283+
}
284+
}
285+
286+
return nil
287+
}
288+
289+
func write_to_versions_env(dependencies Dependencies) error {
290+
// formatting json
291+
updatedJson, err := json.MarshalIndent(dependencies, "", " ")
292+
if err != nil {
293+
return fmt.Errorf("error Marshaling dependencies json: %s", err)
294+
}
295+
296+
e := os.WriteFile("../versions.json", updatedJson, 0644)
297+
if e != nil {
298+
return fmt.Errorf("error writing to versions.json: %s", e)
299+
}
300+
301+
return nil
302+
}
303+
304+
func create_versions_env(dependencies Dependencies) error {
305+
env := "export OP_NODE_TAG=" + dependencies.Op_Node.Tag + "\n" +
306+
"export OP_NODE_COMMIT=" + dependencies.Op_Node.Commit + "\n" +
307+
"export OP_NODE_REPO=https://github.com/ethereum-optimism/optimism.git" + "\n\n" +
308+
"export OP_GETH_TAG=" + dependencies.Op_Geth.Tag + "\n" +
309+
"export OP_GETH_COMMIT=" + dependencies.Op_Geth.Commit + "\n" +
310+
"export OP_GETH_REPO=https://github.com/ethereum-optimism/op-geth.git" + "\n\n" +
311+
"export OP_RETH_TAG=" + dependencies.Op_Reth.Tag + "\n" +
312+
"export OP_RETH_COMMIT=" + dependencies.Op_Reth.Commit + "\n" +
313+
"export OP_RETH_REPO=https://github.com/paradigmxyz/reth.git" + "\n\n" +
314+
"export NETHERMIND_TAG=" + dependencies.Nethermind.Tag + "\n" +
315+
"export NETHERMIND_COMMIT=" + dependencies.Nethermind.Commit + "\n" +
316+
"export NETHERMIND_REPO=https://github.com/NethermindEth/nethermind.git" + "\n\n" +
317+
"export BASE_RETH_NODE_TAG=" + dependencies.Base_Reth_Node.Tag + "\n" +
318+
"export BASE_RETH_NODE_COMMIT=" + dependencies.Base_Reth_Node.Commit + "\n" +
319+
"export BASE_RETH_NODE_REPO=https://github.com/base/node-reth.git " + "\n\n"
320+
321+
file, err := os.Create("../versions.env")
322+
if err != nil {
323+
return fmt.Errorf("error creating versions.env file: %s", err)
324+
}
325+
defer file.Close()
326+
327+
_, err = file.WriteString(env)
328+
if err != nil {
329+
return fmt.Errorf("error writing to versions.env file: %s", err)
330+
}
331+
332+
return nil
333+
}

dependency_updater/go.mod

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
module dependency_updater
2+
3+
go 1.24.3
4+
5+
require github.com/urfave/cli/v3 v3.3.8 // indirect

dependency_updater/go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
github.com/urfave/cli/v3 v3.3.8 h1:BzolUExliMdet9NlJ/u4m5vHSotJ3PzEqSAZ1oPMa/E=
2+
github.com/urfave/cli/v3 v3.3.8/go.mod h1:FJSKtM/9AiiTOJL4fJ6TbMUkxBXn7GO9guZqoZtpYpo=

geth/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ RUN . /tmp/versions.env && git clone $OP_NODE_REPO --branch $OP_NODE_TAG --singl
1313
RUN . /tmp/versions.env && cd op-node && \
1414
make VERSION=$OP_NODE_TAG op-node
1515

16-
FROM golang:1.22 AS geth
16+
FROM golang:1.23 AS geth
1717

1818
WORKDIR /app
1919

go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module dependency_updater
2+
3+
go 1.24.3

versions.env

Lines changed: 0 additions & 20 deletions
This file was deleted.

0 commit comments

Comments
 (0)