V2 Add github actions to support workflows

Message ID 20220505173233.1796815-1-woodard@redhat.com
State New
Headers
Series V2 Add github actions to support workflows |

Commit Message

Ben Woodard May 5, 2022, 5:32 p.m. UTC
  Changes since V1
Rebased against master.
Split off change to fedabipkgdiff
Added a workflow to test targeted libraries in fedora

To facilitate collaboration with developers working on the BUILD-SI
project who are using github, I have been maintaining a clone of the
libabigail repo there. Having this repo also allows us to leverage
some of the tooling that github provides, in particular the ability to
have github actions test patches to verify that the builds succeed,
and all the regression tests run successfully. This will allow it to
better integrate with the normal agile workflow used by at least this
community of developers.

   * add .github/workflows/build-container.yaml
   * add .github/workflows/libabigail.yaml
   * add .github/workflows/test.yaml
   * add .github/workflows/test-fedora.yaml
   * add docker/Dockerfile.fedora
   * add docker/Dockerfile.ubuntu
   * add docker/Dockerfile.fedora-base
   * add docker/Dockerfile.test
   * add README-DOCKER.md

Signed-off-by: vsoch <vsoch@users.noreply.github.com>
Reviewed-by: Ben Woodard <woodard@redhat.com>
---
 .github/workflows/build-container.yaml |  99 +++++++++++++++++++
 .github/workflows/libabigail.yaml      | 126 +++++++++++++++++++++++++
 .github/workflows/test-fedora.yaml     |  65 +++++++++++++
 .github/workflows/test.yaml            |  34 +++++++
 README-DOCKER.md                       |  66 +++++++++++++
 docker/Dockerfile.fedora               |  38 ++++++++
 docker/Dockerfile.fedora-base          |  21 +++++
 docker/Dockerfile.test                 |  28 ++++++
 docker/Dockerfile.ubuntu               |  30 ++++++
 9 files changed, 507 insertions(+)
 create mode 100644 .github/workflows/build-container.yaml
 create mode 100644 .github/workflows/libabigail.yaml
 create mode 100644 .github/workflows/test-fedora.yaml
 create mode 100644 .github/workflows/test.yaml
 create mode 100644 README-DOCKER.md
 create mode 100644 docker/Dockerfile.fedora
 create mode 100644 docker/Dockerfile.fedora-base
 create mode 100644 docker/Dockerfile.test
 create mode 100644 docker/Dockerfile.ubuntu
  

Comments

Dodji Seketeli May 13, 2022, 8:35 a.m. UTC | #1
Hello Ben, Vanessa,

Ben Woodard via Libabigail <libabigail@sourceware.org> a écrit:

[...]

> Signed-off-by: vsoch <vsoch@users.noreply.github.com>

Would you please put the complete name of Vanessa in here?  Just like
what we have for:

> Reviewed-by: Ben Woodard <woodard@redhat.com>

Also, is vsoch@users.noreply.github.com a valid email?  My mail user
agent keeps nagging me about it, so I thought I'd ask if the email is
valid.


> ---
>  .github/workflows/build-container.yaml |  99 +++++++++++++++++++

Also, would it be possible to add a little text in .github pointing to
the online doc where people can learn about this github workflow
business?  We can add that alter in any case.  I am happy to commit this
patch as is right now, assuming the naming issue of the signed-off-by
tag is addressed.

Thanks!

Cheers,
  
Ben Woodard May 16, 2022, 3:37 p.m. UTC | #2
> On May 13, 2022, at 1:35 AM, Dodji Seketeli <dodji@seketeli.org> wrote:
> 
> Hello Ben, Vanessa,
> 
> Ben Woodard via Libabigail <libabigail@sourceware.org> a écrit:
> 
> [...]
> 
>> Signed-off-by: vsoch <vsoch@users.noreply.github.com>
> 
> Would you please put the complete name of Vanessa in here?  Just like
> what we have for:
> 
>> Reviewed-by: Ben Woodard <woodard@redhat.com>
> 
> Also, is vsoch@users.noreply.github.com a valid email?  My mail user
> agent keeps nagging me about it, so I thought I'd ask if the email is
> valid.
> 

Yeah I noticed that. That was the way the patch came to me and so I didn’t want to take the liberty to change it. I’ll swap in email address that I commiunicate with her and run it by her to make sure that is the one that she wants to use.
> 
>> ---
>> .github/workflows/build-container.yaml |  99 +++++++++++++++++++
> 
> Also, would it be possible to add a little text in .github pointing to
> the online doc where people can learn about this github workflow
> business?  We can add that alter in any case.  I am happy to commit this
> patch as is right now, assuming the naming issue of the signed-off-by
> tag is addressed.
> 

No problem.

> Thanks!
> 
> Cheers,
> 
> -- 
> 		Dodji
>
  

Patch

diff --git a/.github/workflows/build-container.yaml b/.github/workflows/build-container.yaml
new file mode 100644
index 00000000..5b2737ba
--- /dev/null
+++ b/.github/workflows/build-container.yaml
@@ -0,0 +1,99 @@ 
+name: Build Deploy Container
+
+on:
+
+  # Always have a base image ready to go - this is a nightly build
+  schedule:
+    - cron: 0 3 * * *
+
+  # Allow manual trigger of a build
+  workflow_dispatch:
+    inputs:
+      whatever:
+        description: 'This variable does not matter, its a GHA bug.'
+
+  # On push to main we build and deploy images
+  push:
+    branches:
+      - develop
+
+  # Do build to test works on PR
+  pull_request: []
+
+  # Publish packages on release
+  release:
+    types: [published]
+
+jobs:
+  build:
+    permissions:
+      packages: write
+    strategy:
+      fail-fast: false
+      matrix:
+
+        # Dockerfiles to build, container names to use, and to tag as libabigail:latest?
+        container: [["Dockerfile.fedora", "ghcr.io/woodard/libabigail-fedora", true],
+                    ["Dockerfile.ubuntu", "ghcr.io/woodard/libabigail-ubuntu-22.04", false],
+                    ["Dockerfile.fedora-base", "ghcr.io/woodard/libabigail-fedora-base", false]]
+
+    runs-on: ubuntu-latest
+    name: Build
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v3
+
+      - name: Make Space For Build
+        run: |
+          sudo rm -rf /usr/share/dotnet
+          sudo rm -rf /opt/ghc
+
+       # It's easier to reference named variables than indexes of the matrix
+      - name: Set Environment
+        env:
+          dockerfile: ${{ matrix.container[0] }}
+          uri: ${{ matrix.container[1] }}
+          isLatest: ${{ matrix.container[2] }}
+        run: |
+          echo "dockerfile=$dockerfile" >> $GITHUB_ENV
+          echo "uri=$uri" >> $GITHUB_ENV
+          echo "isLatest=$isLatest" >> $GITHUB_ENV
+
+      - name: Pull previous layers for cache
+        run: docker pull ${uri}:latest || echo "No container to pull"
+
+      - name: Build Container
+        run: |
+           container=$uri:latest
+           docker build -f docker/${dockerfile} -t ${container} .
+           if [[ "${isLatest}" == "true" ]]; then               docker tag ${container} ghcr.io/woodard/libabigail:latest
+           fi
+           echo "container=$container" >> $GITHUB_ENV
+
+      - name: GHCR Login
+        if: (github.event_name != 'pull_request')
+        uses: docker/login-action@v1
+        with:
+          registry: ghcr.io
+          username: ${{ github.actor }}
+          password: ${{ secrets.GITHUB_TOKEN }}
+
+      - name: Deploy
+        if: (github.event_name != 'pull_request')
+        run: |
+            docker push ${container}
+            if [[ "${isLatest}" == "true" ]]; then
+               docker push ghcr.io/woodard/libabigail:latest
+            fi
+
+      - name: Tag and Push Release
+        if: (github.event_name == 'release')
+        run: |
+            tag=${GITHUB_REF#refs/tags/}
+            echo "Tagging and releasing ${uri}:${tag}"
+            docker tag ${uri}:latest ${uri}:${tag}
+            docker push ${uri}:${tag}
+            if [[ "${isLatest}" == "true" ]]; then
+                docker tag ${uri}:latest ghcr.io/woodard/libabigail:${tag}
+                docker push ghcr.io/woodard/libabigail:${tag}
+            fi
diff --git a/.github/workflows/libabigail.yaml b/.github/workflows/libabigail.yaml
new file mode 100644
index 00000000..a7c40d27
--- /dev/null
+++ b/.github/workflows/libabigail.yaml
@@ -0,0 +1,126 @@ 
+name: Libabigail ABI Checks
+on:
+  pull_request: []
+
+jobs:
+
+#  get-release:
+#    container: ghcr.io/woodard/libabigail-ubuntu-22.04:latest
+#    runs-on: ubuntu-latest
+#    steps:
+#    - name: Organize Files
+#      run: |
+#        mkdir -p /abi
+#        cp /opt/abigail-env/.spack-env/view/lib/libabigail.so /abi/
+#        cp /lib/x86_64-linux-gnu/libc.so.6 /abi/
+#        cp /lib/x86_64-linux-gnu/libstdc++.so.6 /abi/
+#        cp /lib/x86_64-linux-gnu/libsystemd.so.0 /abi/
+
+#    - name: Upload Libs
+#      uses: actions/upload-artifact@v3
+#      with:
+#        name: release-libs
+#        path: |
+#          /abi/libabigail.so
+#          /abi/libc.so.6
+#          /abi/libstdc++.so.6
+#          /abi/libsystemd.so.0
+
+
+  get-latest:
+    container: ghcr.io/woodard/libabigail-ubuntu-22.04:latest
+    runs-on: ubuntu-latest
+    steps:
+    - name: Organize Files
+      run: |
+        mkdir -p /abi
+        cp /opt/abigail-env/.spack-env/view/lib/libabigail.so /abi/
+        cp /lib/x86_64-linux-gnu/libc.so.6 /abi/
+        cp /lib/x86_64-linux-gnu/libstdc++.so.6 /abi/
+        cp /lib/x86_64-linux-gnu/libsystemd.so.0 /abi/
+
+    - name: Upload Libs
+      uses: actions/upload-artifact@v3
+      with:
+        name: latest-libs
+        path: |
+          /abi/libabigail.so
+          /abi/libc.so.6
+          /abi/libstdc++.so.6
+          /abi/libsystemd.so.0
+
+  get-pr:
+    container: ghcr.io/woodard/libabigail-ubuntu-22.04:latest
+    runs-on: ubuntu-latest
+    steps:
+    - name: Build Pull Request
+      uses: actions/checkout@v3
+    - name: Build
+      run: |
+         rm -rf /src
+         cp -R $PWD /src
+         ls /src
+         . /opt/spack/share/spack/setup-env.sh
+         cd /opt/abigail-env
+         spack install
+
+    - name: Organize Files
+      run: |
+        mkdir -p /abi
+        cp /opt/abigail-env/.spack-env/view/lib/libabigail.so /abi/
+        cp /lib/x86_64-linux-gnu/libc.so.6 /abi/
+        cp /lib/x86_64-linux-gnu/libstdc++.so.6 /abi/
+        cp /lib/x86_64-linux-gnu/libsystemd.so.0 /abi/
+
+    - name: Upload Libs
+      uses: actions/upload-artifact@v3
+      with:
+        name: pr-libs
+        path: |
+          /abi/libabigail.so
+          /abi/libc.so.6
+          /abi/libstdc++.so.6
+          /abi/libsystemd.so.0
+
+  abi:
+    runs-on: ubuntu-latest
+    needs: [get-latest, get-pr] # get-release
+    strategy:
+      fail-fast: false
+      matrix:
+
+        # Testing every paired library for release vs pr and main vs. pr
+        libs: ["libabigail.so",
+               "libc.so.6",
+               "libstdc++.so.6",
+               "libsystemd.so.0"]
+
+        # Artifact pairs (named) for comparison)
+        artifacts: [["pr-libs", "latest-libs"]]
+                    #["pr-libs", "release-libs"]]
+
+    steps:
+    - name: Download Previous Version
+      uses: actions/download-artifact@v2
+      with:
+        name: ${{ matrix.artifacts[1] }}
+        path: previous/
+
+    - name: Download Pull Request Version
+      uses: actions/download-artifact@v2
+      with:
+        name: ${{ matrix.artifacts[0] }}
+        path: current/
+
+    - name: Show Files
+      run: |
+        ls current/
+        ls previous/
+
+    - name: Run Libabigail
+      uses: buildsi/libabigail-action@0.0.11
+      env:
+        lib: ${{ matrix.libs }}
+      with:
+        abidiff: previous/${{ env.lib }} current/${{ env.lib }}
+        abidw: "--abidiff current/${{ env.lib }}"
diff --git a/.github/workflows/test-fedora.yaml b/.github/workflows/test-fedora.yaml
new file mode 100644
index 00000000..a0d2583f
--- /dev/null
+++ b/.github/workflows/test-fedora.yaml
@@ -0,0 +1,65 @@ 
+name: Libabigail ABI Diff Checks
+on:
+  pull_request: []
+
+jobs:
+  abi:
+    runs-on: ubuntu-latest
+    container: ghcr.io/woodard/libabigail
+    strategy:
+      fail-fast: false
+      matrix:
+
+        # Pairs of path and install command
+        libs: [["/lib64/libabigail.so", "libabigail"],
+               ["/lib64/libadwaitaqtpriv.so", "libadwaita-qt5"],
+               ["/lib64/libaspell.so", "aspell"],
+               ["/lib64/libboost_log.so", "boost-log"],
+               ["/lib64/libclucene-core.so", "clucene-core"],
+               ["/lib64/libdap.so", "libdap"],
+               ["/lib64/libdcerpc-samr.so", "samba-libs"],
+               ["/lib64/libdjvulibre.so", "djvulibre-libs"],
+               ["/lib64/dovecot/libdovecot-storage.so", "dovecot"],
+               ["/lib64/libexiv2.so", "exiv2-libs"],
+               ["/lib64/libgdal.so", "gdal-libs"],
+               ["/lib64/libgeos.so", "geos"],
+               ["/lib64/libglibmm-2.4.so", "glibmm24"],
+               ["/lib64/mozilla/plugins/gmp-gmpopenh264/system-installed/libgmpopenh264.so", "mozilla-openh264"],
+               ["/lib64/libhdf5_cpp.so", "hdf5"],
+               ["/lib64/libicui18n.so", "libicu67"],
+               ["/lib64/libicui18n.so", "libicu"],
+               ["/lib64/libicuuc.so", "libicu67"],
+               ["/lib64/libicuuc.so", "libicu"],
+               ["/lib64/dyninst/libinstructionAPI.so", "dyninst"],
+               ["/lib64/libjavascriptcoregtk-4.0.so", "webkit2gtk3-jsc"],
+               ["/lib64/libjxl.so", "libjxl"],
+               ["/lib64/libkmldom.so", "libkml"],
+               ["/lib64/libmusicbrainz5.so", "libmusicbrainz5"],
+               ["/lib64/libOpenEXRUtil-3_1.so", "openexr-libs"],
+               ["/lib64/libopenh264.so", "openh264"],
+               ["/lib64/libOSMesa.so", "mesa-libOSMesa"],
+               ["/lib64/libproj.so", "proj"],
+               ["/lib64/libQt5WaylandClient.so", "qt5-qtwayland"],
+               ["/lib64/libQt5WaylandCompositor.so", "qt5-qtwayland"],
+               ["/lib64/libQt5XmlPatterns.so", "qt5-qtxmlpatterns"],
+               ["/lib64/libSDL2_image-2.0.so", "SDL2_image"],
+               ["/lib64/libstdc++.so", "libstdc++"],
+               ["/lib64/libtag.so", "taglib"],
+               ["/lib64/libreoffice/program/libuno_cppuhelpergcc3.so", "libreoffice-ure"],
+               ["/lib64/libvtkRenderingCore.so", "vtk"],
+               ["/lib64/libwebrtc_audio_processing.so", "webrtc-audio-processing"]]
+    steps:
+    - name: Install Library
+      env:
+        lib: ${{ matrix.libs[1] }}
+      run: dnf install -y ${lib} findutils
+
+    - name: Run abidw abidiff
+      env:
+        libpath: ${{ matrix.libs[0] }}
+      run: |
+        for name in $(find -type f $libpath*); do
+          printf "abidw --abidiff ${name}\n"
+          abidw --abidiff ${name}
+          echo $?
+        done
diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml
new file mode 100644
index 00000000..1b16ea12
--- /dev/null
+++ b/.github/workflows/test.yaml
@@ -0,0 +1,34 @@ 
+name: Test Libabigail
+
+on:
+  pull_request: []
+  push:
+    branches:
+      - develop
+
+jobs:
+  build:
+    permissions:
+      packages: read
+    strategy:
+      fail-fast: false
+      matrix:
+
+        # Testing containers (build and run make check)
+        dockerfile: ["Dockerfile.test"]
+
+    runs-on: ubuntu-latest
+    name: Build
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v3
+
+      - name: Make Space For Build
+        run: |
+          sudo rm -rf /usr/share/dotnet
+          sudo rm -rf /opt/ghc
+
+      - name: Build Test Container
+        env:
+          dockerfile: ${{ matrix.dockerfile }}
+        run: docker build -f docker/${dockerfile} -t libabigail-test .
diff --git a/README-DOCKER.md b/README-DOCKER.md
new file mode 100644
index 00000000..ad2dd8e1
--- /dev/null
+++ b/README-DOCKER.md
@@ -0,0 +1,66 @@ 
+# Libabigail Docker
+
+Libabigail comes with two Dockerfile in [docker](docker) to build each of:
+
+ - a Fedora base image (recommended)
+ - an Ubuntu base image.
+
+These containers are built and deployed on merges to the main branch and releases.
+
+### Usage
+
+Here is how to build the containers. Note that we build so it belongs to the same
+namespace as the repository here. "ghcr.io" means "GitHub Container Registry" and
+is the [GitHub packages](https://github.com/features/packages) registry that supports
+ Docker images and other OCI artifacts.
+
+```bash
+$ docker build -f docker/Dockerfile.fedora -t ghcr.io/woodard/libabigail-fedora .
+```
+```bash
+$ docker build -f docker/Dockerfile.ubuntu -t ghcr.io/woodard/libabigail-ubuntu-22.04 .
+```
+
+Note that currently the fedora image is deployed to `ghcr.io/woodard/libabigail:latest`.
+
+### Shell
+
+To shell into a container (here is an example with ubuntu):
+
+```bash
+$ docker run -it ghcr.io/woodard/libabigail-ubuntu-22.04 bash
+```
+
+Off the bat, you can find the abi executables:
+
+```bash
+# which abidiff
+/opt/abigail-env/.spack-env/view/bin/abidiff
+```
+
+Since the ubuntu base uses spack, you can interact with spack.
+You can go to the environment in `/opt/abigail-env` and (given you
+have the source code bound to `/src`) build and test again.
+
+```bash
+$ spack install
+```
+
+And that's it! This workflow should make it easy to install development versions of libabigail with spack.
+We will also use the "production" containers to grab libraries in:
+
+```
+$ ls /opt/abigail-env/.spack-env/view/
+bin  include  lib  share
+```
+
+Note that the fedora container does not come with spack.
+
+### Testing
+
+We provide a testing container, which will use a fedora base and add new code to
+compile, and then run `make check`. You can do this as follows on your local machine:
+
+```bash
+$ docker build -f docker/Dockerfile.test -t test .
+```
diff --git a/docker/Dockerfile.fedora b/docker/Dockerfile.fedora
new file mode 100644
index 00000000..0257e99e
--- /dev/null
+++ b/docker/Dockerfile.fedora
@@ -0,0 +1,38 @@ 
+FROM ghcr.io/woodard/libabigail-fedora-base as builder
+
+# docker build -f docker/Dockerfile.fedora -t ghcr.io/woodard/libabigail-fedora .
+
+WORKDIR /code
+COPY . /code
+
+RUN mkdir -p build && \
+    autoreconf -i && \
+    cd build && \
+    CXXFLAGS="-g3 -fvar-tracking-assignments \
+    -gstatement-frontiers -gvariable-location-views -grecord-gcc-switches -pipe -Wall \
+    -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -Wp,-D_GLIBCXX_ASSERTIONS \
+    -fstack-protector-strong -fstack-clash-protection -fcf-protection \
+    -fasynchronous-unwind-tables -O2" CFLAGS="-g3 -fvar-tracking-assignments \
+    -gstatement-frontiers -gvariable-location-views -grecord-gcc-switches -pipe -Wall \
+    -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -Wp,-D_GLIBCXX_ASSERTIONS \
+    -fstack-protector-strong -fstack-clash-protection -fcf-protection \
+    -fasynchronous-unwind-tables -O2" LDFLAGS="-Wl,--no-undefined" \
+    ../configure --prefix=/opt/libabigail --enable-rpm=yes && \
+    make -j4 && \
+    make install
+
+FROM fedora:latest
+COPY --from=builder /opt/libabigail /opt/libabigail
+ENV PATH=/opt/libabigail/bin:$PATH
+
+# Runtime dependencies
+RUN dnf install -y \
+    python3-koji \
+    python3-mock \
+    python3-pyxdg \
+    elfutils-libelf \
+    elfutils-libs \
+    libstdc++ \
+    lbzip2 \
+    shared-mime-info \
+    six
diff --git a/docker/Dockerfile.fedora-base b/docker/Dockerfile.fedora-base
new file mode 100644
index 00000000..f803dd7f
--- /dev/null
+++ b/docker/Dockerfile.fedora-base
@@ -0,0 +1,21 @@ 
+ARG fedora_version=latest
+# ARG fedora_version=35
+FROM fedora:${fedora_version} as builder
+
+# docker build -f docker/Dockerfile.fedora-base -t ghcr.io/woodard/libabigail-fedora-base .
+
+RUN dnf install -y \
+    autoconf \
+    automake \
+    cpio \
+    elfutils-devel \
+    gcc-c++ \
+    lbzip2 \
+    libtool \
+    libxml2-devel \
+    python3-koji \
+    python3-mock \
+    python3-pyxdg \
+    shared-mime-info \
+    six \
+    wget
diff --git a/docker/Dockerfile.test b/docker/Dockerfile.test
new file mode 100644
index 00000000..f25739a6
--- /dev/null
+++ b/docker/Dockerfile.test
@@ -0,0 +1,28 @@ 
+FROM ghcr.io/woodard/libabigail-fedora-base
+
+# docker build -f docker/Dockerfile.test -t test .
+
+RUN dnf install -y \
+    file \
+    diffutils \
+    lbzip2 \
+    elfutils-libs
+
+WORKDIR /code
+COPY . /code
+
+RUN mkdir -p build && \
+    autoreconf -i && \
+    cd build && \
+    CXXFLAGS="-g3 -fvar-tracking-assignments \
+    -gstatement-frontiers -gvariable-location-views -grecord-gcc-switches -pipe -Wall \
+    -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -Wp,-D_GLIBCXX_ASSERTIONS \
+    -fstack-protector-strong -fstack-clash-protection -fcf-protection \
+    -fasynchronous-unwind-tables -O2" CFLAGS="-g3 -fvar-tracking-assignments \
+    -gstatement-frontiers -gvariable-location-views -grecord-gcc-switches -pipe -Wall \
+    -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -Wp,-D_GLIBCXX_ASSERTIONS \
+    -fstack-protector-strong -fstack-clash-protection -fcf-protection \
+    -fasynchronous-unwind-tables -O2" LDFLAGS="-Wl,--no-undefined" \
+    ../configure --prefix=/opt/libabigail --enable-rpm=yes && \
+    make -j4 && \
+    make check ENABLE_SLOW_TEST=yes || (cat tests/test-suite.log && exit 1)
diff --git a/docker/Dockerfile.ubuntu b/docker/Dockerfile.ubuntu
new file mode 100644
index 00000000..cb1dc166
--- /dev/null
+++ b/docker/Dockerfile.ubuntu
@@ -0,0 +1,30 @@ 
+ARG ubuntu_version=22.04
+ARG gcc_version=10.3.0
+FROM ghcr.io/rse-ops/gcc-ubuntu-${ubuntu_version}:gcc-${gcc_version}
+
+# docker build -t ghcr.io/woodard/libabigail-ubuntu-22.04 .
+
+# Install Libabigail to its own view
+WORKDIR /opt/abigail-env
+RUN . /opt/spack/share/spack/setup-env.sh && \
+    spack env create -d . && \
+    spack env activate . && \
+    spack add libabigail@master  && \
+    spack --debug install
+
+# Prepare a source extraction of libabigail at /src (intended to be overwritten by user)
+COPY . /src
+
+# Second run - should have deps cached
+RUN . /opt/spack/share/spack/setup-env.sh && \
+
+    # This adds metadata for libabigail to spack.yaml
+    spack develop --path /src libabigail@master && \
+    spack --debug install
+    # At this point you can spack install, and bind the code to /code to develop
+
+# ensure libabigail stuffs always on the path
+RUN cd /opt/abigail-env && \
+    spack env activate --sh -d . >> /etc/profile.d/z10_spack_environment.sh
+
+ENTRYPOINT ["/bin/bash", "--rcfile", "/etc/profile", "-l", "-c"]