我有个Golang AWS Lambda项目.我使用Terraform脚本将其部署在GitHub Actinos上. 我有这样的情况: 内部版本#1

-rwxr-xr-x  1 runner docker 14717304 Jan  1  2022 aTest
-rw-r--r--  1 runner docker  7776780 Jan  1  2022 aTest.zip

我在一些文件中做了一处更改,这些文件甚至没有导入到任何其他文件中 内部版本#2

-rwxr-xr-x  1 runner docker 14717304 Jan  1  2022 aTest
-rw-r--r--  1 runner docker  7776755 Jan  1  2022 aTest.zip

拉链大小改变,但二进制不变

以下是我的Makefile的重要部分

build: ## Build Linux binary with path consistent with passed functionction layere (layer) and functionction name (function)
build: resolve-env
    @$(BUILD_FLAGS) ${GOCMD} build ${LDFLAGS} -o ${BINARY_PATH} ${GO_PKG}
    @touch -t 202201010000.00 ${BINARY_PATH}

.PHONY: package
package: build
    @cd ${DST} && ${ZIPCMD} -X -q --latest-time ${ABS_ZIP_PATH} ${function}
    @touch -t 202201010000.00 ${ABS_ZIP_PATH}

当我在本地执行相同的更改,并使用名为"act"的terraform或工具运行构建时,没有这样的更改.仅限于GitHub操作. 我需要保持相同的大小,这会影响sha256sum(以避免部署每个lambda). 可能的原因是什么?

推荐答案

这个答案主要关注GO二进制文件的可重复构建.

虽然它显示GO二进制文件具有相同的大小,但我怀疑其内容是否不同.请先判断二进制文件的散列以确认这一点.

要获得可复制的构建,除了其他明显的要求外,您还需要:

  1. 确保CGO构建是可重现的(工具链、依赖关系等),或禁用CGO.您已经设置了CGO_ENABLED=0(此信息由另一个已删除的问题提供).
  2. 使用-trimpath标志.也许GitHub操作将始终将源代码放在同一目录中.为安全起见,让我们指定此选项.
  3. 设定-buildvcs=false美元.默认情况下("自动"),版本控制信息被标记到二进制文件中(如果可用).这就解释了为什么自述文件中只有不同的两个提交会产生不同的二进制文件.

参考资料:

Go相关问答推荐

Golang regexpp:获取带有右括号的单词

如何在定制普罗米修斯出口商中测试动态计量注册?

如何存储来自异步Goroutine的返回值列表?

如何将GoFr筛选器用于查询参数?

如何在gofiber/websocket/v2中设置状态代码和原因

";无效的复制因子;融合Kafka Go客户端

在多个 struct 体中重用 Go 中的函数

Golang校验器包:重命名字段错误处理

Go 中的 Azure JWT 验证不起作用

当填充通道的函数调用未嵌入 goroutine 时,为什么我会遇到死锁?

Golang crypto/rand 线程安全吗?

如何在 Go 中编写示例测试?

使用 Grafana alert 在几分钟内重复alert

从Go中的随机日期开始以天为单位获取时间

Go 泛型:自引用接口约束

将 []float64 像素切片转换为图像

Ginkgo/Gomega panic 测试失败

出于某种原因,Golang (Go) AES CBC 密文被填充了 16 个 0x00 字节

使用 bolthold 3 条件进行 boltDB 查询

Golang 与 Cassandra db 使用 docker-compose:cannot connect (gocql)