docker-bake.hcl 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. variable "IMAGE_NAME" {
  2. default = "dunglas/frankenphp"
  3. }
  4. variable "VERSION" {
  5. default = "dev"
  6. }
  7. variable "GO_VERSION" {
  8. default = "1.21"
  9. }
  10. variable "SHA" {}
  11. variable "LATEST" {
  12. default = false
  13. }
  14. variable "CACHE" {
  15. default = ""
  16. }
  17. function "tag" {
  18. params = [version, os, php-version, tgt]
  19. result = [
  20. version != "" ? format("%s:%s%s-php%s-%s", IMAGE_NAME, version, tgt == "builder" ? "-builder" : "", php-version, os) : "",
  21. php-version == "8.2" && os == "bookworm" && version != "" ? format("%s:%s%s", IMAGE_NAME, version, tgt == "builder" ? "-builder" : "") : "",
  22. php-version == "8.2" && version != "" ? format("%s:%s%s-%s", IMAGE_NAME, version, tgt == "builder" ? "-builder" : "", os) : "",
  23. php-version == "8.2" && version == "latest" ? format("%s:%s%s", IMAGE_NAME, os, tgt == "builder" ? "-builder" : "") : "",
  24. os == "bookworm" && version != "" ? format("%s:%s%s-php%s", IMAGE_NAME, version, tgt == "builder" ? "-builder" : "", php-version) : "",
  25. ]
  26. }
  27. # cleanTag ensures that the tag is a valid Docker tag
  28. # see https://github.com/distribution/distribution/blob/v2.8.2/reference/regexp.go#L37
  29. function "clean_tag" {
  30. params = [tag]
  31. result = substr(regex_replace(regex_replace(tag, "[^\\w.-]", "-"), "^([^\\w])", "r$0"), 0, 127)
  32. }
  33. # semver adds semver-compliant tag if a semver version number is passed, or returns the revision itself
  34. # see https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string
  35. function "semver" {
  36. params = [rev]
  37. result = __semver(_semver(regexall("^v?(?P<major>0|[1-9]\\d*)\\.(?P<minor>0|[1-9]\\d*)\\.(?P<patch>0|[1-9]\\d*)(?:-(?P<prerelease>(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+(?P<buildmetadata>[0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", rev)))
  38. }
  39. function "_semver" {
  40. params = [matches]
  41. result = length(matches) == 0 ? {} : matches[0]
  42. }
  43. function "__semver" {
  44. params = [v]
  45. result = v == {} ? [clean_tag(VERSION)] : v.prerelease == null ? ["latest", v.major, "${v.major}.${v.minor}", "${v.major}.${v.minor}.${v.patch}"] : ["${v.major}.${v.minor}.${v.patch}-${v.prerelease}"]
  46. }
  47. target "default" {
  48. name = "${tgt}-php-${replace(php-version, ".", "-")}-${os}"
  49. matrix = {
  50. os = ["bookworm", "alpine"]
  51. php-version = ["8.2", "8.3.0RC2"]
  52. tgt = ["builder", "runner"]
  53. }
  54. contexts = {
  55. php-base = "docker-image://php:${php-version}-zts-${os}"
  56. golang-base = "docker-image://golang:${GO_VERSION}-${os}"
  57. }
  58. dockerfile = os == "alpine" ? "alpine.Dockerfile" : "Dockerfile"
  59. context = "./"
  60. target = tgt
  61. platforms = [
  62. "linux/amd64",
  63. "linux/386",
  64. "linux/arm/v6",
  65. "linux/arm/v7",
  66. "linux/arm64",
  67. ]
  68. tags = distinct(flatten([
  69. LATEST ? tag("latest", os, php-version, tgt) : [],
  70. tag(SHA == "" ? "" : "sha-${substr(SHA, 0, 7)}", os, php-version, tgt),
  71. [for v in semver(VERSION) : tag(v, os, php-version, tgt)]
  72. ]))
  73. labels = {
  74. "org.opencontainers.image.created" = "${timestamp()}"
  75. "org.opencontainers.image.version" = VERSION
  76. "org.opencontainers.image.revision" = SHA
  77. }
  78. args = {
  79. FRANKENPHP_VERSION = VERSION
  80. }
  81. }
  82. target "static-builder" {
  83. contexts = {
  84. golang-base = "docker-image://golang:${GO_VERSION}-alpine"
  85. }
  86. dockerfile = "static-builder.Dockerfile"
  87. context = "./"
  88. tags = ["${IMAGE_NAME}:static-builder"]
  89. args = {
  90. FRANKENPHP_VERSION = VERSION
  91. }
  92. secret = ["id=github-token,env=GITHUB_TOKEN"]
  93. }