-
Notifications
You must be signed in to change notification settings - Fork 0
161 lines (157 loc) · 4.64 KB
/
ci.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
name: CI
on:
push:
branches: [ master ]
tags:
- "v?[0-9]+.[0-9]+.[0-9]+*"
paths:
- '.github/**'
- '**.rs'
- 'Cargo.*'
- 'docker-compose.yml'
pull_request:
branches: [ master ]
env:
CARGO_TERM_COLOR: always
jobs:
test:
name: Test
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- name: Start services
run: docker compose up -d
- name: Download example data
run: docker compose run --rm get-data
- name: Cache rust build
uses: Swatinem/rust-cache@v2
- name: Install cargo-llvm-cov
uses: taiki-e/install-action@cargo-llvm-cov
- name: Compile test binary
run: |
source <(cargo llvm-cov show-env --export-prefix)
cargo test --no-run --locked
- name: Run tests
run: cargo llvm-cov test --locked --codecov --output-path codecov.json
- name: Print service logs
if: failure()
run: docker compose logs
- name: Upload coverage to Codecov
if: always()
uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: codecov.json
fail_ci_if_error: true
build-rust:
name: Build Rust binary
runs-on: ubuntu-24.04
needs: [ test ]
strategy:
matrix:
target:
- aarch64-unknown-linux-musl
- x86_64-unknown-linux-musl
steps:
- uses: actions/checkout@v4
- name: Cache rust build
uses: Swatinem/rust-cache@v2
- name: Build
uses: houseabsolute/actions-rust-cross@ad283b2fc65ad1f3a04fb8bf8b2b829aad4a9318
with:
target: ${{ matrix.target }}
command: build
args: --release --locked
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: 'build__${{ matrix.target }}'
path: 'target/${{ matrix.target }}/release/oxidicom'
if-no-files-found: 'error'
build-docker:
name: Build container image
runs-on: ubuntu-24.04
needs: [ build-rust ]
# if: github.event_name == 'push'
steps:
- name: Download x86_64 binary
uses: actions/download-artifact@v4
- name: Print out all files
run: find -type f
- name: Move binaries and mark executable
run: |
mkdir -vp dist/linux/amd64 dist/linux/arm64
mv -v build__x86_64-unknown-linux-musl/oxidicom dist/linux/amd64/oxidicom
mv -v build__aarch64-unknown-linux-musl/oxidicom dist/linux/arm64/oxidicom
chmod -v 555 dist/linux/{amd64,arm64}/oxidicom
- name: Create Dockerfile
run: |
cat > Dockerfile << EOF
# syntax=docker/dockerfile:1
FROM scratch
ARG TARGETPLATFORM
COPY ./dist/\$TARGETPLATFORM/oxidicom /oxidicom
CMD ["/oxidicom"]
EOF
- uses: docker/metadata-action@v5
id: meta
with:
images: |
docker.io/fnndsc/oxidicom
ghcr.io/fnndsc/oxidicom
tags: |
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=raw,value=latest,enable={{is_default_branch}}
- uses: docker/setup-qemu-action@v3
- uses: docker/setup-buildx-action@v3
- name: Login to DockerHub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v6
with:
context: .
push: true
file: ./Dockerfile
platforms: linux/amd64,linux/arm64
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
# Re-reun tests many times to detect race conditions.
# https://github.com/FNNDSC/oxidicom/issues/4
retest:
name: Rerun tests many times
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- name: Start services
run: docker compose up -d
- name: Download example data
run: docker compose run --rm get-data
- name: Cache rust build
uses: Swatinem/rust-cache@v2
- name: Compile test binary
run: cargo test --no-run --locked
- name: Run tests
run: |
set +e
for i in {1..20}; do
cargo test > log
rc=$?
if [ "$rc" != '0' ]; then
cat log
exit "$rc"
fi
done