Tiltfile 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. # This Tiltfile contains the deployment and build config for the Wormhole devnet.
  2. #
  3. # We use Buildkit cache mounts and careful layering to avoid unnecessary rebuilds - almost
  4. # all source code changes result in small, incremental rebuilds. Dockerfiles are written such
  5. # that, for example, changing the contract source code won't cause Solana itself to be rebuilt.
  6. #
  7. # Graph of dependencies between Dockerfiles, image refs and k8s StatefulSets:
  8. #
  9. # Dockerfile Image ref StatefulSet
  10. # +------------------------------------------------------------------------------+
  11. # rust+1.*
  12. # + +-----------------+
  13. # +-> Dockerfile.agent +-> solana-agent +--------+-----> | [agent] |
  14. # | | +--> | guardian-N |
  15. # +-> solana/Dockerfile +-> solana-contract +---+ | | +-- --------------+
  16. # | | | |
  17. # +-> third_party/solana/Dockerfile <--------------+ | |
  18. # + | | +-----------------+
  19. # +--> solana-devnet +-------|-----> | solana-devnet |
  20. # golang:1.* +-----> | [setup] |
  21. # + | +-----------------+
  22. # +-> bridge/Dockerfile +-> guardiand-image +---------+
  23. #
  24. #
  25. # node:lts-alpine
  26. # + +-----------------+
  27. # +-> ethereum/Dockerfile +-> eth+node +------------------> | eth|devnet |
  28. # +-----------------+
  29. #
  30. config.define_string("num", False, "Number of guardian nodes to run")
  31. cfg = config.parse()
  32. num_guardians = int(cfg.get("num", "5"))
  33. # protos
  34. local_resource(
  35. name = "proto-gen",
  36. deps = ["./proto", "./generate-protos.sh"],
  37. cmd = "./generate-protos.sh",
  38. )
  39. # bridge
  40. docker_build(
  41. ref = "guardiand-image",
  42. context = "bridge",
  43. dockerfile = "bridge/Dockerfile",
  44. )
  45. def build_bridge_yaml():
  46. bridge_yaml = read_yaml_stream("devnet/bridge.yaml")
  47. for obj in bridge_yaml:
  48. if obj["kind"] == "StatefulSet" and obj["metadata"]["name"] == "guardian":
  49. obj["spec"]["replicas"] = num_guardians
  50. container = obj["spec"]["template"]["spec"]["containers"][0]
  51. if container["name"] != "guardiand":
  52. fail("container 0 is not guardiand")
  53. container["command"] += ["--devNumGuardians", str(num_guardians)]
  54. return encode_yaml_stream(bridge_yaml)
  55. k8s_yaml(build_bridge_yaml())
  56. k8s_resource("guardian", resource_deps=["proto-gen"], port_forwards=[
  57. port_forward(6060, name="Debug Server [:6060]"),
  58. ])
  59. # solana agent and cli (runs alongside bridge)
  60. docker_build(
  61. ref="solana-agent",
  62. context=".",
  63. only=["./proto", "./solana"],
  64. dockerfile="Dockerfile.agent",
  65. # Ignore target folders from local (non-container) development.
  66. ignore = ["./solana/target", "./solana/agent/target", "./solana/cli/target"],
  67. )
  68. # solana smart contract
  69. docker_build(
  70. ref = "solana-contract",
  71. context = "solana",
  72. dockerfile = "solana/Dockerfile",
  73. )
  74. # solana local devnet
  75. docker_build(
  76. ref = "solana-devnet",
  77. context = "third_party/solana",
  78. dockerfile = "third_party/solana/Dockerfile",
  79. )
  80. k8s_yaml("devnet/solana-devnet.yaml")
  81. k8s_resource("solana-devnet", port_forwards=[
  82. port_forward(8899, name="Solana RPC [:8899]"),
  83. port_forward(8900, name="Solana WS [:8900]"),
  84. port_forward(9000, name="Solana PubSub [:9000]"),
  85. ])
  86. # eth devnet
  87. docker_build(
  88. ref = "eth-node",
  89. context = "./ethereum",
  90. dockerfile = "./ethereum/Dockerfile",
  91. # ignore local node_modules (in case they're present)
  92. ignore = ["./ethereum/node_modules"],
  93. # sync external scripts for incremental development
  94. # (everything else needs to be restarted from scratch for determinism)
  95. #
  96. # This relies on --update-mode=exec to work properly with a non-root user.
  97. # https://github.com/tilt-dev/tilt/issues/3708
  98. live_update = [
  99. sync("./ethereum/src", "/home/node/app/src"),
  100. ],
  101. )
  102. k8s_yaml("devnet/eth-devnet.yaml")
  103. k8s_resource("eth-devnet", port_forwards=[
  104. port_forward(8545, name="Ganache RPC [:8545]")
  105. ])
  106. # web frontend
  107. docker_build(
  108. ref = "web",
  109. context = "./web",
  110. dockerfile = "./web/Dockerfile",
  111. ignore = ["./web/node_modules"],
  112. live_update = [
  113. sync("./web/src", "/home/node/app/src"),
  114. sync("./web/public", "/home/node/app/public"),
  115. sync("./web/contracts", "/home/node/app/contracts"),
  116. ],
  117. )
  118. k8s_yaml("devnet/web.yaml")
  119. k8s_resource("web", port_forwards=[
  120. port_forward(3000, name="Experimental Web UI [:3000]")
  121. ])
  122. # terra devnet
  123. docker_build(
  124. ref = "terra-image",
  125. context = "./terra/devnet",
  126. dockerfile = "terra/devnet/Dockerfile",
  127. )
  128. docker_build(
  129. ref = "terra-contracts",
  130. context = "./terra",
  131. dockerfile = "./terra/Dockerfile",
  132. )
  133. k8s_yaml("devnet/terra-devnet.yaml")
  134. k8s_resource(
  135. "terra-lcd",
  136. port_forwards=[port_forward(1317, name="Terra LCD interface [:1317]")]
  137. )
  138. k8s_resource(
  139. "terra-terrad",
  140. port_forwards=[port_forward(26657, name="Terra RPC [:26657]")]
  141. )