Extract yarn install into a separate step
If multiple yarn.#Run commands run in parallel, they will corrupt each other's yarn cache mount. Because we extract yarn install into a separate step, LLB will dedup the yarn install step and only run it once, regardless how many yarn.#Run commands run in parallel. Fixes https://github.com/dagger/dagger/issues/1670 Signed-off-by: Gerhard Lazu <gerhard@lazu.co.uk>
This commit is contained in:
parent
d8af79166e
commit
089d464802
@ -16,7 +16,7 @@ import (
|
|||||||
script: *"build" | string
|
script: *"build" | string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build a Yarn package
|
// Run a Yarn command
|
||||||
#Run: {
|
#Run: {
|
||||||
// Custom name for the build.
|
// Custom name for the build.
|
||||||
// When building different apps in the same plan, assign
|
// When building different apps in the same plan, assign
|
||||||
@ -50,71 +50,93 @@ import (
|
|||||||
// FIXME: not implemented. Are they needed?
|
// FIXME: not implemented. Are they needed?
|
||||||
secrets: [string]: dagger.#Secret
|
secrets: [string]: dagger.#Secret
|
||||||
|
|
||||||
// FIXME: Yarn's version depends on Alpine's version
|
_build: docker.#Build & {
|
||||||
// Yarn version
|
steps: [
|
||||||
// yarnVersion: *"=~1.22" | string
|
// FIXME: Yarn's version depends on Alpine's version
|
||||||
|
// Yarn version
|
||||||
// FIXME: custom base image not supported
|
// yarnVersion: *"=~1.22" | string
|
||||||
_buildImage: alpine.#Build & {
|
// FIXME: custom base image not supported
|
||||||
packages: {
|
alpine.#Build & {
|
||||||
bash: {}
|
packages: {
|
||||||
yarn: {}
|
bash: {}
|
||||||
}
|
yarn: {}
|
||||||
}
|
|
||||||
|
|
||||||
// Run yarn in a docker container
|
|
||||||
container: bash.#Run & {
|
|
||||||
input: *_buildImage.output | docker.#Image
|
|
||||||
|
|
||||||
// FIXME: move shell script to its own file
|
|
||||||
script: contents: #"""
|
|
||||||
# Create $ENVFILE_NAME file if set
|
|
||||||
[ -n "$ENVFILE_NAME" ] && echo "$ENVFILE" > "$ENVFILE_NAME"
|
|
||||||
|
|
||||||
yarn --cwd "$YARN_CWD" install --production false
|
|
||||||
|
|
||||||
opts=( $(echo $YARN_ARGS) )
|
|
||||||
yarn --cwd "$YARN_CWD" run "$YARN_BUILD_SCRIPT" ${opts[@]}
|
|
||||||
if [ ! -z "${YARN_BUILD_DIRECTORY:-}" ]; then
|
|
||||||
mv "$YARN_BUILD_DIRECTORY" /build
|
|
||||||
else
|
|
||||||
mkdir /build
|
|
||||||
fi
|
|
||||||
"""#
|
|
||||||
|
|
||||||
mounts: {
|
|
||||||
"yarn cache": {
|
|
||||||
dest: "/cache/yarn"
|
|
||||||
contents: dagger.#CacheDir & {
|
|
||||||
// FIXME: are there character limitations in cache ID?
|
|
||||||
id: "universe.dagger.io/yarn.#Build \(name)"
|
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
"package source": {
|
|
||||||
|
docker.#Copy & {
|
||||||
dest: "/src"
|
dest: "/src"
|
||||||
contents: source
|
contents: source
|
||||||
}
|
},
|
||||||
}
|
|
||||||
|
|
||||||
export: directories: "/build": _
|
bash.#Run & {
|
||||||
|
// FIXME: move shell script to its own file
|
||||||
|
script: contents: #"""
|
||||||
|
yarn --cwd "$YARN_CWD" install --production false
|
||||||
|
"""#
|
||||||
|
|
||||||
env: {
|
mounts: "yarn cache": {
|
||||||
YARN_BUILD_SCRIPT: yarnScript
|
dest: "/cache/yarn"
|
||||||
YARN_ARGS: strings.Join(args, "\n")
|
contents: dagger.#CacheDir & {
|
||||||
YARN_CACHE_FOLDER: "/cache/yarn"
|
// FIXME: are there character limitations in cache ID?
|
||||||
YARN_CWD: cwd
|
id: "universe.dagger.io/yarn.#Run \(name)"
|
||||||
if buildDir != _|_ {
|
}
|
||||||
YARN_BUILD_DIRECTORY: buildDir
|
}
|
||||||
}
|
|
||||||
if writeEnvFile != "" {
|
|
||||||
ENVFILE_NAME: writeEnvFile
|
|
||||||
ENVFILE: strings.Join([ for k, v in env {"\(k)=\(v)"}], "\n")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
workdir: "/src"
|
env: {
|
||||||
|
YARN_CACHE_FOLDER: "/cache/yarn"
|
||||||
|
YARN_CWD: cwd
|
||||||
|
}
|
||||||
|
|
||||||
|
workdir: "/src"
|
||||||
|
},
|
||||||
|
|
||||||
|
bash.#Run & {
|
||||||
|
// FIXME: move shell script to its own file
|
||||||
|
script: contents: #"""
|
||||||
|
# Create $ENVFILE_NAME file if set
|
||||||
|
[ -n "$ENVFILE_NAME" ] && echo "$ENVFILE" > "$ENVFILE_NAME"
|
||||||
|
|
||||||
|
opts=( $(echo $YARN_ARGS) )
|
||||||
|
yarn --cwd "$YARN_CWD" run "$YARN_BUILD_SCRIPT" ${opts[@]}
|
||||||
|
if [ ! -z "${YARN_BUILD_DIRECTORY:-}" ]; then
|
||||||
|
mv "$YARN_BUILD_DIRECTORY" /build
|
||||||
|
else
|
||||||
|
mkdir /build
|
||||||
|
fi
|
||||||
|
"""#
|
||||||
|
|
||||||
|
mounts: "yarn cache": {
|
||||||
|
dest: "/cache/yarn"
|
||||||
|
contents: dagger.#CacheDir & {
|
||||||
|
// FIXME: are there character limitations in cache ID?
|
||||||
|
id: "universe.dagger.io/yarn.#Run \(name)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
env: {
|
||||||
|
YARN_BUILD_SCRIPT: yarnScript
|
||||||
|
YARN_ARGS: strings.Join(args, "\n")
|
||||||
|
YARN_CACHE_FOLDER: "/cache/yarn"
|
||||||
|
YARN_CWD: cwd
|
||||||
|
if buildDir != _|_ {
|
||||||
|
YARN_BUILD_DIRECTORY: buildDir
|
||||||
|
}
|
||||||
|
if writeEnvFile != "" {
|
||||||
|
ENVFILE_NAME: writeEnvFile
|
||||||
|
ENVFILE: strings.Join([ for k, v in env {"\(k)=\(v)"}], "\n")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
workdir: "/src"
|
||||||
|
},
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
// The final contents of the package after build
|
// The final contents of the package after build
|
||||||
output: container.export.directories."/build"
|
_output: dagger.#Subdir & {
|
||||||
|
input: _build.output.rootfs
|
||||||
|
path: "/build"
|
||||||
|
}
|
||||||
|
|
||||||
|
output: _output.output
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user