etcd源码构建

etcd源码构建

编译前准备

获取etcd源码

# etcd版本选择最近的一次发布版 
# @serathius serathius
# v3.5.5
# 19002cf
https://github.com/etcd-io/etcd/releases

配置go编译环境

# etcd v3.5.5 匹配的go版本为 go 1.16
3rd/
├── etcd-3.5.5.tar.gz
└── go1.16.15.linux-amd64.tar.gz

# go开发环境需要配置的环境变量
export GOROOT=/home/xxx/workspace/go
export PATH=$PATH:$GOROOT/bin

# 配置GOROOT路径,因为etcd go.mod的依赖会存放在此路径下
export GOPATH=/home/xxx/workspace/gospace

#查看go版本
xxx@U18:~/workspace$ go version
go version go1.16.15 linux/amd64

构建etcd

# 设置go代理 
go env -w GOPROXY=https://goproxy.cn,direct
export GOPROXY=https://goproxy.cn,direct

xxx@U18:~/workspace/etcd-3.5.5$ pwd
/home/zbb/workspace/etcd-3.5.5
xxx@U18:~/workspace/etcd-3.5.5$ ./build
DEPRECATED!!! Use build.sh script instead.
xxx@U18:~/workspace/etcd-3.5.5$ ./build.sh
go: downloading github.com/olekukonko/tablewriter v0.0.5
go: downloading github.com/spf13/cobra v1.1.3
go: downloading github.com/dustin/go-humanize v1.0.0
go: downloading go.etcd.io/bbolt v1.3.6
go: downloading go.uber.org/zap v1.17.0
go: downloading github.com/bgentry/speakeasy v0.1.0
go: downloading github.com/spf13/pflag v1.0.5
go: downloading golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba
go: downloading google.golang.org/grpc v1.41.0
go: downloading gopkg.in/cheggaaa/pb.v1 v1.0.28
go: downloading github.com/json-iterator/go v1.1.11
go: downloading github.com/modern-go/reflect2 v1.0.1
go: downloading github.com/grpc-ecosystem/go-grpc-middleware v1.3.0
go: downloading github.com/soheilhy/cmux v0.1.5
go: downloading golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4
go: downloading github.com/gogo/protobuf v1.3.2
go: downloading github.com/golang/protobuf v1.5.2
go: downloading google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c
go: downloading github.com/coreos/go-semver v0.3.0
go: downloading github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e
go: downloading golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1
go: downloading github.com/prometheus/client_golang v1.11.1
go: downloading github.com/jonboulle/clockwork v0.2.2
go: downloading github.com/mattn/go-runewidth v0.0.9
go: downloading github.com/coreos/go-systemd/v22 v22.3.2
go: downloading go.uber.org/atomic v1.7.0
go: downloading go.uber.org/multierr v1.6.0
go: downloading go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.25.0
go: downloading github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
go: downloading github.com/grpc-ecosystem/grpc-gateway v1.16.0
go: downloading github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802
go: downloading go.opentelemetry.io/otel v1.0.1
go: downloading go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.1
go: downloading go.opentelemetry.io/otel/sdk v1.0.1
go: downloading golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2
go: downloading gopkg.in/natefinch/lumberjack.v2 v2.0.0
go: downloading sigs.k8s.io/yaml v1.2.0
go: downloading go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.1
go: downloading github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2
go: downloading github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd
go: downloading google.golang.org/protobuf v1.27.1
go: downloading github.com/beorn7/perks v1.0.1
go: downloading github.com/cespare/xxhash v1.1.0
go: downloading github.com/prometheus/client_model v0.2.0
go: downloading github.com/prometheus/common v0.26.0
go: downloading github.com/prometheus/procfs v0.6.0
go: downloading github.com/cespare/xxhash/v2 v2.1.1
go: downloading go.opentelemetry.io/otel/trace v1.0.1
go: downloading github.com/gorilla/websocket v1.4.2
go: downloading github.com/sirupsen/logrus v1.7.0
go: downloading github.com/form3tech-oss/jwt-go v3.2.3+incompatible
go: downloading go.opentelemetry.io/proto/otlp v0.9.0
go: downloading gopkg.in/yaml.v2 v2.4.0
go: downloading github.com/google/btree v1.0.1
go: downloading github.com/matttproud/golang_protobuf_extensions v1.0.1
go: downloading github.com/cenkalti/backoff/v4 v4.1.1
go: downloading golang.org/x/text v0.3.6
% 'env' 'GO111MODULE=off' 'go' 'get' 'github.com/myitcv/gobin'
fatal: 不是一个 git 仓库(或者任何父目录):.git
% 'rm' '-f' 'bin/etcd'
% (cd server && 'env' 'CGO_ENABLED=0' 'GO_BUILD_FLAGS=' 'GOOS=' 'GOARCH=' 'go' 'build' '-installsuffix=cgo' '-ldflags=-X=go.etcd.io/etcd/api/v3/version.GitSHA=GitNotFound' '-o=../bin/etcd' '.')
stderr: go: downloading github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da
% 'rm' '-f' 'bin/etcdutl'
% (cd etcdutl && 'env' 'GO_BUILD_FLAGS=' 'CGO_ENABLED=0' 'GO_BUILD_FLAGS=' 'GOOS=' 'GOARCH=' 'go' 'build' '-installsuffix=cgo' '-ldflags=-X=go.etcd.io/etcd/api/v3/version.GitSHA=GitNotFound' '-o=../bin/etcdutl' '.')
% 'rm' '-f' 'bin/etcdctl'
% (cd etcdctl && 'env' 'GO_BUILD_FLAGS=' 'CGO_ENABLED=0' 'GO_BUILD_FLAGS=' 'GOOS=' 'GOARCH=' 'go' 'build' '-installsuffix=cgo' '-ldflags=-X=go.etcd.io/etcd/api/v3/version.GitSHA=GitNotFound' '-o=../bin/etcdctl' '.')
stderr: go: downloading github.com/urfave/cli v1.22.4
stderr: go: downloading github.com/cpuguy83/go-md2man/v2 v2.0.0
stderr: go: downloading github.com/russross/blackfriday/v2 v2.0.1
stderr: go: downloading github.com/shurcooL/sanitized_anchor_name v1.0.0
SUCCESS: etcd_build (GOARCH=)

目标文件

xxx@U18:~/workspace/etcd-3.5.5$ tree bin/
bin/
├── etcd
├── etcdctl
└── etcdutl

0 directories, 3 files

xxx@U18:~/workspace/etcd-3.5.5$ ./bin/etcd --version
etcd Version: 3.5.5
Git SHA: GitNotFound
Go Version: go1.16.15
Go OS/Arch: linux/amd64

编译etcd源码,会在etcd源码目录下生成bin目录并在该目录下生成etcd etcdctl etcdutl 3个可执行文件:

  • etcd主要是启动后台服务

  • etcdctl是一个命令行客户端,便于我们进行服务测试或手动修改数据库内容,etcdctl在两个不同版本etcd(v2和v3)下的功能和使用方式不相同, 通过如下方式指定etcd的版本:

    export ETCDCTL_API=2
    export ETCDCTL_API=3
    
  • etcdutl 是 etcd 的命令行管理实用程序。它旨在直接对 etcd 数据文件进行操作; 对于网络操作,请使用 etcdctl,用法参考

  • 官方文档

简单测试

# 启动etcd
xxx@U18:~/workspace/etcd-3.5.5/bin$ ./etcd

# 启动etcdctl
xxx@U18:~/workspace/etcd-3.5.5/bin$ ./etcdctl put foo bar
OK
xxx@U18:~/workspace/etcd-3.5.5/bin$ ./etcdctl get foo
foo
bar

备注: go1.12编译报错

go: golang.org/x/time@v0.0.0-20180412165947-fbb02b2291d2: invalid $GOPROXY setting: cannot have comma

Go 版本>=1.11 设置GOPROXY
在 Linux 或 macOS 上面,需要运行下面命令:

# 启用 Go Modules 功能
export GO111MODULE=on
# 配置 GOPROXY 环境变量
export GOPROXY=https://goproxy.io

Go 版本>=1.13 设置GOPROXY
如果你使用的 Go 版本>=1.13, 你可以通过设置 GOPRIVATE 环境变量来控制哪些私有仓库和依赖(公司内部仓库)不通过 proxy 来拉取,直接走本地,设置如下:

Go version >= 1.13 
go env -w GOPROXY=https://goproxy.io,direct
# 设置不走 proxy 的私有仓库,多个用逗号相隔
go env -w GOPRIVATE=*.corp.example.com
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Erice_s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值