Skip to content

Minified code is not always deterministic #680

Closed
@nmiyake

Description

@nmiyake

Create the following Dockerfile:

FROM golang:1.8.3-jessie
RUN go get github.com/gopherjs/gopherjs
RUN mkdir -p /go/src/github.com/nmiyake/test-gen

RUN echo 'package main; import "reflect"; import "github.com/gopherjs/gopherjs/js"; func main() { js.Global.Set("tester", map[string]interface{}{"Tester": tester})}; func tester(input string) string { reflect.DeepEqual(nil, nil); return input; }' > /go/src/github.com/nmiyake/test-gen/main.go
CMD gopherjs build /go/src/github.com/nmiyake/test-gen/main.go -m -o /go/src/github.com/nmiyake/test-gen/go.js && shasum -a 256 /go/src/github.com/nmiyake/test-gen/go.js

This Dockerfile simply creates a main.go with the content:

package main

import (
  "reflect"

  "github.com/gopherjs/gopherjs/js"
)

func main() {
  js.Global.Set("tester", map[string]interface{}{
    "Tester": tester,
  })
}

func tester(input string) string {
  reflect.DeepEqual(nil, nil)
  return input
}

And runs gopherjs to created minified output.

Run docker build . to build the image and get the tag. Then, perform a docker run on the tag multiple times. Observe that the SHA-256 for the generated Javascript varies between 2-3 different values:

➜  test-gen git:(master) ✗ docker build .
Sending build context to Docker daemon  2.334MB
Step 1/5 : FROM golang:1.8.3-jessie
 ---> 6ce094895555
Step 2/5 : RUN go get github.com/gopherjs/gopherjs
 ---> Using cache
 ---> 6121ddb6b270
Step 3/5 : RUN mkdir -p /go/src/github.com/nmiyake/test-gen
 ---> Running in 1f68a04174e7
 ---> 66ffb7a46058
Removing intermediate container 1f68a04174e7
Step 4/5 : RUN echo 'package main; import "reflect"; import "github.com/gopherjs/gopherjs/js"; func main() { js.Global.Set("tester", map[string]interface{}{"Tester": tester})}; func tester(input string) string { reflect.DeepEqual(nil, nil); return input; }' > /go/src/github.com/nmiyake/test-gen/main.go
 ---> Running in 0c5ce4c8190f
 ---> 28a14a14a9a7
Removing intermediate container 0c5ce4c8190f
Step 5/5 : CMD gopherjs build /go/src/github.com/nmiyake/test-gen/main.go -m -o /go/src/github.com/nmiyake/test-gen/go.js && shasum -a 256 /go/src/github.com/nmiyake/test-gen/go.js
 ---> Running in 9821e908d992
 ---> ae0c83e503e7
Removing intermediate container 9821e908d992
Successfully built ae0c83e503e7
➜  test-gen git:(master) ✗ docker run ae0c83e503e7
9114154ee82cd9669adbde686cdf5e3069b318b1796283ddee0d682f58c10823  /go/src/github.com/nmiyake/test-gen/go.js
➜  test-gen git:(master) ✗ docker run ae0c83e503e7
fd206b8212d419b1be819227eedb5608a2cf531bddfbfc9e8c20276195080bd3  /go/src/github.com/nmiyake/test-gen/go.js
➜  test-gen git:(master) ✗ docker run ae0c83e503e7
9114154ee82cd9669adbde686cdf5e3069b318b1796283ddee0d682f58c10823  /go/src/github.com/nmiyake/test-gen/go.js
➜  test-gen git:(master) ✗ docker run ae0c83e503e7
9114154ee82cd9669adbde686cdf5e3069b318b1796283ddee0d682f58c10823  /go/src/github.com/nmiyake/test-gen/go.js
➜  test-gen git:(master) ✗ docker run ae0c83e503e7
9114154ee82cd9669adbde686cdf5e3069b318b1796283ddee0d682f58c10823  /go/src/github.com/nmiyake/test-gen/go.js
➜  test-gen git:(master) ✗ docker run ae0c83e503e7
9114154ee82cd9669adbde686cdf5e3069b318b1796283ddee0d682f58c10823  /go/src/github.com/nmiyake/test-gen/go.js
➜  test-gen git:(master) ✗ docker run ae0c83e503e7
9114154ee82cd9669adbde686cdf5e3069b318b1796283ddee0d682f58c10823  /go/src/github.com/nmiyake/test-gen/go.js
➜  test-gen git:(master) ✗ docker run ae0c83e503e7
fd206b8212d419b1be819227eedb5608a2cf531bddfbfc9e8c20276195080bd3  /go/src/github.com/nmiyake/test-gen/go.js
➜  test-gen git:(master) ✗ docker run ae0c83e503e7
9114154ee82cd9669adbde686cdf5e3069b318b1796283ddee0d682f58c10823  /go/src/github.com/nmiyake/test-gen/go.js
➜  test-gen git:(master) ✗ docker run ae0c83e503e7
9114154ee82cd9669adbde686cdf5e3069b318b1796283ddee0d682f58c10823  /go/src/github.com/nmiyake/test-gen/go.js
➜  test-gen git:(master) ✗ docker run ae0c83e503e7
46d5461347510fd0421f11647c6d7f5b7652bd4197eca7dd964af93d9429eafa  /go/src/github.com/nmiyake/test-gen/go.js
➜  test-gen git:(master) ✗ docker run ae0c83e503e7
fd206b8212d419b1be819227eedb5608a2cf531bddfbfc9e8c20276195080bd3  /go/src/github.com/nmiyake/test-gen/go.js
➜  test-gen git:(master) ✗ docker run ae0c83e503e7
fd206b8212d419b1be819227eedb5608a2cf531bddfbfc9e8c20276195080bd3  /go/src/github.com/nmiyake/test-gen/go.js

Interestingly, if I run the same command within the same docker run -it session (or locally), I cannot get the value to change.

However, this is still frustrating because, as of yet, I have been unable to create a workflow where the minified content for a given Go file can be reliably reproduced across different platforms (whether it be by running in a Docker container or by setting GOOS manually)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions