This repository has been archived on 2024-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
Gerhard Lazu 26d24e6ac0
First attempt at restoring the container.input interface
The goal is to preserve the container.input interface so that custom
images can be specified, as per yarn/test/test.cue while keeping the
initial fix for https://github.com/dagger/dagger/issues/1670

Signed-off-by: Gerhard Lazu <gerhard@lazu.co.uk>
2022-03-04 18:41:21 +00:00

145 lines
3.1 KiB
CUE

// Yarn is a package manager for Javascript applications
package yarn
import (
"strings"
"dagger.io/dagger"
"universe.dagger.io/alpine"
"universe.dagger.io/bash"
"universe.dagger.io/docker"
)
#Build: #Run & {
buildDir: *"build" | string
script: *"build" | string
}
// Run a Yarn command
#Run: {
// Custom name for this command.
// Assign an app-specific name if there are multiple apps in the same plan.
name: string | *""
// App source code
source: dagger.#FS
// Working directory to use
cwd: *"." | string
// Write the contents of `environment` to this file, in the "envfile" format
writeEnvFile: string | *""
// Optional: Read build output from this directory
// Must be relative to working directory, cwd
buildDir?: string
// Yarn script to run for this command.
script: string
// Fix for shadowing issues
let yarnScript = script
// Optional arguments for the script
args: [...string] | *[]
// Secret variables
// FIXME: not implemented. Are they needed?
secrets: [string]: dagger.#Secret
container: #input: docker.#Image | *{
// FIXME: Yarn's version depends on Alpine's version
// Yarn version
// yarnVersion: *"=~1.22" | string
// FIXME: custom base image not supported
alpine.#Build & {
packages: {
bash: {}
yarn: {}
}
}
}
_run: docker.#Build & {
steps: [
container.#input,
docker.#Copy & {
dest: "/src"
contents: source
},
bash.#Run & {
// FIXME: move shell script to its own file
script: contents: #"""
yarn --cwd "$YARN_CWD" install --production false
"""#
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_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 run
_output: dagger.#Subdir & {
input: _run.output.rootfs
path: "/build"
}
output: _output.output
}