Skip to content

Commit

Permalink
Prepare for GH release with static binary
Browse files Browse the repository at this point in the history
Signed-off-by: Paul-Elliot <peada@free.fr>
  • Loading branch information
panglesd committed Jan 9, 2024
1 parent 298f622 commit 627cee8
Show file tree
Hide file tree
Showing 8 changed files with 187 additions and 0 deletions.
140 changes: 140 additions & 0 deletions .github/workflows/build.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
name: CI

on:
push:
branches: [ master ]
pull_request:
branches: [ master ]

jobs:
linux-build:
strategy:
matrix:
platform:
- { name: "linux/amd64", filename_suffix: "linux-amd64", target_arch: "x86_64" }
- { name: "linux/arm64", filename_suffix: "linux-arm64", target_arch: "arm64" }
runAllTests:
- ${{ startsWith(github.ref, 'refs/tags/') }}
# exclude:
# - platform: { name: "linux/arm64", filename_suffix: "linux-arm64", target_arch: "arm64" }
# runAllTests: false
fail-fast: false
runs-on: ubuntu-latest

env:
SLIPSHOW_PLATFORM: ${{ matrix.platform.name }}

steps:
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0 # Needed to fetch tags

# The latest tag is needed to build the release tarball but
# actions/checkout fails to fetch it properly.
# https://github.com/actions/checkout/issues/882
- name: Fetch tags
run: git fetch --tags --force origin

- name: Set up QEMU
id: qemu
uses: docker/setup-qemu-action@v1
with:
image: tonistiigi/binfmt:latest
platforms: all

- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v1
with:
driver: docker

- name: Check images
run: docker image ls

- name: Build release tarball
# if: startsWith(github.ref, 'refs/tags/')
run: |
mkdir -p new_release; chmod a+rw new_release;
docker buildx build --platform ${{ matrix.platform.name }} --load \
-f release/Dockerfile \
-t slipshow-release-${{ matrix.platform.name }} .
docker run --platform ${{ matrix.platform.name }} -v $PWD/new_release:/release \
-e VERSION=$GITHUB_REF_NAME \
-e TARGETOS=linux \
-e TARGETARCH=${{ matrix.platform.target_arch }} \
-e OUTPUT=/release \
slipshow-release-${{ matrix.platform.name }} \
opam exec -- bash release/release.sh
- name: upload archives
# if: startsWith(github.ref, 'refs/tags/')
uses: actions/upload-artifact@v3
with:
name: archives
path: new_release/*

mac-build:
strategy:
fail-fast: false
matrix:
os:
- macos-latest
ocaml-compiler:
- 4.14.x
runs-on: ${{ matrix.os }}
steps:
- name: Checkout code
uses: actions/checkout@v3
with:
fetch-depth: 0

# See the same step in the linux build
- name: Fetch tags
run: git fetch --tags --force origin

- name: Use OCaml ${{ matrix.ocaml-compiler }}
uses: ocaml/setup-ocaml@v2
with:
ocaml-compiler: ${{ matrix.ocaml-compiler }}
dune-cache: ${{ matrix.os != 'macos-latest' }}

- name: Install dependencies
run: opam install --deps-only --with-test --with-doc -y .

- name: Build release tarball
# if: startsWith(github.ref, 'refs/tags/')
run: |
mkdir -p new_release;
export OUTPUT=$PWD/new_release;
export TARGETOS=macos;
export TARGETARCH=x86_64;
export VERSION=$GITHUB_REF_NAME;
opam exec -- bash release/release.sh
- name: upload archives
# if: startsWith(github.ref, 'refs/tags/')
uses: actions/upload-artifact@v3
with:
name: archives
path: new_release/*

release:
if: startsWith(github.ref, 'refs/tags/')
needs: [linux-build, mac-build]
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3

- name: Download build artifacts
uses: actions/download-artifact@v3
with:
name: archives
path: archives

- name: Release
uses: softprops/action-gh-release@v1
with:
files: |
archives/*
3 changes: 3 additions & 0 deletions compiler/src/bin/dune
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
(name main)
(modes native)
(modules main compile)
(flags
(:standard
(:include static-linking-flags/flags)))
(libraries
slipshow
cmdliner
Expand Down
4 changes: 4 additions & 0 deletions compiler/src/bin/static-linking-flags/dune
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
(rule
(with-stdout-to
flags
(run ocaml %{dep:static_linking_flags.ml} %{ocaml-config:target})))
7 changes: 7 additions & 0 deletions compiler/src/bin/static-linking-flags/static_linking_flags.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
let () =
print_endline
@@
match Sys.argv.(1) with
| "aarch64-unknown-linux-musl" | "x86_64-pc-linux-musl" ->
"(-cclib -static -cclib -no-pie)"
| _ -> "()"
7 changes: 7 additions & 0 deletions dune-project
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,13 @@
base64
bos
cmarkit
lwt
inotify
js_of_ocaml-compiler
magic-mime
dream
fpath
dream-livereload
(odoc :with-doc)
(ocamlformat
(and :with-dev-setup (= 0.26.1))))
Expand Down
9 changes: 9 additions & 0 deletions release/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
FROM ocaml/opam:alpine-ocaml-4.14
RUN sudo apk add libev-dev openssl-dev
RUN sudo apk add openssl-libs-static
WORKDIR slipshow/

COPY --chown=opam *.opam .
RUN opam install -y --deps-only --with-test --with-doc .

COPY --chown=opam . .
10 changes: 10 additions & 0 deletions release/release.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#/usr/bin/env bash
set -xeuo pipefail

archive_name=$OUTPUT/slipshow-$TARGETOS-$TARGETARCH.tar

dune subst

dune build -p slipshow
# Executables are symlinks, follow with -h.
tar hcf "$archive_name" -C _build/install/default bin/slipshow
7 changes: 7 additions & 0 deletions slipshow.opam
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,13 @@ depends: [
"base64"
"bos"
"cmarkit"
"lwt"
"inotify"
"js_of_ocaml-compiler"
"magic-mime"
"dream"
"fpath"
"dream-livereload"
"odoc" {with-doc}
"ocamlformat" {with-dev-setup & = "0.26.1"}
]
Expand Down

0 comments on commit 627cee8

Please sign in to comment.