This repository has no description
1name: Checks
2
3on:
4 pull_request: {}
5 push: { branches: [main] }
6
7jobs:
8 build:
9 name: Build
10 runs-on: ubuntu-latest
11 steps:
12 - uses: actions/checkout@v6
13 - uses: Swatinem/rust-cache@v2
14 with: { shared-key: build }
15 - run: cargo build --locked --workspace
16
17 benchmark:
18 needs: build
19 name: Benchmark
20 runs-on: ubuntu-latest
21
22 concurrency:
23 group: checks-${{ github.ref }}
24 cancel-in-progress: true
25
26 steps:
27 - uses: actions/checkout@v6
28 - name: Install FFMpeg
29 uses: FedericoCarboni/setup-ffmpeg@v3
30 - uses: Swatinem/rust-cache@v2
31 with:
32 shared-key: build
33 - uses: extractions/setup-just@v3
34 - uses: carlosperate/download-file-action@v2
35 with:
36 file-url: "https://gwennlbh.github.io/shapemaker/timings.csv"
37 file-name: results-main.csv
38 - run: just timings results-main.csv
39 - id: video
40 uses: actions/upload-artifact@v6
41 with:
42 name: output-video
43 path: out.mp4
44 if-no-files-found: error
45 compression-level: 0
46 overwrite: true
47 - id: results_csv
48 uses: juliangruber/read-file-action@v1
49 with: { path: ./results.csv }
50 - id: results_table
51 uses: petems/csv-to-md-table-action@master
52 with: { csvinput: "${{ steps.results_csv.outputs.content }}" }
53 - name: Comment on PR
54 if: github.event_name == 'pull_request'
55 # create or update a comment on the PR with the results
56 uses: edumserrano/find-create-or-update-comment@v3
57 with:
58 issue-number: ${{ github.event.pull_request.number }}
59 edit-mode: replace
60 body-includes: <!-- PERF TIMING RESULTS COMMENT -->
61 body: |
62 <!-- PERF TIMING RESULTS COMMENT -->
63 ### Performance Timings
64
65 ${{ steps.results_table.outputs.markdown-table }}
66
67 ### Resulting video
68
69 ${{ steps.video.outputs.artifact-url }}
70
71 check:
72 name: Lint
73 runs-on: ubuntu-latest
74 steps:
75 - uses: actions/checkout@v6
76 - name: Install FFMpeg
77 uses: FedericoCarboni/setup-ffmpeg@v3
78 - uses: Swatinem/rust-cache@v2
79 with: { shared-key: check }
80 - run: cargo check --locked --workspace
81 - run: cargo check --locked --no-default-features --features web
82
83 test:
84 needs: build
85 name: Test
86 runs-on: ubuntu-latest
87 steps:
88 - uses: actions/checkout@v6
89 - name: Install FFMpeg
90 uses: FedericoCarboni/setup-ffmpeg@v3
91 - uses: Swatinem/rust-cache@v2
92 with: { shared-key: build }
93 - run: cargo test --workspace
94
95 video-baseline-update:
96 if: github.event_name == 'push'
97 needs: build
98 name: Update baseline test video
99 runs-on: ubuntu-latest
100 concurrency:
101 group: video-test-update-baseline-${{ github.ref_name }}
102 cancel-in-progress: true
103 permissions:
104 contents: write
105 defaults:
106 run:
107 working-directory: ./examples/schedule-hell
108 steps:
109 - uses: actions/checkout@v6
110 with:
111 ssh-key: ${{ secrets.AUTOCOMMIT_KEY }}
112 - name: Install FFMpeg
113 uses: FedericoCarboni/setup-ffmpeg@v3
114 - name: Install VMAF
115 uses: ethanjli/cached-download-action@v0.1.3
116 with:
117 url: https://github.com/Netflix/vmaf/releases/download/v3.0.0/vmaf
118 destination: /usr/local/bin/vmaf
119 - run: chmod +x /usr/local/bin/vmaf
120 - uses: Swatinem/rust-cache@v2
121 with:
122 shared-key: build
123 - run: mv baseline.mp4 old-baseline.mp4
124 - run: cargo run -- --duration 10 baseline.mp4
125 - name: Convert to yuv4mpeg
126 run: |
127 for f in $files; do
128 ffmpeg -i $f -f yuv4mpegpipe -y $(basename $f .mp4).y4m
129 done
130 env:
131 files: old-baseline.mp4 baseline.mp4
132 - name: Run VMAF
133 run: vmaf --json --output comparison.json
134 --reference old-baseline.y4m
135 --distorted baseline.y4m
136 - name: Judge score
137 id: results
138 run: |
139 score=$(jq .pooled_metrics.vmaf.mean comparison.json)
140
141 if (( $(echo "$score < 95" | bc -l) )); then
142 conclusion=changed
143 else
144 conclusion=unchanged
145 fi
146
147 echo "score=$score" >> $GITHUB_OUTPUT
148 echo "conclusion=$conclusion" >> $GITHUB_OUTPUT
149
150 - if: steps.results.outputs.conclusion == 'changed'
151 name: Commit changes
152 uses: stefanzweifel/git-auto-commit-action@v7
153 with:
154 commit_message: ✅ Update video test baseline
155 file_pattern: examples/schedule-hell/baseline.mp4
156
157 video:
158 if: github.event_name == 'pull_request'
159 needs: build
160 name: Video
161 runs-on: ubuntu-latest
162 permissions:
163 checks: write
164 contents: read
165 concurrency:
166 group: video-test-${{ github.ref_name }}
167 cancel-in-progress: true
168 defaults:
169 run:
170 working-directory: ./examples/schedule-hell
171 steps:
172 - uses: actions/checkout@v6
173 - name: Install FFMpeg
174 uses: FedericoCarboni/setup-ffmpeg@v3
175 - name: Install VMAF
176 uses: ethanjli/cached-download-action@v0.1.3
177 with:
178 url: https://github.com/Netflix/vmaf/releases/download/v3.0.0/vmaf
179 destination: /usr/local/bin/vmaf
180 - run: chmod +x /usr/local/bin/vmaf
181 - uses: Swatinem/rust-cache@v2
182 with:
183 shared-key: build
184 - uses: extractions/setup-just@v3
185 - run: cargo run --locked -- --duration 10 result.mp4
186 - name: Convert to yuv4mpeg
187 run: |
188 for f in $files; do
189 ffmpeg -i $f -f yuv4mpegpipe -y $(basename $f .mp4).y4m
190 done
191 env:
192 files: baseline.mp4 result.mp4
193
194 - name: Compare with VMAF
195 run: vmaf --json
196 --output comparison.json
197 --reference baseline.y4m
198 --distorted result.y4m
199
200 - name: Judge score
201 id: results
202 run: |
203 score=$(jq .pooled_metrics.vmaf.mean comparison.json)
204
205 if (( $(echo "$score < 95" | bc -l) )); then
206 conclusion=failure
207 comparison_display="$score < 95"
208 else
209 conclusion=success
210 comparison_display="$score ≥ 95"
211 fi
212
213 echo "score=$score" >> $GITHUB_OUTPUT
214 echo "conclusion=$conclusion" >> $GITHUB_OUTPUT
215 echo "comparison_display=$comparison_display" >> $GITHUB_OUTPUT
216
217 - name: Upload comparison artifacts
218 uses: actions/upload-artifact@v6
219 id: artifacts
220 with:
221 path: |
222 examples/schedule-hell/comparison.json
223 examples/schedule-hell/baseline.mp4
224 examples/schedule-hell/result.mp4
225
226 - uses: LouisBrunner/checks-action@v2
227 with:
228 name: Compare to baseline test video
229 token: ${{ secrets.GITHUB_TOKEN }}
230 conclusion: ${{ steps.results.outputs.conclusion }}
231 output: |
232 {
233 "title": "VMAF Score is ${{ steps.results.outputs.comparison_display }}",
234 "summary": "Artifacts available at ${{ steps.artifacts.outputs.artifact-url }}"
235 }
236
237 - name: Fail if score too low
238 if: steps.results.outputs.conclusion == 'failure'
239 run: exit 1