nixcon2024/tex/main.tex
2024-10-24 09:19:38 +02:00

400 lines
11 KiB
TeX

\documentclass{beamer}
\usepackage{graphicx}
\usepackage[outputdir=../aux/tex]{minted}
\usepackage[showboxes,absolute,overlay]{textpos}
\usepackage{tikz}
\usepackage{svg}
\usetikzlibrary{calc,tikzmark}
%% \setbeameroption{show notes on second screen=right}
\setbeameroption{show notes}
\addtobeamertemplate{note page}{}{\thispdfpagelabel{notes:\insertframenumber}}
\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
\note[item]{some might say, we have no ...}
\note[item]{we want something...}
\end{frame}
\begin{frame}
\beamercoverdeemph{}
\centering
\begin{itemize}
\item<1>{easy to deploy}
\item<2>{works out of the box}
\item<3>{natively integrates with GitHub and other forges}
\item<4>{not a from-scratch project, something that works NOW}
\end{itemize}
\note[item]<4>{one temptation is to write everything from scratch. Multiple projects tried this and none of them succeeded. We needed something we can make work today, and iterate over.}
\end{frame}
\begin{frame}{Hydra}
\beamercoverdeemph{}
\centering
\begin{itemize}
\item<2>{heavy-weight, keeps track of every store path}
\item<3>{\texttt{nixpkgs} scale CI for \texttt{nixpkgs} scale problems}
\item<4,5>{doesn't integrate well with GitHub/Gitea\only<6>{, especially PRs}}
\end{itemize}
\note[item]{take Hydra, (then flip)}
\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}
\note[item]{take Actions, (then flip)}
\end{frame}
\begin{frame}
\includegraphics[width=1.0\textwidth]{../figures/how-standards-prolifirate.png}
\note[item]{so we wrote one}
\end{frame}
\begin{frame}[fragile]
\begin{center}
\verb|buildbot-nix|
\end{center}
\note[item]{called buildbot-nix}
\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?}
\note[item]{what's 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}
\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}
\note[item]{used by Python for example}
\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>
\pgfdeclareimage[width=12.5em]{nix-community}{../figures/nix-community.png}
\pgfdeclareimage[width=12.5em]{nix-ngi-0}{../figures/nix-ngi-0.png}
\begin{tikzpicture}[overlay]
\fill[white, opacity=0.7] (-0.2\paperwidth,1.0\paperheight) rectangle (1.0\paperwidth, -0.2\paperheight);
\draw (0.225\textwidth,0.175\textheight) node {\pgfuseimage{nix-community}};
\draw (0.775\textwidth,0.175\textheight) node {\pgfuseimage{nix-ngi-0}};
\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)}
\note[item]{what if you had a flake, like that, and wanted to run CI on it? well, run all the checks in CI!}
\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
\texttt{buildbot-nix} 1.0 is already here, \\
and is powering \texttt{nix-community} and \texttt{nix-ngi-0}
\end{frame}
\begin{frame}
\centering
Get your very own today! (or at the hackday)
\end{frame}
\begin{frame}
\centering
\includegraphics[width=0.35\textwidth]{../figures/redalder-qr.png}\hspace{1.5em}%
\includegraphics[width=0.35\textwidth]{../figures/numtide-qr.png}
Questions?
\includegraphics[width=0.35\textwidth]{../figures/upstream-qr.png}\hspace{1.5em}%
\includegraphics[width=0.35\textwidth]{../figures/buildbot-nix-qr.png}
\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