354334a3dc
* `cmd` is renamed to `command` for readability * `script` is removed. Feature moves up the stack (bash.#Run, python.#Run) Signed-off-by: Solomon Hykes <solomon@dagger.io>
148 lines
3.2 KiB
CUE
148 lines
3.2 KiB
CUE
package ci
|
|
|
|
import (
|
|
"dagger.io/dagger"
|
|
"dagger.io/dagger/engine"
|
|
|
|
"universe.dagger.io/docker"
|
|
"universe.dagger.io/examples/changelog.com/highlevel/elixir/mix"
|
|
)
|
|
|
|
dagger.#Plan & {
|
|
// Receive things from client
|
|
inputs: {
|
|
directories: {
|
|
// App source code
|
|
app: _
|
|
}
|
|
secrets: {
|
|
// Docker ID password
|
|
docker: _
|
|
}
|
|
params: {
|
|
// Which Elixir base image to download
|
|
runtime_image: docker.#Ref | *"thechangelog/runtime:2021-05-29T10.17.12Z"
|
|
// Which test DB image to download
|
|
test_db_image: docker.#Ref | *"circleci/postgres:12.6"
|
|
}
|
|
}
|
|
|
|
// Do things
|
|
actions: {
|
|
// Reuse in all mix commands
|
|
_appName: "changelog"
|
|
|
|
prod: assets: docker.#Build & {
|
|
steps: [
|
|
// 1. Start from dev assets :)
|
|
dev.assets,
|
|
// 2. Mix magical command
|
|
mix.#Run & {
|
|
command: {
|
|
name: "mix"
|
|
args: ["phx.digest"]
|
|
}
|
|
mix: {
|
|
env: "prod"
|
|
app: _appName
|
|
depsCache: "private"
|
|
buildCache: "private"
|
|
}
|
|
workdir: _
|
|
// FIXME: remove copy-pasta
|
|
mounts: nodeModules: {
|
|
contents: engine.#CacheDir & {
|
|
// FIXME: do we need an ID here?
|
|
id: "\(mix.app)_assets_node_modules"
|
|
// FIXME: does this command need write access to node_modules cache?
|
|
concurrency: "private"
|
|
}
|
|
dest: "\(workdir)/node_modules"
|
|
}
|
|
},
|
|
]
|
|
}
|
|
|
|
dev: {
|
|
build: mix.#Build & {
|
|
env: "dev"
|
|
app: "thechangelog"
|
|
base: inputs.params.runtime_image
|
|
source: inputs.directories.app.contents
|
|
}
|
|
|
|
assets: docker.#Build & {
|
|
steps: [
|
|
// 1. Start from dev runtime build
|
|
{
|
|
output: build.output
|
|
},
|
|
// 2. Build web assets
|
|
mix.#Run & {
|
|
mix: {
|
|
env: "dev"
|
|
app: _appName
|
|
depsCache: "private"
|
|
buildCache: "private"
|
|
}
|
|
// FIXME: move this to a reusable def (yarn package? or private?)
|
|
mounts: nodeModules: {
|
|
contents: engine.#CacheDir & {
|
|
// FIXME: do we need an ID here?
|
|
id: "\(mix.app)_assets_node_modules"
|
|
// FIXME: will there be multiple writers?
|
|
concurrency: "locked"
|
|
}
|
|
dest: "\(workdir)/node_modules"
|
|
}
|
|
// FIXME: run 'yarn install' and 'yarn run compile' separately, with different caching?
|
|
// FIXME: can we reuse universe.dagger.io/yarn ???? 0:-)
|
|
command: {
|
|
name: "sh"
|
|
flags: "-c": """
|
|
yarn install --frozen-lockfile && yarn run compile"
|
|
"""
|
|
}
|
|
workdir: "/app/assets"
|
|
},
|
|
]
|
|
}
|
|
}
|
|
test: {
|
|
build: mix.#Build & {
|
|
env: "test"
|
|
app: _appName
|
|
base: inputs.params.runtime_image
|
|
source: inputs.directories.app.contents
|
|
}
|
|
|
|
// Run tests
|
|
run: docker.#Run & {
|
|
image: build.output
|
|
command: {
|
|
name: "mix"
|
|
args: ["test"]
|
|
}
|
|
// Don't cache running tests
|
|
// Just because we've tested a version before, doesn't mean we don't
|
|
// want to test it again.
|
|
// FIXME: make this configurable
|
|
always: true
|
|
}
|
|
|
|
db: {
|
|
// Pull test DB image
|
|
pull: docker.#Pull & {
|
|
source: inputs.params.test_db_image
|
|
}
|
|
|
|
// Run test DB
|
|
// FIXME: kill once no longer needed (when tests are done running)
|
|
run: docker.#Run & {
|
|
image: pull.output
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|