itopiz

itopiz

In the process of setting up a Gitlab CI pipeline, I noticed something that I don’t understand.

My .gitlab-ci.yml looks like this:

variables:
  POSTGRES_HOST: "postgres"
  POSTGRES_DB: "postgres"
  POSTGRES_USER: "postgres"
  POSTGRES_PASSWORD: "postgres"
  MIX_ENV: "test"
  
stages:
  - build
  - test

default:
  image: elixir:1.9
  before_script:
    - mix local.hex --force
    - mix local.rebar --force

compile:
  stage: build
  script:
    - apt-get update
    - apt-get install -y postgresql-client
    - mix deps.get --only test
    - mix compile --warnings-as-errors
  artifacts:
    paths:
      - _build
      - deps
    expire_in: 1 week

lint:
  stage: test
  script:
    - mix format --check-formatted

test:
  stage: test
  services:
    - postgres:10.10
  script:
    - mix event_store.setup
    - mix ecto.create
    - mix ecto.migrate
    - mix test

Since jobs are run independently from each other, I save the compilation artifacts from the compile job to avoid recompiling in the next jobs. However, when the test job runs the mix ecto.create command, a compilation is triggered again. Why? Did not the compile job compile everything needed when running mix compile --warnings-as-errors?

Showing Posts 1 to 7

LostKobrakai

LostKobrakai

Each mix env does have it’s own artefacts and mix test defaults to running in the test mix env, while other mix tasks, which don’t have a preferred env, default to dev.

itopiz

itopiz OP

Thank you for your quick reply LostKobrakai.

All commands are run for the test environment thanks to the variable in .gitlab-ci.yml

variables:
  MIX_ENV: "test"

Also, browsing the artifacts with Gitlab shows that there is only a test directory within the _build directory.

So I guess all mix tasks were run in the test env, right?

axelson

axelson

Scenic Core Team

If the jobs are run independently are the clocks synchronized? Maybe the timestamps are out of sync which might trigger the recompilation

NobbZ

NobbZ

You do not “depend” on the previous stage, so there are no artifacts available during test stage.

itopiz

itopiz OP

Thank you for your answer. The Gitlab documentation about dependencies states:

Note that artifacts from all previous stages are passed by default.

So the artifacts should be passed. Also, the test job trace shows that the artifacts were downloaded:

Running with gitlab-runner 12.1.0 (de7731dd)
  on docker-auto-scale ed2dce3a
Using Docker executor with image elixir:1.9 ...
Starting service postgres:10.10 ...
Pulling docker image postgres:10.10 ...
Using docker image sha256:cf7301675e300ca20b74fb7fc3e34d2bfb04c6bc79699594217b0060e2312bcd for postgres:10.10 ...
Waiting for services to be up and running...
Pulling docker image elixir:1.9 ...
Using docker image sha256:f14e6364d0696d81769b31d6fb38f24b3bf10bf2503b005e5753cb6b10d746a4 for elixir:1.9 ...
Running on runner-ed2dce3a-project-13900485-concurrent-0 via runner-ed2dce3a-srm-1566462193-44c7355f...
Fetching changes...
Initialized empty Git repository in /builds/me/myapp/.git/
Created fresh repository.
From https://gitlab.com/me/myapp
 * [new branch]      master            -> origin/master
 * [new branch]      setup-ci-pipeline -> origin/setup-ci-pipeline
Checking out a7f07670 as setup-ci-pipeline...

Skipping Git submodules setup
Downloading artifacts for compile (277662661)...
Downloading artifacts from coordinator... ok        id=277662661 responseStatus=200 OK token=MDDAoYgU
$ mix local.hex --force
* creating /root/.mix/archives/hex-0.20.1
$ mix local.rebar --force
* creating /root/.mix/rebar
* creating /root/.mix/rebar3
$ mix event_store.setup
The EventStore database has been created.
The EventStore database has been initialized.
$ mix ecto.setup
Compiling 356 files (.ex)
Compiling lib/myapp_web/resolvers/accounts/change_user_role.ex (it's taking more than 15s)
[…]
Generated myapp app
The database for myapp.Repo has been created
The database for myapp.ReadStore has been created
$ mix test
Excluding tags: [:pending]

......................................................................... […]

Finished in 207.5 seconds
9 doctests, 3454 tests, 0 failures

Randomized with seed 555244
Job succeeded
NobbZ

NobbZ

I’ve never checked for that. I always explicitely define dependencies, to make sure to have the artifacts I want.

Anyway, mix does solely rely on the files timestamps when deciding wether or not a file/dependency needs recompilation.

The artifacts might be extracted and carry the original date, while git on a checkout always sets current time as cdate.

This is an assumption though. I usually do not care for rebuilding such stuff on subsequent stages (in elixir), as I have to recompile anyway for different environments…

You might try to recursively touch all artifacts, alternatively some mix tasks allow --no-compile or something like that, you might be able to play with that.

itopiz

itopiz OP

Ok, that explains why a new compilation happens. Thank you

— All posts loaded —

Where Next? Top

Trending in Questions Top

Blokh
Hey guys, I’ve got a huge CSV ( around 10 GB ) that needs to be processed hourly Do you guys have any suggestions what is the best prac...
New
kszambelanczyk
Hello! Could someone please give me a help/sample code, how to delete a file from s3 using waffle/waffle_ecto from Phoenix app. I creat...
New
Onor.io
I have what I’ve heard referred to as a “lookup table” in my database. This is a way of assigning codes to common values. One common lo...
New
Trolleger
What approach to take when sending live updates to “random” users Hi! I have a question, I have a little chat app, and when I create a DM...
New
matt-savvy
Anyone here using Honeybadger? My Honeybadger account is being overwhelmed with noise from some bots. Seeing a lot of Bandit.HTTPError...
New
RemyXRenard
I’m seeing that a list inside a Kino.DataTable will be interpreted as a charlist, even if the Kino.configure() is set to charlists: :as_l...
New
samoloth
Hi, I’ve just set up an application with ash_authentication. There is only magic link strategy for now, so there is no confirmation add o...
New

Other Trending Topics Top

mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
mcass19
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve. They are GUI (Emerge) and State management (S...
New
netoum
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
wintermeyer
There are three potential reasons for members of this forum to have a look at https://vutuv.de You are tired or annoyed of LinkedIn. Yo...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews