Before Jonas suggestions

This commit is contained in:
magic_rb 2024-10-23 22:58:25 +02:00
parent 3364e2cdfa
commit fb46a5dc67
23 changed files with 881 additions and 0 deletions

1
.envrc Normal file
View file

@ -0,0 +1 @@
use flake

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
/.direnv
result*

17
Makefile Normal file
View file

@ -0,0 +1,17 @@
OUT_DIR ?= ../out/
AUX_DIR ?= ../aux/
TOP_LIB ?= ../latex/mk/
PROJECTS := tex
DEPS_EXTS := tex png pdf
EXTRA_LATEXMK_ARGS=-pdfxelatex="xelatex --shell-escape %O %S"
.PHONY: all
all: $(PROJECTS)
clean:
rm -r out aux
include $(TOP_LIB)/build_project.mk
$(eval $(call build_projects,$(PROJECTS)))

BIN
figures/blender.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
figures/buildbot-view.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

BIN
figures/forgejo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

BIN
figures/gentoo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

24
figures/gentoo.svg Normal file
View file

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="594.7" height="622.5" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Gentoo Linux logo (matte)</title>
<defs>
<linearGradient id="vlpa">
<stop style="stop-color:#fff" offset="0"/>
<stop style="stop-color:#fff" offset=".3421"/>
<stop style="stop-color:#bebdf3" offset=".52"/>
<stop style="stop-color:#8f82f9" offset=".7541"/>
<stop style="stop-color:#9f99c7" offset=".8711"/>
<stop style="stop-color:#524c76" offset="1"/>
</linearGradient>
<linearGradient id="vlpe" x1="464" x2="368.6" y1="697.4" y2="269.7" gradientTransform="matrix(1.237 0 0 1.237 -161.1 -377.3)" gradientUnits="userSpaceOnUse" xlink:href="#vlpa"/>
<linearGradient id="vlpd" x1="783.9" x2="1100" y1="-313.5" y2="1341" gradientTransform="matrix(1.237 0 0 1.237 -1037 -1010)" gradientUnits="userSpaceOnUse" xlink:href="#vlpa"/>
<radialGradient id="vlpc" cx="332.7" cy="590.6" r="218" gradientTransform="matrix(-.06604 4.19 -3.574 -.05627 2168 -1171)" gradientUnits="userSpaceOnUse" xlink:href="#vlpa"/>
<radialGradient id="vlpb" cx="49.53" cy="320.1" r="31.95" gradientTransform="matrix(3.287 0 0 2.52 111.7 -642.7)" gradientUnits="userSpaceOnUse" xlink:href="#vlpa"/>
</defs>
<g transform="translate(-25.69 -25.52)">
<path d="m25.76 521.9c0.06818-26.26 22.39-62.92 54.11-96.23 21.2-22.26 42.73-41.8 89.66-81.81-32.46-17.81-82.95-39.3-108.3-67.45-9.374-10.41-26.36-34.01-23.07-65.53 6.716-64.25 86.01-161.7 198.7-182.4 37.5-6.859 80.56-1.908 116 14.02 111.2 49.98 247.1 174.2 263.9 234.8 5.888 21.34 4.757 55.36-5.395 74.32-12.58 23.5-56.14 71.22-115.7 120.5-93.5 77.27-224.5 160.2-322.4 174.2-31.61 4.511-63.91-0.194-86.57-12.98-35.46-20.01-47.23-46.72-51.37-54.73-11-21.29-9.637-48.27-9.613-56.73zm263.1-295c1.207-14.89 59.59-0.06577 55.9 11.73-3.892 12.44-57.29 5.355-55.9-11.73z" style="fill-rule:evenodd;fill:url(#vlpd)"/>
<path d="m201.1 319.3c-30.72 25.94-51.15 43.43-76.76 66.84-61.68 56.37-103.6 99.28-81.98 157.9 24.92 67.66 79.56 64.23 143.6 51.65 165.1-32.57 436.6-241.3 422.8-318.3-11.2-62.37-162.9-186.4-252.6-230.5-28.05-13.79-60.38-20.91-92.81-19.39-123.5 5.828-219.9 118.2-215 179.2 4.792 59.26 154.6 110.9 152.8 112.7zm-18.53-206.9c-37.15 41.34-13.4 121.3 48.21 164.9 72.1 51.01 188.8 60.24 212.1 20.91 43.34-73.37-3.98-151-74.61-185.6-69.8-34.2-162.5-26.01-185.7-0.245z" style="fill-rule:evenodd;fill:url(#vlpe)"/>
<path d="m309.3 275.6c52.16 7.25 97.12-13.64 104.1-65.14 5.355-39.23-54.69-82.1-90.79-91.99-30.15-8.256-95.6 2.36-100 59.38-4.587 59.27 56.24 93.53 86.65 97.75zm-25.54-98.58c-34.28 53.1 49.77 69.43 62.64 59.75 55.48-41.75-47.54-83.14-62.64-59.75z" style="fill-rule:evenodd;fill:url(#vlpb)"/>
<path d="m253.4 41.57c-60.63 6.39-72.25 14.19-127.2 55.75-18.41 13.93-52.29 47.82-60.98 88.03-3.307 15.31 0.6019 28.53 11.63 37.8 35.31 29.69 94.42 53.77 142.9 77.06 14.2 6.82 4.799 19.19-18.1 39.01-57.79 50.03-135.9 110.9-141.4 157.3-2.57 21.87 4.916 51.58 31.46 66.79 31.01 17.76 95.37 6.17 138.4-9.835 62.81-23.39 145.3-75 210.8-125.7 68.11-52.76 131.4-119.8 134.6-130.7 3.847-13.42 3.463-25.82-3.96-40.07-11.66-22.38-27.24-39.01-43.98-57.63-44.9-47.34-92.41-88.93-149.3-120.8-41.05-23.02-77.16-42.03-124.9-37zm89.07 106.1c43.81 21.18 88.79 76.81-0.3904 108.8-24.25 8.706-101.2-21.38-98.8-62.44 3.433-60.66 45.71-72.24 99.19-46.38z" style="fill-rule:evenodd;fill:url(#vlpc)"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
figures/gh-status-ex01.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

BIN
figures/github.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

3
figures/github.svg Normal file
View file

@ -0,0 +1,3 @@
<svg height="32" aria-hidden="true" viewBox="0 0 24 24" version="1.1" width="32" data-view-component="true" class="octicon octicon-mark-github">
<path d="M12.5.75C6.146.75 1 5.896 1 12.25c0 5.089 3.292 9.387 7.863 10.91.575.101.79-.244.79-.546 0-.273-.014-1.178-.014-2.142-2.889.532-3.636-.704-3.866-1.35-.13-.331-.69-1.352-1.18-1.625-.402-.216-.977-.748-.014-.762.906-.014 1.553.834 1.769 1.179 1.035 1.74 2.688 1.25 3.349.948.1-.747.402-1.25.733-1.538-2.559-.287-5.232-1.279-5.232-5.678 0-1.25.445-2.285 1.178-3.09-.115-.288-.517-1.467.115-3.048 0 0 .963-.302 3.163 1.179.92-.259 1.897-.388 2.875-.388.977 0 1.955.13 2.875.388 2.2-1.495 3.162-1.179 3.162-1.179.633 1.581.23 2.76.115 3.048.733.805 1.179 1.825 1.179 3.09 0 4.413-2.688 5.39-5.247 5.678.417.36.776 1.05.776 2.128 0 1.538-.014 2.774-.014 3.162 0 .302.216.662.79.547C20.709 21.637 24 17.324 24 12.25 24 5.896 18.854.75 12.5.75Z"></path>
</svg>

After

Width:  |  Height:  |  Size: 911 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

BIN
figures/llvm.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

BIN
figures/nix-community.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

85
figures/nix-community.svg Normal file
View file

@ -0,0 +1,85 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="136.68491mm"
height="136.68491mm"
viewBox="0 0 484.31659 484.31659"
id="svg2"
version="1.1"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="nix-community-logo.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.34760742"
inkscape:cx="-173.38017"
inkscape:cy="186.45699"
inkscape:document-units="px"
inkscape:current-layer="svg2"
showgrid="false"
inkscape:window-width="2560"
inkscape:window-height="1080"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-global="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" />
<g
inkscape:label="print-logo"
inkscape:groupmode="layer"
id="layer1"
style="display:inline"
sodipodi:insensitive="true"
transform="translate(-132.5822,958.04022)">
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5277c3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 309.40365,-710.2521 122.19683,211.6751 -56.15706,0.5268 -32.6236,-56.8692 -32.85645,56.5653 -27.90237,-0.011 -14.29086,-24.6896 46.81047,-80.4902 -33.22946,-57.8256 z"
id="path4861"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccc" />
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#7ebae4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 353.50926,-797.4433 -122.21756,211.6631 -28.53477,-48.37 32.93839,-56.6875 -65.41521,-0.1719 -13.9414,-24.1698 14.23637,-24.721 93.11177,0.2939 33.46371,-57.6903 z"
id="use4863"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccc" />
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#7ebae4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 362.88537,-628.243 244.41439,0.012 -27.62229,48.8968 -65.56199,-0.1817 32.55876,56.7371 -13.96098,24.1585 -28.52722,0.032 -46.3013,-80.7841 -66.69317,-0.1353 z"
id="use4865"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccc" />
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#7ebae4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 505.14318,-720.9886 -122.19683,-211.6751 56.15706,-0.5268 32.6236,56.8692 32.85645,-56.5653 27.90237,0.011 14.29086,24.6896 -46.81047,80.4902 33.22946,57.8256 z"
id="use4867"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccc" />
<path
sodipodi:nodetypes="cccccccccc"
inkscape:connector-curvature="0"
id="path4873"
d="m 309.40365,-710.2521 122.19683,211.6751 -56.15706,0.5268 -32.6236,-56.8692 -32.85645,56.5653 -27.90237,-0.011 -14.29086,-24.6896 46.81047,-80.4902 -33.22946,-57.8256 z"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5277c3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
<path
sodipodi:nodetypes="cccccccccc"
inkscape:connector-curvature="0"
id="use4875"
d="m 451.3364,-803.53264 -244.4144,-0.012 27.62229,-48.89685 65.56199,0.18175 -32.55875,-56.73717 13.96097,-24.15851 28.52722,-0.0315 46.3013,80.78414 66.69317,0.13524 z"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5277c3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.3 KiB

BIN
figures/openzfs-logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
figures/python-buildbot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

265
figures/python-logo.svg Normal file
View file

@ -0,0 +1,265 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
version="1.0"
id="svg2"
sodipodi:version="0.32"
inkscape:version="1.2.1 (9c6d41e410, 2022-07-14)"
sodipodi:docname="python-logo-only.svg"
width="92.070236pt"
height="101.00108pt"
inkscape:export-filename="python-logo-only.png"
inkscape:export-xdpi="232.44"
inkscape:export-ydpi="232.44"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<metadata
id="metadata371">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
inkscape:window-height="2080"
inkscape:window-width="1976"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
guidetolerance="10.0"
gridtolerance="10.0"
objecttolerance="10.0"
borderopacity="1.0"
bordercolor="#666666"
pagecolor="#ffffff"
id="base"
inkscape:zoom="2.1461642"
inkscape:cx="91.558698"
inkscape:cy="47.9926"
inkscape:window-x="1092"
inkscape:window-y="72"
inkscape:current-layer="svg2"
width="210mm"
height="40mm"
units="mm"
inkscape:showpageshadow="2"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="pt"
showgrid="false"
inkscape:window-maximized="0" />
<defs
id="defs4">
<linearGradient
id="linearGradient2795">
<stop
style="stop-color:#b8b8b8;stop-opacity:0.49803922;"
offset="0"
id="stop2797" />
<stop
style="stop-color:#7f7f7f;stop-opacity:0;"
offset="1"
id="stop2799" />
</linearGradient>
<linearGradient
id="linearGradient2787">
<stop
style="stop-color:#7f7f7f;stop-opacity:0.5;"
offset="0"
id="stop2789" />
<stop
style="stop-color:#7f7f7f;stop-opacity:0;"
offset="1"
id="stop2791" />
</linearGradient>
<linearGradient
id="linearGradient3676">
<stop
style="stop-color:#b2b2b2;stop-opacity:0.5;"
offset="0"
id="stop3678" />
<stop
style="stop-color:#b3b3b3;stop-opacity:0;"
offset="1"
id="stop3680" />
</linearGradient>
<linearGradient
id="linearGradient3236">
<stop
style="stop-color:#f4f4f4;stop-opacity:1"
offset="0"
id="stop3244" />
<stop
style="stop-color:white;stop-opacity:1"
offset="1"
id="stop3240" />
</linearGradient>
<linearGradient
id="linearGradient4671">
<stop
style="stop-color:#ffd43b;stop-opacity:1;"
offset="0"
id="stop4673" />
<stop
style="stop-color:#ffe873;stop-opacity:1"
offset="1"
id="stop4675" />
</linearGradient>
<linearGradient
id="linearGradient4689">
<stop
style="stop-color:#5a9fd4;stop-opacity:1;"
offset="0"
id="stop4691" />
<stop
style="stop-color:#306998;stop-opacity:1;"
offset="1"
id="stop4693" />
</linearGradient>
<linearGradient
x1="224.23996"
y1="144.75717"
x2="-65.308502"
y2="144.75717"
id="linearGradient2987"
xlink:href="#linearGradient4671"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(100.2702,99.61116)" />
<linearGradient
x1="172.94208"
y1="77.475983"
x2="26.670298"
y2="76.313133"
id="linearGradient2990"
xlink:href="#linearGradient4689"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(100.2702,99.61116)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4689"
id="linearGradient2587"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(100.2702,99.61116)"
x1="172.94208"
y1="77.475983"
x2="26.670298"
y2="76.313133" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4671"
id="linearGradient2589"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(100.2702,99.61116)"
x1="224.23996"
y1="144.75717"
x2="-65.308502"
y2="144.75717" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4689"
id="linearGradient2248"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(100.2702,99.61116)"
x1="172.94208"
y1="77.475983"
x2="26.670298"
y2="76.313133" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4671"
id="linearGradient2250"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(100.2702,99.61116)"
x1="224.23996"
y1="144.75717"
x2="-65.308502"
y2="144.75717" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4671"
id="linearGradient2255"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.562541,0,0,0.567972,-11.5974,-7.60954)"
x1="224.23996"
y1="144.75717"
x2="-65.308502"
y2="144.75717" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4689"
id="linearGradient2258"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.562541,0,0,0.567972,-11.5974,-7.60954)"
x1="172.94208"
y1="76.176224"
x2="26.670298"
y2="76.313133" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2795"
id="radialGradient2801"
cx="61.518883"
cy="132.28575"
fx="61.518883"
fy="132.28575"
r="29.036913"
gradientTransform="matrix(1,0,0,0.177966,0,108.7434)"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4671"
id="linearGradient1475"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.562541,0,0,0.567972,-14.99112,-11.702371)"
x1="150.96111"
y1="192.35176"
x2="112.03144"
y2="137.27299" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4689"
id="linearGradient1478"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.562541,0,0,0.567972,-14.99112,-11.702371)"
x1="26.648937"
y1="20.603781"
x2="135.66525"
y2="114.39767" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2795"
id="radialGradient1480"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.7490565e-8,-0.23994696,1.054668,3.7915457e-7,-83.7008,142.46201)"
cx="61.518883"
cy="132.28575"
fx="61.518883"
fy="132.28575"
r="29.036913" />
</defs>
<path
style="fill:url(#linearGradient1478);fill-opacity:1"
d="M 54.918785,9.1927389e-4 C 50.335132,0.02221727 45.957846,0.41313697 42.106285,1.0946693 30.760069,3.0991731 28.700036,7.2947714 28.700035,15.032169 v 10.21875 h 26.8125 v 3.40625 h -26.8125 -10.0625 c -7.792459,0 -14.6157588,4.683717 -16.7499998,13.59375 -2.46181998,10.212966 -2.57101508,16.586023 0,27.25 1.9059283,7.937852 6.4575432,13.593748 14.2499998,13.59375 h 9.21875 v -12.25 c 0,-8.849902 7.657144,-16.656248 16.75,-16.65625 h 26.78125 c 7.454951,0 13.406253,-6.138164 13.40625,-13.625 v -25.53125 c 0,-7.2663386 -6.12998,-12.7247771 -13.40625,-13.9374997 C 64.281548,0.32794397 59.502438,-0.02037903 54.918785,9.1927389e-4 Z m -14.5,8.21875012611 c 2.769547,0 5.03125,2.2986456 5.03125,5.1249996 -2e-6,2.816336 -2.261703,5.09375 -5.03125,5.09375 -2.779476,-1e-6 -5.03125,-2.277415 -5.03125,-5.09375 -10e-7,-2.826353 2.251774,-5.1249996 5.03125,-5.1249996 z"
id="path1948" />
<path
style="fill:url(#linearGradient1475);fill-opacity:1"
d="m 85.637535,28.657169 v 11.90625 c 0,9.230755 -7.825895,16.999999 -16.75,17 h -26.78125 c -7.335833,0 -13.406249,6.278483 -13.40625,13.625 v 25.531247 c 0,7.266344 6.318588,11.540324 13.40625,13.625004 8.487331,2.49561 16.626237,2.94663 26.78125,0 6.750155,-1.95439 13.406253,-5.88761 13.40625,-13.625004 V 86.500919 h -26.78125 v -3.40625 h 26.78125 13.406254 c 7.792461,0 10.696251,-5.435408 13.406241,-13.59375 2.79933,-8.398886 2.68022,-16.475776 0,-27.25 -1.92578,-7.757441 -5.60387,-13.59375 -13.406241,-13.59375 z m -15.0625,64.65625 c 2.779478,3e-6 5.03125,2.277417 5.03125,5.093747 -2e-6,2.826354 -2.251775,5.125004 -5.03125,5.125004 -2.76955,0 -5.03125,-2.29865 -5.03125,-5.125004 2e-6,-2.81633 2.261697,-5.093747 5.03125,-5.093747 z"
id="path1950" />
<ellipse
style="opacity:0.44382;fill:url(#radialGradient1480);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:15.4174;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path1894"
cx="55.816761"
cy="127.70079"
rx="35.930977"
ry="6.9673119" />
</svg>

After

Width:  |  Height:  |  Size: 9.4 KiB

BIN
figures/python.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

93
flake.lock Normal file
View file

@ -0,0 +1,93 @@
{
"nodes": {
"flake-parts": {
"inputs": {
"nixpkgs-lib": "nixpkgs-lib"
},
"locked": {
"lastModified": 1727826117,
"narHash": "sha256-K5ZLCyfO/Zj9mPFldf3iwS6oZStJcU4tSpiXTMYaaL0=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "3d04084d54bedc3d6b8b736c70ef449225c361b1",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "flake-parts",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1728909085,
"narHash": "sha256-WLxED18lodtQiayIPDE5zwAfkPJSjHJ35UhZ8h3cJUg=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "c0b1da36f7c34a7146501f684e9ebdf15d2bebf8",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-24.05",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-lib": {
"locked": {
"lastModified": 1727825735,
"narHash": "sha256-0xHYkMkeLVQAMa7gvkddbPqpxph+hDzdu1XdGPJR+Os=",
"type": "tarball",
"url": "https://github.com/NixOS/nixpkgs/archive/fb192fec7cc7a4c26d51779e9bab07ce6fa5597a.tar.gz"
},
"original": {
"type": "tarball",
"url": "https://github.com/NixOS/nixpkgs/archive/fb192fec7cc7a4c26d51779e9bab07ce6fa5597a.tar.gz"
}
},
"nixpkgs_2": {
"locked": {
"lastModified": 1726871744,
"narHash": "sha256-V5LpfdHyQkUF7RfOaDPrZDP+oqz88lTJrMT1+stXNwo=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "a1d92660c6b3b7c26fb883500a80ea9d33321be2",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"flake-parts": "flake-parts",
"nixpkgs": "nixpkgs",
"treefmt-nix": "treefmt-nix"
}
},
"treefmt-nix": {
"inputs": {
"nixpkgs": "nixpkgs_2"
},
"locked": {
"lastModified": 1729077719,
"narHash": "sha256-zayHqZO9gA1U85c4CPvVSnLV8/cBgc2yVrSKWaKeBUs=",
"owner": "numtide",
"repo": "treefmt-nix",
"rev": "5307ba60125bb024d7e52d71d582eafd511f3fee",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "treefmt-nix",
"type": "github"
}
}
},
"root": "root",
"version": 7
}

34
flake.nix Normal file
View file

@ -0,0 +1,34 @@
{
inputs.nixpkgs.url = "github:NixOS/nixpkgs?ref=nixos-24.05";
inputs.flake-parts.url = "github:hercules-ci/flake-parts";
inputs.treefmt-nix.url = "github:numtide/treefmt-nix";
outputs =
{
self,
nixpkgs,
flake-parts,
...
}@inputs:
flake-parts.lib.mkFlake { inherit inputs; } {
imports = [ inputs.treefmt-nix.flakeModule ];
systems = [ "x86_64-linux" ];
perSystem =
{ config, pkgs, ... }:
{
devShells.default = pkgs.mkShell {
buildInputs = with pkgs; [
nixfmt-rfc-style
texliveFull
python3.pkgs.pygments
];
};
treefmt = {
projectRootFile = "flake.nix";
programs.nixfmt-rfc-style.enable = true;
programs.latexindent.enable = true;
};
};
};
}

357
tex/main.tex Normal file
View file

@ -0,0 +1,357 @@
\documentclass{beamer}
\usepackage{graphicx}
\usepackage[outputdir=../aux/tex]{minted}
\usepackage[showboxes,absolute,overlay]{textpos}
\usepackage{tikz}
\usepackage{svg}
\usetikzlibrary{calc,tikzmark}
\title{buildbot-nix}
\author{Richard Brežák}
\date{2024}
\usetheme[progressbar=frametitle]{moloch}
\newcommand\beamercoverdeemph{%
\setbeamercovered{again covered={\opaqueness<1->{30}}}%
}
\begin{document}
\frame{\titlepage}
\begin{frame}
\centering
There is no good open-source Nix CI/CD
\end{frame}
\begin{frame}{Hydra}
\beamercoverdeemph{}
\centering
\begin{itemize}
\item<2>{heavy-weight, keeps track of every store path}
\item<3>{lots of legacy Perl}
\item<4>{hard to deploy, administer and hack on}
\item<5>{\texttt{nixpkgs} scale CI for \texttt{nixpkgs} scale problems}
\item<6,7>{doesn't integrate well with GitHub/Gitea\only<7>{, especially PRs}}
\end{itemize}
\end{frame}
\begin{frame}
\begin{columns}[c]
\begin{column}{0.49\textwidth}
\centering
I attempted to run Hydra
\end{column}
\begin{column}{0.02\textwidth}
\rule{.1mm}{0.7\textheight}
\end{column}
\begin{column}{0.49\textwidth}
\centering
I've succeeded and I'm still running it
\end{column}
\end{columns}
\end{frame}
\begin{frame}{GitHub/Gitea Actions}
\beamercoverdeemph{}
\centering
\begin{itemize}
\item<2>{not Nix native}
\item<3>{cannot use the build sandbox generally}
\item<4>{caching is hard to get right or wasteful}
\item<5>{build logs become a jumbled mess \textit{OR} may repeat builds}
\item<6>{if done naively, you will get an OOM}
\end{itemize}
\end{frame}
\begin{frame}
\includegraphics[width=1.0\textwidth]{../figures/how-standards-prolifirate.png}
\end{frame}
\begin{frame}[fragile]
\begin{center}
\verb|buildbot-nix|
\end{center}
\end{frame}
\begin{frame}
\begin{columns}[c]
\begin{column}{0.49\textwidth}
\centering
I know of buildbot-nix
\end{column}
\begin{column}{0.02\textwidth}
\rule{.1mm}{0.7\textheight}
\end{column}
\begin{column}{0.49\textwidth}
\centering
I've never heard of it
\end{column}
\end{columns}
\end{frame}
\begin{frame}{buildbot?}
\begin{columns}[c]
\begin{column}{0.5\textwidth}
\beamercoverdeemph{}
\begin{itemize}
\item<1> CI/CD framework
\item<2> written in Python
\item<3> used by many projects
\end{itemize}
\vspace{1.0em}
\uncover<4->{essentially...} \\
\vspace{1.0em}
\uncover<5->{Jenkins but in Python}
\end{column}
\begin{column}{0.5\textwidth}
\pgfdeclareimage[width=5em]{openzfs}{../figures/openzfs-logo.png}
\pgfdeclareimage[width=5em]{python}{../figures/python.png}
\pgfdeclareimage[width=5em]{gentoo}{../figures/gentoo.png}
\pgfdeclareimage[width=5em]{blender}{../figures/blender.png}
\pgfdeclareimage[width=5em]{llvm}{../figures/llvm.png}
\pgfdeclareimage[width=20em]{nix-community}{../figures/nix-community.png}
\begin{column}<3->{0.5\textwidth}
%% \pgfmathsetseed{2}
\begin{tikzpicture}
%% \makeatletter
%% \pgfmathdeclarefunction{rndx}{0}{
%% \pgfmathrandom{-1em, 1em} \pgfmathresult
%% }
%% \pgfmathdeclarefunction{rndy}{0}{
%% \pgfmathrandom{-1em, 1em} \pgfmathresult
%% }
%% \makeatother
%% \draw (0, 0) node {\pgftext{\includesvg[width=1em]{../figures/python-logo.svg}}};
\draw (-14em, 7em) node {\pgfuseimage{openzfs}};
\draw (-14em, -7em) node {\pgfuseimage{blender}};
\draw (-14em, 0) node {\pgfuseimage{gentoo}};
\draw (-7em, 3.5em) node {\pgfuseimage{python}};
\draw (-7em, -3.5em) node {\pgfuseimage{llvm}};
%% \draw (0, 0) node {\pgftext{\includegraphics{silver}}}};
\end{tikzpicture}
\end{column}
\end{column}
\end{columns}
\end{frame}
\begin{frame}{buildbot!}
\includegraphics[width=1.0\linewidth]{../figures/python-buildbot.png}
\end{frame}
\begin{frame}{buildbot-nix?}
\beamercoverdeemph{}
\begin{itemize}
\item<1> CI/CD for Nix
\item<2> plugin for \texttt{buildbot}
\item<3> written in Python
\item<4> can run on PRs safely -- configuration is server-side
\end{itemize}
\begin{uncoverenv}<5>
\begin{center}
\Large Aiming for smaller projects
\end{center}
\end{uncoverenv}
\begin{onlyenv}<6>
\begin{tikzpicture}[overlay]
\fill[white, opacity=0.7] (-0.2\paperwidth,1.0\paperheight) rectangle (1.0\paperwidth, -0.2\paperheight);
\draw (0.45\textwidth,0.175\textheight) node {\pgfuseimage{nix-community}};
\end{tikzpicture}
\end{onlyenv}
\end{frame}
\begin{frame}[fragile]
\begin{minted}[linenos=true,bgcolor=bg,breaklines,tabsize=2]{nix}
{
inputs = { ... };
outputs = { ... }:
{
checks.${system} = {
treefmt = treefmt...check;
packageTest = runCommand "package-test" { } "exit 1";
};
formatter.${system} = treefmt...wrapper;
};
}
\end{minted}
{\tiny (not true Nix)}
\end{frame}
\begin{frame}
\includegraphics[width=1.0\textwidth]{../figures/gh-status-ex01.png}
\begin{textblock}{2.5}(12.5,14.5)
{\footnotesize(find the bug)}
\end{textblock}
\end{frame}
\begin{frame}
\includegraphics[width=1.0\textwidth]{../figures/buildbot-view.png}
\end{frame}
\begin{frame}
\centering
How do I get this?
\end{frame}
\begin{frame}
\centering
Easily!
\end{frame}
\begin{frame}[fragile]
\newcommand<>{\circletikz}[2]{%
\begin{onlyenv}#3
\begin{tikzpicture}[overlay,remember picture]
\draw[draw = red, line width=0.3mm] let
\p1 = ($(pic cs:#1) - (pic cs:#2)$),
\p2 = ($1/2*(\x1,\y1)$)
in ($(pic cs:#1) - 1/2*(\x1, \y1) + (0, 0.25em)$) ellipse (\x2 and 1em);
\end{tikzpicture}%
\end{onlyenv}%
}
\newcommand<>{\underlinetikz}[2]{%
\begin{onlyenv}#3
\begin{tikzpicture}[overlay,remember picture]
\draw[draw = red, line width=0.3mm]
($(pic cs:#1) - (0, 0.125em)$) -- ($(pic cs:#2) - (0, 0.125em)$);
\end{tikzpicture}%
\end{onlyenv}%
}
\begin{minted}[escapeinside=||,beameroverlays,fontsize=\small,linenos=true,bgcolor=bg,breaklines,tabsize=2]{nix}
services.buildbot-nix.master = {
enable = true;
jobReportLimit = |\tikzmark{jobsS}|null|\tikzmark{jobsE}|;
domain = |\tikzmark{domainS}|"buildbot.example.org"|\tikzmark{domainE}|;
workersFile = |\tikzmark{workersS}|"/secret/workers.json"|\tikzmark{workersE}|;
admins = |\tikzmark{adminsS}|["your-nickname"]|\tikzmark{adminsE}|;
authBackend = |\tikzmark{githubS}|"github"|\tikzmark{githubE}|;
|\tikzmark{githubS}|github|\tikzmark{githubE}| = {
|\tikzmark{githubEnableS}|enable = true|\tikzmark{githubEnableE}|;
webhookSecretFile = |\tikzmark{webhookS}|"/secret/github_webhook_secret"|\tikzmark{webhookE}|;
oauthId = |\tikzmark{oauthIdS}|"..."|\tikzmark{oauthIdE}|;
oauthSecretFile = |\tikzmark{oauthSecretS}|"/secret/github_oauth_secret"|\tikzmark{oauthSecretE}|;
topic = |\tikzmark{topicS}|"build-with-buildbot"|\tikzmark{topicE}|;
authType.app = {
secretKeyFile = |\tikzmark{secretKeyS}|"/secret/github_app_private_key.pem"|\tikzmark{secretKeyE}|;
id = |\tikzmark{idS}|881425|\tikzmark{idE}|;
};
};
};
\end{minted}
\underlinetikz<2>{domainS}{domainE}
\underlinetikz<3>{githubS}{githubE}
\underlinetikz<3>{githubEnableS}{githubEnableE}
\underlinetikz<4>{workersS}{workersE}
\underlinetikz<4>{webhookS}{webhookE}
\underlinetikz<4>{oauthIdS}{oauthIdE}
\underlinetikz<4>{oauthSecretS}{oauthSecretE}
\underlinetikz<4>{secretKeyS}{secretKeyE}
\underlinetikz<4>{idS}{idE}
\underlinetikz<5>{topicS}{topicE}
\underlinetikz<5>{jobsS}{jobsE}
\end{frame}
\begin{frame}[fragile]
\begin{center}
and you have buildbot running
\end{center}
\begin{textblock}{10.0}(5.5,14.5)
{\footnotesize(after configuring \verb|services.nginx.virtualHosts|)}
\end{textblock}
\end{frame}
\begin{frame}
\centering
What are the features?
\end{frame}
\newcommand{\imagewithtitle}[2]{%
\begin{minipage}[t][1em]{1.0\linewidth}
\centering #1
\end{minipage}\\
\vspace{1.5em}
\includegraphics[width=1.0\linewidth, height=0.8\textheight, keepaspectratio]{#2}%
}
%% \begin{frame}[fragile]
%% %% \begin{columns}
%% %% \begin{column}{0.5\textwidth}
%% \centering
%% \imagewithtitle{\Large builds \texttt{.\#checks}}{../figures/buildbot-view.png}
%% %% \end{column}
%% %% \begin{column}{0.5\textwidth}
%% \centering
%% \imagewithtitle{\Large status reports}{../figures/gh-status-ex01.png}
%% %% \end{column}
%% %% \end{columns}
%% \end{frame}
\begin{frame}
\begin{columns}
\begin{column}{0.5\textwidth}
\centering
\imagewithtitle{\Large Gitea/Forgejo}{../figures/forgejo.png}
\end{column}
\begin{column}{0.5\textwidth}
\centering
\imagewithtitle{\Large GitHub}{../figures/github.png}
\end{column}
\end{columns}
\end{frame}
\begin{frame}
\centering
\imagewithtitle{\Large Cachix}{example-image-a}
\end{frame}
\begin{frame}
\centering
\imagewithtitle{\Large post build steps}{example-image-a}
\end{frame}
\begin{frame}
\centering
\imagewithtitle{\Large per-repository settings}{example-image-a}
\end{frame}
\begin{frame}
\centering
\imagewithtitle{\Large per-repository effects with secrets (soon)}{example-image-a}
\end{frame}
\begin{frame}
\centering
Questions?
\end{frame}
%% \begin{frame}
%% \centering
%% what can it do?
%% \end{frame}
%% \begin{frame}[fragile]
%% \centering
%% \verb|buildbot-nix| will evaluate \verb|#checks| for all systems
%% \end{frame}
%% \begin{frame}[fragile]
%% \centering
%% it will report evaluation failures
%% \end{frame}
%% \begin{frame}[fragile]
%% \centering
%% it will build derivations for supported systems
%% \end{frame}
\end{document}
% there is no good opensource CI
% then we built it
% why is hydra not great
% what is it we built, what does it offer
% now there is good opensource CI, check out
% call for action