forked from vieter-v/vieter
				
			docs: removed an outdated page
							parent
							
								
									bb4406404d
								
							
						
					
					
						commit
						4635127ba2
					
				|  | @ -1,3 +0,0 @@ | ||||||
| --- |  | ||||||
| weight: 100 |  | ||||||
| --- |  | ||||||
|  | @ -1,81 +0,0 @@ | ||||||
| # Builds In-depth |  | ||||||
| 
 |  | ||||||
| For those interested, this page describes how the build system works |  | ||||||
| internally. |  | ||||||
| 
 |  | ||||||
| ## Builder image |  | ||||||
| 
 |  | ||||||
| Every cron daemon perodically creates a builder image that is then used as a |  | ||||||
| base for all builds. This is done to prevent build containers having to pull |  | ||||||
| down a bunch of updates when they update their system. |  | ||||||
| 
 |  | ||||||
| The build container is created by running the following commands inside a |  | ||||||
| container started from the image defined in `base_image`: |  | ||||||
| 
 |  | ||||||
| ```sh |  | ||||||
| # Update repos & install required packages |  | ||||||
| pacman -Syu --needed --noconfirm base-devel git |  | ||||||
| # Add a non-root user to run makepkg |  | ||||||
| groupadd -g 1000 builder |  | ||||||
| useradd -mg builder builder |  | ||||||
| # Make sure they can use sudo without a password |  | ||||||
| echo 'builder ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers |  | ||||||
| # Create the directory for the builds & make it writeable for the |  | ||||||
| # build user |  | ||||||
| mkdir /build |  | ||||||
| chown -R builder:builder /build |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| This script updates the packages to their latest versions & creates a non-root |  | ||||||
| user to use when running `makepkg`. |  | ||||||
| 
 |  | ||||||
| This script is base64-encoded & passed to the container as an environment |  | ||||||
| variable. The container's entrypoint is set to `/bin/sh -c` & its command |  | ||||||
| argument to `echo $BUILD_SCRIPT | base64 -d | /bin/sh -e`, with the |  | ||||||
| `BUILD_SCRIPT` environment variable containing the base64-encoded script. |  | ||||||
| 
 |  | ||||||
| Once the container exits, a new Docker image is created from it. This image is |  | ||||||
| then used as the base for any builds. |  | ||||||
| 
 |  | ||||||
| ## Running builds |  | ||||||
| 
 |  | ||||||
| Each build has its own Docker container, using the builder image as its base. |  | ||||||
| The same base64-based technique as above is used, just with a different script. |  | ||||||
| To make the build logs more clear, each command is appended by an echo command |  | ||||||
| printing the next command to stdout. |  | ||||||
| 
 |  | ||||||
| Given the Git repository URL is `https://examplerepo.com` with branch `main`, |  | ||||||
| the URL of the Vieter server is `https://example.com` and `vieter` is the |  | ||||||
| repository we wish to publish to, we get the following script: |  | ||||||
| 
 |  | ||||||
| ```sh |  | ||||||
| echo -e '+ echo -e '\''[vieter]\\nServer = https://example.com/$repo/$arch\\nSigLevel = Optional'\'' >> /etc/pacman.conf' |  | ||||||
| echo -e '[vieter]\nServer = https://example.com/$repo/$arch\nSigLevel = Optional' >> /etc/pacman.conf |  | ||||||
| echo -e '+ pacman -Syu --needed --noconfirm' |  | ||||||
| pacman -Syu --needed --noconfirm |  | ||||||
| echo -e '+ su builder' |  | ||||||
| su builder |  | ||||||
| echo -e '+ git clone --single-branch --depth 1 --branch main https://examplerepo.com repo' |  | ||||||
| git clone --single-branch --depth 1 --branch main https://examplerepo.com repo |  | ||||||
| echo -e '+ cd repo' |  | ||||||
| cd repo |  | ||||||
| echo -e '+ makepkg --nobuild --syncdeps --needed --noconfirm' |  | ||||||
| makepkg --nobuild --syncdeps --needed --noconfirm |  | ||||||
| echo -e '+ source PKGBUILD' |  | ||||||
| source PKGBUILD |  | ||||||
| echo -e '+ curl -s --head --fail https://example.com/vieter/x86_64/$pkgname-$pkgver-$pkgrel && exit 0' |  | ||||||
| curl -s --head --fail https://example.com/vieter/x86_64/$pkgname-$pkgver-$pkgrel && exit 0 |  | ||||||
| echo -e '+ [ "$(id -u)" == 0 ] && exit 0' |  | ||||||
| [ "$(id -u)" == 0 ] && exit 0 |  | ||||||
| echo -e '+ MAKEFLAGS="-j$(nproc)" makepkg -s --noconfirm --needed && for pkg in $(ls -1 *.pkg*); do curl -XPOST -T "$pkg" -H "X-API-KEY: $API_KEY" https://example.com/vieter/publish; done' |  | ||||||
| MAKEFLAGS="-j$(nproc)" makepkg -s --noconfirm --needed && for pkg in $(ls -1 *.pkg*); do curl -XPOST -T "$pkg" -H "X-API-KEY: $API_KEY" https://example.com/vieter/publish; done |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| This script: |  | ||||||
| 
 |  | ||||||
| 1. Adds the target repository as a repository in the build container |  | ||||||
| 2. Updates mirrors & packages |  | ||||||
| 3. Clones the Git repository |  | ||||||
| 4. Runs `makepkg` without building to calculate `pkgver` |  | ||||||
| 5. Checks whether the package version is already present on the server |  | ||||||
| 6. If not, run `makepkg` & publish any generated package archives to the server |  | ||||||
|  | @ -13,7 +13,7 @@ pub: | ||||||
| 	default_arch         string | 	default_arch         string | ||||||
| 	global_schedule      string = '0 3' | 	global_schedule      string = '0 3' | ||||||
| 	base_image           string = 'archlinux:base-devel' | 	base_image           string = 'archlinux:base-devel' | ||||||
| 	max_log_age          int [empty_default] | 	max_log_age          int    [empty_default] | ||||||
| 	log_removal_schedule string = '0 0' | 	log_removal_schedule string = '0 0' | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue