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 & {
// 1. Start from dev runtime build
{
output: build.output
// 2. Build web assets
// FIXME: move this to a reusable def (yarn package? or private?)
// FIXME: will there be multiple writers?
concurrency: "locked"
// FIXME: run 'yarn install' and 'yarn run compile' separately, with different caching?
// FIXME: can we reuse universe.dagger.io/yarn ???? 0:-)
name: "sh"
flags: "-c": """
yarn install --frozen-lockfile && yarn run compile"
"""
workdir: "/app/assets"
test: {
env: "test"
// Run tests
run: docker.#Run & {
image: build.output
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)
image: pull.output