├── stage ├── package-model.json ├── experimental │ ├── package-model.json │ ├── debian │ │ ├── bullseye │ │ │ └── amd64 │ │ │ │ └── setup.sh │ │ └── testing │ │ │ └── package-model.json │ └── ubuntu │ │ └── jammy │ │ └── package-model.json ├── release │ ├── debian │ │ └── bullseye │ │ │ ├── amd64 │ │ │ └── setup.sh │ │ │ └── package-model.json │ ├── ubuntu │ │ └── jammy │ │ │ └── package-model.json │ └── package-model.json ├── testing │ ├── debian │ │ └── bullseye │ │ │ ├── amd64 │ │ │ └── setup.sh │ │ │ └── package-model.json │ ├── ubuntu │ │ └── jammy │ │ │ └── package-model.json │ └── package-model.json └── unstable │ ├── debian │ ├── bullseye │ │ ├── amd64 │ │ │ └── setup.sh │ │ └── package-model.json │ └── testing │ │ └── package-model.json │ ├── ubuntu │ └── jammy │ │ └── package-model.json │ └── package-model.json ├── docs ├── testing.md ├── requirements.md └── package-model.md ├── README.md ├── .github ├── scripts │ ├── ext-rpm.sh │ ├── ext-template.sh │ ├── ext-git.sh │ ├── local-build.sh │ ├── ext-tester.sh │ ├── ext-debian.sh │ └── main.sh └── workflows │ ├── test-pkg-build.yml │ ├── test-desktop-installable2.yml │ ├── test-desktop-installable.yml │ ├── test-builder.yml │ ├── purge-pkg.yml │ ├── build-rpm.yml │ └── build-deb-v4.yml └── CONTRIBUTING.md /stage/package-model.json: -------------------------------------------------------------------------------- 1 | { 2 | "description": { 3 | "title": "Package metadata for Regolith Desktop" 4 | } 5 | } -------------------------------------------------------------------------------- /stage/experimental/package-model.json: -------------------------------------------------------------------------------- 1 | { 2 | "packages": { 3 | "xrescat": { 4 | "source": "https://github.com/regolith-linux/xrescat.git", 5 | "ref": "experimental" 6 | } 7 | } 8 | } -------------------------------------------------------------------------------- /stage/release/debian/bullseye/amd64/setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # This PPA adds nececessary backports for debbuild helper 13 4 | sudo apt install -y software-properties-common 5 | sudo add-apt-repository -y ppa:videolan/master-daily -------------------------------------------------------------------------------- /stage/testing/debian/bullseye/amd64/setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # This PPA adds nececessary backports for debbuild helper 13 4 | sudo apt install -y software-properties-common 5 | sudo add-apt-repository -y ppa:videolan/master-daily -------------------------------------------------------------------------------- /stage/experimental/debian/bullseye/amd64/setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # This PPA adds nececessary backports for debbuild helper 13 4 | sudo apt install -y software-properties-common 5 | sudo add-apt-repository -y ppa:videolan/master-daily -------------------------------------------------------------------------------- /stage/unstable/debian/bullseye/amd64/setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # This PPA adds nececessary backports for debbuild helper 13 4 | sudo apt install -y software-properties-common 5 | sudo add-apt-repository -y ppa:videolan/master-daily -------------------------------------------------------------------------------- /docs/testing.md: -------------------------------------------------------------------------------- 1 | # Testing 2 | 3 | To test the debian package checking and building, run the script: 4 | 5 | Check Example: 6 | 7 | ``` 8 | .github/scripts/main.sh . unstable ubuntu focal amd64 someurl Default check 9 | ``` 10 | 11 | Build Example: 12 | 13 | ``` 14 | .github/scripts/main.sh . unstable ubuntu focal amd64 someurl Default build 15 | ``` -------------------------------------------------------------------------------- /stage/unstable/debian/bullseye/package-model.json: -------------------------------------------------------------------------------- 1 | { 2 | "packages": { 3 | "regolith-desktop": { 4 | "source": "https://github.com/regolith-linux/regolith-desktop.git", 5 | "ref": "debian-bullseye" 6 | }, 7 | "xcb-util": { 8 | "source": "https://git.launchpad.net/ubuntu/+source/xcb-util", 9 | "ref": "applied/ubuntu/groovy" 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /stage/release/debian/bullseye/package-model.json: -------------------------------------------------------------------------------- 1 | { 2 | "packages": { 3 | "regolith-desktop": { 4 | "source": "https://github.com/regolith-linux/regolith-desktop.git", 5 | "ref": "r2_1-debian-bullseye" 6 | }, 7 | "xcb-util": { 8 | "source": "https://git.launchpad.net/ubuntu/+source/xcb-util", 9 | "ref": "applied/ubuntu/groovy" 10 | }, 11 | "regolith-session": { 12 | "source": "https://github.com/regolith-linux/regolith-session.git", 13 | "ref": "r2_1-debian-bullseye" 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /stage/testing/debian/bullseye/package-model.json: -------------------------------------------------------------------------------- 1 | { 2 | "packages": { 3 | "regolith-desktop": { 4 | "source": "https://github.com/regolith-linux/regolith-desktop.git", 5 | "ref": "r2_1-beta2-debian-bullseye" 6 | }, 7 | "xcb-util": { 8 | "source": "https://git.launchpad.net/ubuntu/+source/xcb-util", 9 | "ref": "applied/ubuntu/groovy" 10 | }, 11 | "regolith-session": { 12 | "source": "https://github.com/regolith-linux/regolith-session.git", 13 | "ref": "r2_1-beta2-debian-bullseye" 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Regolith 2.0 Package Repository 2 | 3 | This repository hosts repositories containing Regolith packages. 4 | 5 | ## Status 6 | 7 | This repository hosts scripts and package metadata for the Regolith Desktop and Regolith Linux projects. We appreciate bug reports, PRs, and suggestions. 8 | 9 | ### `regolith-desktop` installable status 10 | 11 | ![](https://github.com/regolith-linux/voulage/actions/workflows/test-desktop-installable.yml/badge.svg) 12 | 13 | ## How To Install Packages - Debian and Ubuntu 14 | 15 | Refer to the [Regolith Desktop](https://regolith-desktop.com) site for installation instructions. 16 | -------------------------------------------------------------------------------- /stage/release/ubuntu/jammy/package-model.json: -------------------------------------------------------------------------------- 1 | { 2 | "packages": { 3 | "ilia": { 4 | "source": "https://github.com/regolith-linux/ilia.git", 5 | "ref": "r2_1-ubuntu-jammy" 6 | }, 7 | "lago": { 8 | "source": "https://github.com/regolith-linux/lago.git", 9 | "ref": "r2_1-ubuntu-jammy" 10 | }, 11 | "regolith-control-center": { 12 | "source": "https://github.com/regolith-linux/regolith-control-center.git", 13 | "ref": "r2_1-ubuntu-jammy" 14 | 15 | }, 16 | "ubiquity-slideshow-regolith": { 17 | "source": "https://github.com/regolith-linux/ubiquity-slideshow-regolith.git", 18 | "ref": "r2_1-ubuntu-jammy" 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /stage/unstable/debian/testing/package-model.json: -------------------------------------------------------------------------------- 1 | { 2 | "packages": { 3 | "ilia": { 4 | "source": "https://github.com/regolith-linux/ilia.git", 5 | "ref": "ubuntu/jammy" 6 | }, 7 | "lago": { 8 | "source": "https://github.com/regolith-linux/lago.git", 9 | "ref": "ubuntu/jammy" 10 | }, 11 | "regolith-control-center": { 12 | "source": "https://github.com/regolith-linux/regolith-control-center.git", 13 | "ref": "debian/bookworm" 14 | }, 15 | "regolith-i3-config": { 16 | "source": "https://github.com/regolith-linux/regolith-i3-config.git", 17 | "ref": "ubuntu/jammy" 18 | }, 19 | "ubiquity-slideshow-regolith": null, 20 | "plymouth-theme-regolith": null 21 | } 22 | } -------------------------------------------------------------------------------- /stage/unstable/ubuntu/jammy/package-model.json: -------------------------------------------------------------------------------- 1 | { 2 | "packages": { 3 | "ilia": { 4 | "source": "https://github.com/regolith-linux/ilia.git", 5 | "ref": "ubuntu/jammy" 6 | }, 7 | "lago": { 8 | "source": "https://github.com/regolith-linux/lago.git", 9 | "ref": "ubuntu/jammy" 10 | }, 11 | "regolith-control-center": { 12 | "source": "https://github.com/regolith-linux/regolith-control-center.git", 13 | "ref": "ubuntu/jammy" 14 | }, 15 | "ubiquity-slideshow-regolith": { 16 | "source": "https://github.com/regolith-linux/ubiquity-slideshow-regolith.git", 17 | "ref": "master" 18 | }, 19 | "regolith-i3-config": { 20 | "source": "https://github.com/regolith-linux/regolith-i3-config.git", 21 | "ref": "ubuntu/jammy" 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /stage/testing/ubuntu/jammy/package-model.json: -------------------------------------------------------------------------------- 1 | { 2 | "packages": { 3 | "ilia": { 4 | "source": "https://github.com/regolith-linux/ilia.git", 5 | "ref": "r2_1-beta2-ubuntu-jammy" 6 | }, 7 | "lago": { 8 | "source": "https://github.com/regolith-linux/lago.git", 9 | "ref": "r2_1-beta2-ubuntu-jammy" 10 | }, 11 | "regolith-control-center": { 12 | "source": "https://github.com/regolith-linux/regolith-control-center.git", 13 | "ref": "r2_1-beta2-ubuntu-jammy" 14 | }, 15 | "ubiquity-slideshow-regolith": { 16 | "source": "https://github.com/regolith-linux/ubiquity-slideshow-regolith.git", 17 | "ref": "r2_1-beta2-ubuntu-jammy" 18 | }, 19 | "regolith-i3-config": { 20 | "source": "https://github.com/regolith-linux/regolith-i3-config.git", 21 | "ref": "r2_1-beta2-ubuntu-jammy" 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /stage/experimental/ubuntu/jammy/package-model.json: -------------------------------------------------------------------------------- 1 | { 2 | "packages": { 3 | "regolith-displayd": { 4 | "source": "https://github.com/regolith-linux/regolith-displayd.git", 5 | "ref": "master" 6 | }, 7 | "trawl": { 8 | "source": "https://github.com/regolith-linux/trawl.git", 9 | "ref": "master" 10 | }, 11 | "libtrawldb": { 12 | "source": "https://github.com/regolith-linux/libtrawldb.git", 13 | "ref": "master" 14 | }, 15 | "sway-regolith": { 16 | "source": "https://github.com/regolith-linux/sway-regolith.git", 17 | "ref": "packaging/v1.7-regolith" 18 | }, 19 | "regolith-session": { 20 | "source": "https://github.com/regolith-linux/regolith-session.git", 21 | "ref": "wayland-dev" 22 | }, 23 | "regolith-desktop": { 24 | "source": "https://github.com/regolith-linux/regolith-desktop.git", 25 | "ref": "wayland-dev" 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /stage/experimental/debian/testing/package-model.json: -------------------------------------------------------------------------------- 1 | { 2 | "packages": { 3 | "regolith-displayd": { 4 | "source": "https://github.com/regolith-linux/regolith-displayd.git", 5 | "ref": "master" 6 | }, 7 | "regolith-control-center": { 8 | "source": "https://github.com/regolith-linux/regolith-control-center.git", 9 | "ref": "regolith/1%43.0-1" 10 | }, 11 | "libtrawldb": { 12 | "source": "https://github.com/regolith-linux/libtrawldb.git", 13 | "ref": "master" 14 | }, 15 | "sway-regolith": { 16 | "source": "https://github.com/regolith-linux/sway-regolith.git", 17 | "ref": "packaging/v1.7-regolith" 18 | }, 19 | "regolith-session": { 20 | "source": "https://github.com/regolith-linux/regolith-session.git", 21 | "ref": "wayland-dev" 22 | }, 23 | "regolith-desktop": { 24 | "source": "https://github.com/regolith-linux/regolith-desktop.git", 25 | "ref": "wayland-dev" 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /.github/scripts/ext-rpm.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | set -o errexit 5 | # Extension for Debian repo and pacakge support 6 | 7 | #### RPM specific functions 8 | 9 | # Update the changelog to specify the target distribution codename 10 | update_changelog() { 11 | : 12 | } 13 | 14 | # Determine if the changelog has the correct distribution codename 15 | dist_valid() { 16 | return 0 17 | } 18 | 19 | stage_source() { 20 | : 21 | } 22 | 23 | build_src_package() { 24 | set -e 25 | 26 | pushd . 27 | echo "Building source package $PACKAGE_NAME" 28 | cd "$PKG_BUILD_DIR/$PACKAGE_NAME" || exit 29 | 30 | mock -r fedora-36-x86_64 --spec $PACKAGE_NAME.spec --sources . --resultdir $PKG_REPO_PATH 31 | 32 | popd 33 | } 34 | 35 | build_bin_package() { 36 | : 37 | } 38 | 39 | publish() { 40 | # Here we need something equivelent to reprepro...whatever is on the RPM side for generating package repositories 41 | : 42 | } 43 | 44 | # Setup debian repo 45 | setup() { 46 | : 47 | } 48 | -------------------------------------------------------------------------------- /.github/scripts/ext-template.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Extension template. Use this as a starting point to implement a distro/package specific builder 4 | 5 | # Update the changelog to specify the target distribution codename 6 | update_changelog() { 7 | echo todo 8 | } 9 | 10 | # Determine if the changelog has the correct distribution codename 11 | dist_valid() { 12 | echo todo 13 | } 14 | 15 | # Extract the package source 16 | stage_source() { 17 | echo todo 18 | } 19 | 20 | # Build the source package 21 | build_src_package() { 22 | echo todo 23 | } 24 | 25 | # Build binary packages 26 | build_bin_package() { 27 | echo todo 28 | } 29 | 30 | # return 0 if source package already exists in repo, otherwise 1 31 | source_pkg_exists() { 32 | echo todo 33 | } 34 | 35 | # Commit source and bin packages to target repository 36 | publish() { 37 | echo todo 38 | } 39 | 40 | # Create repo dist file - for new repository 41 | generate_reprepro_dist() { 42 | echo todo 43 | } 44 | 45 | # Setup repo layout 46 | setup() { 47 | echo todo 48 | 49 | source_setup_scripts 50 | } 51 | -------------------------------------------------------------------------------- /.github/scripts/ext-git.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | checkout() { 4 | set -e 5 | 6 | if [ -z "$PACKAGE_URL" ]; then 7 | echo "Package model is invalid. Model field 'source' undefined, aborting." 8 | exit 1 9 | fi 10 | 11 | if [ -d "$PKG_BUILD_DIR/$PACKAGE_NAME" ]; then 12 | echo "Deleting existing repo, $PACKAGE_NAME" 13 | rm -Rfv "${PKG_BUILD_DIR:?}/$PACKAGE_NAME" 14 | fi 15 | 16 | if [ ! -d "$PKG_BUILD_DIR" ]; then 17 | echo "Creating build directory $PKG_BUILD_DIR" 18 | mkdir -p "$PKG_BUILD_DIR" || { 19 | echo "Failed to create build dir $PKG_BUILD_DIR, aborting." 20 | exit 1 21 | } 22 | fi 23 | 24 | cd "$PKG_BUILD_DIR" || exit 25 | git clone --recursive "$PACKAGE_URL" -b "$PACKAGE_REF" "$PACKAGE_NAME" 26 | 27 | cd - >/dev/null 2>&1 || exit 28 | } 29 | 30 | sanitize_git() { 31 | if [ -d ".github" ]; then 32 | rm -Rf .github 33 | echo "Removed $(pwd).github directory before building to appease debuild." 34 | fi 35 | if [ -d ".git" ]; then 36 | rm -Rf .git 37 | echo "Removed $(pwd).git directory before building to appease debuild." 38 | fi 39 | } -------------------------------------------------------------------------------- /.github/scripts/local-build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # This script is not used by automation. It calls into the 4 | # build functions as automation would to build and publish a 5 | # package. It can be used to test that the build system builds a 6 | # given package without having to commit changes in git. 7 | 8 | set -e 9 | 10 | REPO_ROOT=$(realpath "$1") 11 | EXTENSION=$2 12 | PACKAGE_NAME=$3 13 | PACKAGE_URL=$4 14 | PACKAGE_REF=$5 15 | CODENAME=$6 16 | PKG_BUILD_DIR="$REPO_ROOT/pkgbuild" 17 | PKG_REPO_PATH="$REPO_ROOT/pkgrepo" 18 | APT_KEY="Default" 19 | ARCH="amd64" 20 | 21 | GIT_EXT="$REPO_ROOT/.github/scripts/ext-git.sh" 22 | if [ ! -f "$GIT_EXT" ]; then 23 | echo "Extension $GIT_EXT doesn't exist, aborting." 24 | exit 1 25 | else 26 | source $GIT_EXT 27 | fi 28 | 29 | if [ ! -f "$EXTENSION" ]; then 30 | echo "Extension $EXTENSION doesn't exist, aborting." 31 | exit 1 32 | else 33 | source $EXTENSION 34 | fi 35 | 36 | # Unused for local build 37 | source_setup_scripts() { 38 | echo nop 39 | } 40 | 41 | setup 42 | checkout 43 | update_changelog 44 | if dist_valid; then 45 | stage_source 46 | build_src_package 47 | build_bin_package 48 | publish 49 | else 50 | echo "dist codename does not match in package changelog, ignoring $PACKAGE_NAME." 51 | fi -------------------------------------------------------------------------------- /.github/scripts/ext-tester.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Extension template. Use this as a starting point to implement a distro/package specific builder 4 | 5 | # Update the changelog to specify the target distribution codename 6 | update_changelog() { 7 | echo "Updating package ${PKG_BUILD_DIR:?}/$PACKAGE_NAME changelog" 8 | } 9 | 10 | # Determine if the changelog has the correct distribution codename 11 | dist_valid() { 12 | echo "Verifying package $PACKAGE_NAME is valid" 13 | } 14 | 15 | # Extract the package source 16 | stage_source() { 17 | echo "Staging $PACKAGE_NAME source in $PKG_BUILD_DIR" 18 | } 19 | 20 | # Build the source package 21 | build_src_package() { 22 | echo "Building $PACKAGE_NAME source package" 23 | } 24 | 25 | # Build binary packages 26 | build_bin_package() { 27 | echo "Building $PACKAGE_NAME binary package" 28 | } 29 | 30 | # return 0 if source package already exists in repo, otherwise 1 31 | source_pkg_exists() { 32 | echo "Checking if $PACKAGE_NAME source package already exists" 33 | } 34 | 35 | # Commit source and bin packages to target repository 36 | publish() { 37 | echo "Publishing $PACKAGE_NAME to repo" 38 | } 39 | 40 | # Create repo dist file - for new repository 41 | generate_reprepro_dist() { 42 | echo "Generating config files for new repository" 43 | } 44 | 45 | # Setup repo layout 46 | setup() { 47 | echo "Setting up $PKG_REPO_PATH" 48 | 49 | generate_reprepro_dist 50 | 51 | source_setup_scripts 52 | } 53 | -------------------------------------------------------------------------------- /docs/requirements.md: -------------------------------------------------------------------------------- 1 | # Voulage Requirements 2 | 3 | ## Terms 4 | 5 | * `distro` - A global-level name referring to a Linux distribution (eg: `debian`, `slack`) 6 | * `codename` - The name of a given release of a distro (eg: `focal`, `bullseye`) 7 | * `arch` - The system architecture of target machines (eg: `amd64`, `arm64`) 8 | * `stage` - May be one of `unstable`, `testing`, `release`. Modeled from [Debian releases](https://www.debian.org/releases/). 9 | * `target` - A specific instance of `distro` + `codename` + `arch` + `stage` that an end user may use to install software. 10 | * `repository` - A collection of packages for a given `distro`+`codename`+`arch`+`stage` 11 | * `manifest` - A file containing lists of built package sets of: ` ` 12 | 13 | ## Requirements 14 | 15 | 1. Able to model packages for a given target. 16 | 2. Able to determine changes for modeled packages for a given target. 17 | 3. Able to build packages in a distro-specific way. 18 | 19 | ## Goals 20 | 21 | 1. Repo builds should be easily monitor-able. Build failures should have clear steps to resolve. The state of repositories should be easy to know at a glance (meaning build failures should result in the repo being in a consistent state) 22 | 2. Simple file management. Each file should be in a reasonable place and there should not be loose or unknown files. 23 | 3. Testable. The repo should have some tests that work against static data so that correctness can be verified outside of a given instance. 24 | -------------------------------------------------------------------------------- /docs/package-model.md: -------------------------------------------------------------------------------- 1 | # Voulage Package Model 2 | 3 | 4 | ## Schema 5 | 6 | ``` 7 | { 8 | "description": { 9 | "title": "" 10 | }, 11 | "packages": { 12 | "": { 13 | "source": "", 14 | "ref": "" 15 | } 16 | } 17 | } 18 | ``` 19 | 20 | ## Evaluation at Build Time 21 | 22 | The package model for a given `target` is computed by first starting with the root package model, and then merging any additional `package-model.json` files found in the subtrees that correspond to dimensions of the `target`. 23 | 24 | ### Example 25 | 26 | Given the following file tree and the target of `unstable/debian/bullseye/arm64`: 27 | 28 | ``` 29 | stage 30 | ├── release 31 | ├── testing 32 | └── unstable 33 | ├── debian 34 | │   └── bullseye 35 | │   ├── amd64 36 | │   │   ├── manifest.txt 37 | │   │   └── setup.sh 38 | │   ├── arm64 39 | │   │   └── manifest.txt 40 | │   └── package-model.json 41 | ├── package-model.json 42 | └── ubuntu 43 | ├── focal 44 | │   ├── amd64 45 | │   │   └── manifest.txt 46 | │   └── arm64 47 | │   └── manifest.txt 48 | └── impish 49 | ``` 50 | 51 | When computing the package model for `unstable/debian/bullseye/arm64` first, the `unstable/package-model.json` is read. Next, we check for a `package-model.json` in `unstable/debian`, and if found merge it with the root. This merge pattern continues to the the leaf node of the `target` specification. So, `unstable/debian/bullseye`, then `unstable/debian/bullseye/arm64` are checked for `package-model.json` files. The resulting model is used when determining if there are changes (by comparing to the manifest file contained in each leaf directory). 52 | 53 | -------------------------------------------------------------------------------- /.github/workflows/test-pkg-build.yml: -------------------------------------------------------------------------------- 1 | name: Test Build Package 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | extension: 7 | description: 'Build Extension Script' 8 | required: true 9 | default: ext-debian.sh 10 | package-name: 11 | description: 'Package Name' 12 | required: true 13 | package-url: 14 | description: 'Package URL (public git)' 15 | required: true 16 | package-ref: 17 | description: 'Package Ref (branch, tag, or hash)' 18 | required: true 19 | codename: 20 | description: 'Package Codename (focal, bullseye)' 21 | required: true 22 | build-os-image: 23 | description: 'Build package on (ubuntu-22.04)' 24 | required: true 25 | default: ubuntu-20.04 26 | 27 | jobs: 28 | build: 29 | runs-on: ${{ github.event.inputs.build-os-image }} 30 | steps: 31 | - uses: actions/checkout@v2 32 | - name: Env Setup 33 | id: init 34 | run: | 35 | sudo apt update 36 | sudo apt install -y devscripts reprepro 37 | mkdir -p ~/.gnupg/ 38 | printf "${{ secrets.PACKAGE_PRIVATE_KEY }}" | base64 --decode > ~/.gnupg/private.key 39 | gpg --batch --import ~/.gnupg/private.key 40 | - name: Build Test Package 41 | id: build 42 | run: | 43 | set -x 44 | export DEBEMAIL=regolith.linux@gmail.com 45 | export DEBFULLNAME="Regolith Linux" 46 | extension=${{ github.workspace }}/.github/scripts/${{ github.event.inputs.extension }} 47 | package_name=${{ github.event.inputs.package-name }} 48 | package_url=${{ github.event.inputs.package-url }} 49 | package_ref=${{ github.event.inputs.package-ref }} 50 | codename=${{ github.event.inputs.codename }} 51 | 52 | ${{ github.workspace }}/.github/scripts/local-build.sh \ 53 | ${{ github.workspace }} \ 54 | $extension \ 55 | $package_name \ 56 | $package_url \ 57 | $package_ref \ 58 | $codename 59 | -------------------------------------------------------------------------------- /.github/workflows/test-desktop-installable2.yml: -------------------------------------------------------------------------------- 1 | name: regolith-desktop is installable 2 2 | 3 | on: 4 | workflow_dispatch: 5 | workflow_call: 6 | 7 | jobs: 8 | test-debian-install: 9 | runs-on: ${{ matrix.host-os }} 10 | strategy: 11 | matrix: 12 | stage: [unstable] # , testing, release 13 | distro-codename: [debian-bullseye] 14 | arch: [amd64, arm64] 15 | include: 16 | - arch: amd64 17 | host-os: ubuntu-20.04 18 | - arch: arm64 19 | host-os: [self-hosted, Linux, ARM64, focal] 20 | - distro-codename: debian-bullseye 21 | distro: debian 22 | codename: bullseye 23 | steps: 24 | - name: Test ${{ matrix.stage }} ${{ matrix.distro-codename }} ${{ matrix.arch }} 25 | uses: kgilmer/test-debian-bullseye-action@v1 26 | with: 27 | apt-key-url: http://regolith-desktop.org/regolith.key 28 | apt-repo-line: "deb [arch=${{ matrix.arch }}] https://regolith-desktop.org/${{ matrix.stage }}-${{ matrix.distro }}-${{ matrix.codename }}-${{ matrix.arch }} ${{ matrix.codename }} main" 29 | target-package: "regolith-desktop" 30 | test-ubuntu-install: 31 | runs-on: ${{ matrix.host-os }} 32 | strategy: 33 | matrix: 34 | stage: [unstable] # , testing, release 35 | distro-codename: [ubuntu-focal] 36 | arch: [amd64, arm64] 37 | include: 38 | - arch: amd64 39 | host-os: ubuntu-20.04 40 | - arch: arm64 41 | host-os: [self-hosted, Linux, ARM64, focal] 42 | - distro-codename: ubuntu-focal 43 | distro: ubuntu 44 | codename: focal 45 | steps: 46 | - name: Test ${{ matrix.stage }} ${{ matrix.distro-codename }} ${{ matrix.arch }} 47 | uses: kgilmer/test-ubuntu-20.04-action@v1.1.5 48 | with: 49 | apt-key-url: http://regolith-desktop.org/regolith.key 50 | apt-repo-line: "deb [arch=${{ matrix.arch }}] https://regolith-desktop.org/${{ matrix.stage }}-${{ matrix.distro }}-${{ matrix.codename }}-${{ matrix.arch }} ${{ matrix.codename }} main" 51 | target-package: "regolith-desktop" 52 | -------------------------------------------------------------------------------- /.github/workflows/test-desktop-installable.yml: -------------------------------------------------------------------------------- 1 | name: regolith-desktop is installable 2 | 3 | on: 4 | workflow_dispatch: 5 | workflow_call: 6 | 7 | jobs: 8 | test-debian-install: 9 | runs-on: ${{ matrix.host-os }} 10 | strategy: 11 | matrix: 12 | stage: [unstable] # , testing, release 13 | distro-codename: [debian-bullseye] 14 | arch: [amd64, arm64] 15 | include: 16 | - arch: amd64 17 | host-os: ubuntu-20.04 18 | - arch: arm64 19 | host-os: [self-hosted, Linux, ARM64, focal] 20 | - distro-codename: debian-bullseye 21 | distro: debian 22 | codename: bullseye 23 | steps: 24 | - name: Test ${{ matrix.stage }} ${{ matrix.distro-codename }} ${{ matrix.arch }} 25 | uses: kgilmer/test-debian-bullseye-action@v1 26 | with: 27 | apt-key-url: https://regolith-linux.github.io/package-repo/regolith.key 28 | apt-repo-line: "deb [arch=${{ matrix.arch }}] https://regolith-${{ matrix.stage }}-${{ matrix.distro }}-${{ matrix.codename }}-${{ matrix.arch }}.s3.amazonaws.com ${{ matrix.codename }} main" 29 | target-package: "regolith-desktop" 30 | test-ubuntu-install: 31 | runs-on: ${{ matrix.host-os }} 32 | strategy: 33 | matrix: 34 | stage: [unstable] # , testing, release 35 | distro-codename: [ubuntu-focal] 36 | arch: [amd64, arm64] 37 | include: 38 | - arch: amd64 39 | host-os: ubuntu-20.04 40 | - arch: arm64 41 | host-os: [self-hosted, Linux, ARM64, focal] 42 | - distro-codename: ubuntu-focal 43 | distro: ubuntu 44 | codename: focal 45 | steps: 46 | - name: Test ${{ matrix.stage }} ${{ matrix.distro-codename }} ${{ matrix.arch }} 47 | uses: kgilmer/test-ubuntu-20.04-action@v1.1.5 48 | with: 49 | apt-key-url: https://regolith-linux.github.io/package-repo/regolith.key 50 | apt-repo-line: "deb [arch=${{ matrix.arch }}] https://regolith-${{ matrix.stage }}-${{ matrix.distro }}-${{ matrix.codename }}-${{ matrix.arch }}.s3.amazonaws.com ${{ matrix.codename }} main" 51 | target-package: "regolith-desktop" 52 | -------------------------------------------------------------------------------- /.github/workflows/test-builder.yml: -------------------------------------------------------------------------------- 1 | name: Test builder script 2 | 3 | on: 4 | workflow_dispatch: 5 | 6 | jobs: 7 | build: 8 | runs-on: ${{ matrix.host-os }} 9 | strategy: 10 | matrix: 11 | host-os: [ubuntu-20.04, [self-hosted, Linux, ARM64]] 12 | stage: [unstable, testing, release] 13 | distro-codename: [ubuntu-focal, ubuntu-impish, ubuntu-jammy, debian-bullseye] 14 | include: 15 | - host-os: ubuntu-20.04 16 | arch: amd64 17 | - host-os: [self-hosted, Linux, ARM64] 18 | arch: arm64 19 | - distro-codename: ubuntu-focal 20 | distro: ubuntu 21 | codename: focal 22 | - distro-codename: ubuntu-impish 23 | distro: ubuntu 24 | codename: impish 25 | - distro-codename: ubuntu-jammy 26 | distro: ubuntu 27 | codename: jammy 28 | - distro-codename: debian-bullseye 29 | distro: debian 30 | codename: bullseye 31 | steps: 32 | - uses: actions/checkout@v2 33 | - name: Set Job Parameters 34 | id: init 35 | run: | 36 | echo ::set-output name=MANIFEST_PATH::"${{ github.workspace }}/manifests" 37 | echo ::set-output name=PKG_REPO_PATH::"${{ github.workspace }}/repo" 38 | echo ::set-output name=PKG_BUILD_DIR::"${{ github.workspace }}/packages" 39 | echo ::set-output name=stage::${{ matrix.stage }} 40 | echo ::set-output name=distro::${{ matrix.distro }} 41 | echo ::set-output name=codename::${{ matrix.codename }} 42 | echo ::set-output name=arch::${{ matrix.arch }} 43 | echo ::set-output name=target::${{ matrix.stage }}-${{ matrix.distro }}-${{ matrix.codename }}-${{ matrix.arch }} 44 | - name: Clean tmp 45 | run: | 46 | set -x 47 | rm -Rf ${{ steps.init.outputs.PKG_REPO_PATH }} || true 48 | mkdir ${{ steps.init.outputs.PKG_REPO_PATH }} 49 | rm -Rf ${{ steps.init.outputs.MANIFEST_PATH }} || true 50 | mkdir ${{ steps.init.outputs.MANIFEST_PATH }} 51 | rm -Rf ${{ steps.init.outputs.PKG_BUILD_DIR }} || true 52 | mkdir ${{ steps.init.outputs.PKG_BUILD_DIR }} 53 | - name: Test Build 54 | run: | 55 | set -x 56 | ${{ github.workspace }}/.github/scripts/main.sh \ 57 | "${{ github.workspace }}" \ 58 | "${{ github.workspace }}/.github/scripts/ext-tester.sh" \ 59 | "${{ steps.init.outputs.stage }}" \ 60 | "${{ steps.init.outputs.distro }}" \ 61 | "${{ steps.init.outputs.codename }}" \ 62 | "${{ steps.init.outputs.arch }}" \ 63 | test_repo_url \ 64 | Default \ 65 | check \ 66 | ${{ steps.init.outputs.MANIFEST_PATH }} \ 67 | ${{ steps.init.outputs.PKG_REPO_PATH }} \ 68 | ${{ steps.init.outputs.PKG_BUILD_DIR }} 69 | -------------------------------------------------------------------------------- /.github/workflows/purge-pkg.yml: -------------------------------------------------------------------------------- 1 | name: Purge Package 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | stage: 7 | description: 'Stage (unstable, testing, release)' 8 | required: true 9 | distro: 10 | description: 'Distro (debian, ubuntu)' 11 | required: true 12 | codename: 13 | description: 'Codename (focal, impish, jammy, bullseye)' 14 | required: true 15 | arch: 16 | description: 'Arch: (amd64, arm64)' 17 | required: true 18 | package: 19 | description: 'Package Name' 20 | required: true 21 | 22 | jobs: 23 | build: 24 | runs-on: ubuntu-20.04 25 | steps: 26 | - name: Env Setup 27 | id: init 28 | run: | 29 | echo ::set-output name=s3_bucket::regolith-${{ github.event.inputs.stage }}-${{ github.event.inputs.distro }}-${{ github.event.inputs.codename }}-${{ github.event.inputs.arch }} 30 | sudo apt update 31 | sudo apt install -y devscripts reprepro 32 | sudo apt install -y python3-pip 33 | sudo pip install awscli 34 | mkdir -p ~/.gnupg/ 35 | printf "${{ secrets.PACKAGE_PRIVATE_KEY }}" | base64 --decode > ~/.gnupg/private.key 36 | gpg --batch --import ~/.gnupg/private.key 37 | - name: Pull from S3 38 | run: | 39 | rm -Rf ${{ github.workspace }}/generated-repo 40 | aws s3 sync \ 41 | s3://${{ steps.init.outputs.s3_bucket }} \ 42 | ${{ github.workspace }}/generated-repo \ 43 | --delete 44 | env: 45 | AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_ID }} 46 | AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_KEY }} 47 | - name: Purge Package 48 | id: purge 49 | run: | 50 | set -x 51 | export DEBEMAIL=regolith.linux@gmail.com 52 | export DEBFULLNAME="Regolith Linux" 53 | pkg_name=${{ github.event.inputs.package }} 54 | distro=${{ github.event.inputs.distro }} 55 | codename=${{ github.event.inputs.codename }} 56 | stage=${{ github.event.inputs.stage }} 57 | arch=${{ github.event.inputs.arch }} 58 | 59 | sudo chown -R runner generated-repo 60 | 61 | # Remove package from debian repo 62 | reprepro --basedir generated-repo removesrc $codename $pkg_name 63 | 64 | # Remove package manifest entry 65 | sed -i /^$pkg_name[[:space:]]/d generated-repo/manifest.txt 66 | - name: List Repo Packages 67 | run: | 68 | set -x 69 | reprepro --basedir generated-repo dumpreferences 70 | - name: Push to S3 71 | run: | 72 | set -x 73 | aws s3 sync \ 74 | ${{ github.workspace }}/generated-repo/ \ 75 | s3://${{ steps.init.outputs.s3_bucket }} \ 76 | --delete 77 | env: 78 | AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_ID }} 79 | AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_KEY }} 80 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | 2 | ## Introduction 3 | 4 | The Regolith Desktop project is consumed by users via Linux packages. These packages are built via GitHub actions in this repository. It can be considered a general-purpose system for building and hosting packages for Debian-based systems. 5 | 6 | ## Terms 7 | 8 | * `distro` - A global-level name referring to a Linux distribution (eg: `debian`, `slack`) 9 | * `codename` - The name of a given release of a distro (eg: `focal`, `bullseye`) 10 | * `arch` - The system architecture of target machines (eg: `amd64`, `arm64`) 11 | * `stage` - May be one of `unstable`, `testing`, `release`. Modeled from [Debian releases](https://www.debian.org/releases/). 12 | * `repository` - A collection of packages for a given `distro`+`codename`+`arch`+`stage` 13 | * `manifest` - A file containing lists of built package sets of: ` ` 14 | 15 | ## Package Variants Supported 16 | * Debian 17 | 18 | 19 | ### Package Builder 20 | 21 | #### Overview 22 | 23 | Package building starts from a root model which specifies the upstream package repositories and source locations. This package model specifies the following attributes per package: 24 | 25 | ```json 26 | "package-name": { 27 | "source": "https://...git", 28 | "ref": "..." 29 | } 30 | ``` 31 | 32 | The builder traverses the package model and generates a manifest for each package. This manifest is used to determine what (if anything) has been updated upstream and needs to be built. The package manifest is a text file with one package per line. The line contains: 33 | 34 | ``` 35 | package-name git-repo-url branch commit-ref 36 | ``` 37 | 38 | The manifest is generated by simply retrieving the git ref of the upstream repo at the specified branch. After a manifest is generated, it is compared to the previously generated manifest. If there is no differences than the build is complete (NOP). In the case there are changes, the new manifest is committed along with the newly built packages. 39 | 40 | For the case that changes are found, for each package that has changed is built and the results are committed to a target-specific repository. 41 | 42 | #### Praxis 43 | 44 | TBD 45 | 46 | ##### Customization 47 | 48 | Package builds can be customized in a few ways. Customization is specified at the `/stage////` levels. There are two forms of customization: module mutation and build host mutation. In the former, a JSON file may be specified that becomes merged with the general package model before manifest generation. This merging allows for: 49 | 50 | 1. Additional packages to be specified for a given `stage`/`distro`/`codename`/`arch`. 51 | 2. Existing packages to specify an alternate source (git url, branch, commit ref). 52 | 3. Remove a package from the general model. This is useful when a given distro already supplies a dependency natively. 53 | 54 | For build host mutation, if the file `setup.sh` ([example](stage/release/debian/bullseye/setup.sh)) is present in the directory it is executed on the docker build host before manifest merging begins. 55 | 56 | ##### Repo Layout 57 | 58 | |Path |Description | 59 | |---|---| 60 | | `/stage` | General package model per `target` | 61 | | `/docs` | Documentation 62 | | `/.github/workflows` | The build system | 63 | 64 | ##### Build Triggers 65 | 66 | Package builds are launched via GitHub workflow triggers. The following events are supported: 67 | * Check manifest and build new packages upon 68 | * Git repo push to `main` 69 | * Manually start build via `Actions` tab 70 | * Repository notification event. 1P packages specify GitHub workflows that signal `voulage` of a change. ([example](https://github.com/regolith-linux/regolith-desktop/blob/master/.github/workflows/pkg-change-broadcast.yml)) 71 | 72 | ### HOWTO 73 | 74 | #### Implement a Package Builder 75 | 76 | Copy `.github/scripts/ext-template.sh` to another file, implement the functions in the shell script. When invoking `main.sh`, pass the new extension as the second parameter. See `ext-debian.sh` as an example. 77 | 78 | #### Build and Publish Locally 79 | 80 | The script `local-build.sh` will invoke the build and packaging functions as occurs in automation. This can be used to test packages build before committing to git or debug problems with packages or the build system. Example: 81 | 82 | ``` 83 | cd .github/scripts 84 | ./local-build.sh ../.. ext-debian.sh regolith-i3status-rust https://github.com/regolith-linux/regolith-i3status-rust.git debian_source focal 85 | ``` -------------------------------------------------------------------------------- /.github/scripts/ext-debian.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | set -o errexit 5 | # Extension for Debian repo and pacakge support 6 | 7 | #### Debian specific functions 8 | 9 | # Update the changelog to specify the target distribution codename 10 | update_changelog() { 11 | set -x 12 | cd "${PKG_BUILD_DIR:?}/$PACKAGE_NAME" 13 | version=$(dpkg-parsechangelog --show-field Version) 14 | dch --distribution "$CODENAME" --newversion "${version}-1regolith" "Automated release." 15 | 16 | cd - >/dev/null 2>&1 || exit 17 | } 18 | 19 | # Determine if the changelog has the correct distribution codename 20 | dist_valid() { 21 | cd "${PKG_BUILD_DIR:?}/$PACKAGE_NAME" 22 | 23 | TOP_CHANGELOG_LINE=$(head -n 1 debian/changelog) 24 | CHANGELOG_DIST=$(echo "$TOP_CHANGELOG_LINE" | cut -d' ' -f3) 25 | 26 | cd - >/dev/null 2>&1 27 | # echo "Checking $CODENAME and $CHANGELOG_DIST" 28 | if [[ "$CHANGELOG_DIST" == *"$CODENAME"* ]]; then 29 | return 0 30 | else 31 | return 1 32 | fi 33 | } 34 | 35 | stage_source() { 36 | pushd . 37 | 38 | echo "Preparing source for $PACKAGE_NAME" 39 | cd "$PKG_BUILD_DIR/$PACKAGE_NAME" || exit 40 | debian_package_name=$(dpkg-parsechangelog --show-field Source) 41 | full_version=$(dpkg-parsechangelog --show-field Version) 42 | debian_version="${full_version%-*}" 43 | cd "$PKG_BUILD_DIR" || exit 44 | 45 | echo "Generating source tarball from git repo." 46 | tar cfzv --force-local $debian_package_name\_${debian_version}.orig.tar.gz --exclude .git\* --exclude /debian $PACKAGE_NAME/../$PACKAGE_NAME 47 | 48 | popd 49 | } 50 | 51 | build_src_package() { 52 | set -e 53 | 54 | pushd . 55 | echo "Building source package $PACKAGE_NAME" 56 | cd "$PKG_BUILD_DIR/$PACKAGE_NAME" || exit 57 | 58 | sanitize_git 59 | sudo apt build-dep -y . 60 | debuild -S -sa 61 | 62 | popd 63 | } 64 | 65 | build_bin_package() { 66 | set -e 67 | 68 | pushd . 69 | echo "Building binary package $PACKAGE_NAME" 70 | cd "$PKG_BUILD_DIR/$PACKAGE_NAME" || exit 71 | 72 | debuild -sa -b 73 | popd 74 | } 75 | 76 | # Internal (private) function 77 | source_pkg_exists() { 78 | SRC_PKG_VERSION=$(reprepro --basedir "$PKG_REPO_PATH" list "$CODENAME" "$1" | cut -d' ' -f3) 79 | 80 | SRC_PKG_BUILD_VERSION=$(echo $2 | cut -d'-' -f1) 81 | SRC_PKG_REPO_VERSION=$(echo $SRC_PKG_VERSION | cut -d'-' -f1) 82 | 83 | if [ "$SRC_PKG_REPO_VERSION" == "$SRC_PKG_BUILD_VERSION" ]; then 84 | return 0 85 | else 86 | return 1 87 | fi 88 | } 89 | 90 | publish() { 91 | cd "${PKG_BUILD_DIR:?}/$PACKAGE_NAME" 92 | version=$(dpkg-parsechangelog --show-field Version) 93 | debian_package_name=$(dpkg-parsechangelog --show-field Source) 94 | cd "$PKG_BUILD_DIR" 95 | 96 | DEB_SRC_PKG_PATH="$PKG_BUILD_DIR/${debian_package_name}_${version}_source.changes" 97 | 98 | if [ ! -f "$DEB_SRC_PKG_PATH" ]; then 99 | echo "Failed to find changes file." 100 | fi 101 | 102 | if source_pkg_exists "$debian_package_name" "$version"; then 103 | echo "Ignoring source package, already exists in target repository" 104 | allow_failing_bin_package="true" 105 | else 106 | echo "Ingesting source package $debian_package_name into $PKG_REPO_PATH" 107 | reprepro --basedir "$PKG_REPO_PATH" include "$CODENAME" "$DEB_SRC_PKG_PATH" 108 | allow_failing_bin_package="false" 109 | fi 110 | 111 | DEB_CONTROL_FILE="$PKG_BUILD_DIR/$PACKAGE_NAME/debian/control" 112 | ALL_ARCH="$ARCH,all" 113 | 114 | for target_arch in $(echo $ALL_ARCH | sed "s/,/ /g"); do 115 | cat "$DEB_CONTROL_FILE" | grep ^Package: | cut -d' ' -f2 | while read -r bin_pkg; do 116 | DEB_BIN_PKG_PATH="$(pwd)/${bin_pkg}_${version}_${target_arch}.deb" 117 | if [ -f "$DEB_BIN_PKG_PATH" ]; then 118 | if [ "$allow_failing_bin_package" == "true" ]; then 119 | # If the source package/version already exists, allow the bin package build to fail (already exists) 120 | reprepro --basedir "$PKG_REPO_PATH" includedeb "$CODENAME" "$DEB_BIN_PKG_PATH" || true 121 | echo "Ingested binary package $DEB_BIN_PKG_PATH into $PKG_REPO_PATH" 122 | else 123 | reprepro --basedir "$PKG_REPO_PATH" includedeb "$CODENAME" "$DEB_BIN_PKG_PATH" 124 | echo "Ingested binary package $DEB_BIN_PKG_PATH into $PKG_REPO_PATH" 125 | fi 126 | echo "CHLOG:Published ${bin_pkg}_${version}_${target_arch}.deb in $STAGE $DISTRO $CODENAME $ARCH from $PKG_LINE" 127 | else 128 | echo "Package $bin_pkg does not exist for $target_arch" 129 | fi 130 | done 131 | done 132 | } 133 | 134 | # Create repo dist file 135 | generate_reprepro_dist() { 136 | echo "Origin: $PACKAGE_REPO_URL" > "$PKG_REPO_PATH/conf/distributions" 137 | echo "Label: $PACKAGE_REPO_URL" >> "$PKG_REPO_PATH/conf/distributions" 138 | echo "Codename: $CODENAME" >> "$PKG_REPO_PATH/conf/distributions" 139 | echo "Architectures: $ARCH source" >> "$PKG_REPO_PATH/conf/distributions" 140 | echo "Components: main" >> "$PKG_REPO_PATH/conf/distributions" 141 | echo "Description: $STAGE $DISTRO $CODENAME $ARCH" >> "$PKG_REPO_PATH/conf/distributions" 142 | echo "SignWith: $APT_KEY" >> "$PKG_REPO_PATH/conf/distributions" 143 | } 144 | 145 | # Setup debian repo 146 | setup() { 147 | if [ ! -d "$PKG_REPO_PATH/conf" ]; then 148 | echo "Creating conf dir" 149 | mkdir -p "$PKG_REPO_PATH/conf" 150 | fi 151 | 152 | if [ ! -f "$PKG_REPO_PATH/conf/distributions" ]; then 153 | echo "Package metadata not found, creating conf dir" 154 | generate_reprepro_dist 155 | cat "$PKG_REPO_PATH/conf/distributions" 156 | else 157 | echo "Existing metadata:" 158 | cat "$PKG_REPO_PATH/conf/distributions" 159 | fi 160 | 161 | source_setup_scripts 162 | } 163 | -------------------------------------------------------------------------------- /stage/release/package-model.json: -------------------------------------------------------------------------------- 1 | { 2 | "packages": { 3 | "regolith-system-ubuntu": { 4 | "source": "https://github.com/regolith-linux/regolith-system-ubuntu.git", 5 | "ref": "r2_1" 6 | }, 7 | "regolith-lightdm-config": { 8 | "source": "https://github.com/regolith-linux/regolith-lightdm-config.git", 9 | "ref": "r2_1" 10 | }, 11 | "regolith-session": { 12 | "source": "https://github.com/regolith-linux/regolith-session.git", 13 | "ref": "r2_1" 14 | }, 15 | "i3-snapshot": { 16 | "source": "https://github.com/regolith-linux/i3-snapshot.git", 17 | "ref": "r2_1" 18 | }, 19 | "python3-i3ipc": { 20 | "source": "https://github.com/regolith-linux/python3-i3ipc", 21 | "ref": "r2_1" 22 | }, 23 | "fonts-jetbrains-mono": { 24 | "source": "https://github.com/regolith-linux/fonts-jetbrains-mono.git", 25 | "ref": "r2_1" 26 | }, 27 | "fonts-materialdesignicons-webfont": { 28 | "source": "https://github.com/regolith-linux/fonts-materialdesignicons-webfont.git", 29 | "ref": "r2_1" 30 | }, 31 | "i3-wm": { 32 | "source": "https://github.com/regolith-linux/i3-wm.git", 33 | "ref": "r2_1" 34 | }, 35 | "i3-gaps-wm": { 36 | "source": "https://github.com/regolith-linux/i3-gaps-wm.git", 37 | "ref": "r2_1" 38 | }, 39 | "regolith-i3-config": { 40 | "source": "https://github.com/regolith-linux/regolith-i3-config.git", 41 | "ref": "r2_1" 42 | }, 43 | "ayu-theme": { 44 | "source": "https://github.com/regolith-linux/ayu-theme.git", 45 | "ref": "r2_1" 46 | }, 47 | "solarc-theme": { 48 | "source": "https://github.com/regolith-linux/solarc-theme.git", 49 | "ref": "r2_1" 50 | }, 51 | "gruvbox-gtk": { 52 | "source": "https://github.com/regolith-linux/gruvbox-gtk.git", 53 | "ref": "r2_1" 54 | }, 55 | "dracula-gtk": { 56 | "source": "https://github.com/regolith-linux/dracula-gtk.git", 57 | "ref": "r2_1" 58 | }, 59 | "whitesur-gtk-theme": { 60 | "source": "https://github.com/regolith-linux/whitesur-gtk-theme.git", 61 | "ref": "r2_1" 62 | }, 63 | "regolith-look-default": { 64 | "source": "https://github.com/regolith-linux/regolith-look-default.git", 65 | "ref": "r2_1" 66 | }, 67 | "regolith-look-extra": { 68 | "source": "https://github.com/regolith-linux/regolith-look-extra.git", 69 | "ref": "r2_1" 70 | }, 71 | "i3-next-workspace": { 72 | "source": "https://github.com/regolith-linux/i3-next-workspace.git", 73 | "ref": "r2_1" 74 | }, 75 | "i3-swap-focus": { 76 | "source": "https://github.com/regolith-linux/i3-swap-focus.git", 77 | "ref": "r2_1" 78 | }, 79 | "i3xrocks": { 80 | "source": "https://github.com/regolith-linux/i3xrocks.git", 81 | "ref": "r2_1" 82 | }, 83 | "regolith-i3xrocks-config": { 84 | "source": "https://github.com/regolith-linux/regolith-i3xrocks-config.git", 85 | "ref": "r2_1" 86 | }, 87 | "regolith-desktop": { 88 | "source": "https://github.com/regolith-linux/regolith-desktop.git", 89 | "ref": "r2_1" 90 | }, 91 | "regolith-ftue": { 92 | "source": "https://github.com/regolith-linux/regolith-ftue.git", 93 | "ref": "r2_1" 94 | }, 95 | "regolith-compositor-none": { 96 | "source": "https://github.com/regolith-linux/regolith-compositor-none.git", 97 | "ref": "r2_1" 98 | }, 99 | "regolith-compositor-xcompmgr": { 100 | "source": "https://github.com/regolith-linux/regolith-compositor-xcompmgr.git", 101 | "ref": "r2_1" 102 | }, 103 | "regolith-compositor-compton-glx": { 104 | "source": "https://github.com/regolith-linux/regolith-compositor-compton-glx.git", 105 | "ref": "r2_1" 106 | }, 107 | "picom": { 108 | "source": "https://github.com/regolith-linux/picom.git", 109 | "ref": "r2_1" 110 | }, 111 | "regolith-compositor-picom-glx": { 112 | "source": "https://github.com/regolith-linux/regolith-compositor-picom-glx.git", 113 | "ref": "r2_1" 114 | }, 115 | "remontoire": { 116 | "source": "https://github.com/regolith-linux/remontoire.git", 117 | "ref": "r2_1" 118 | }, 119 | "ilia": { 120 | "source": "https://github.com/regolith-linux/ilia.git", 121 | "ref": "r2_1" 122 | }, 123 | "lago": { 124 | "source": "https://github.com/regolith-linux/lago.git", 125 | "ref": "r2_1" 126 | }, 127 | "regolith-rofi-config": { 128 | "source": "https://github.com/regolith-linux/regolith-rofi-config.git", 129 | "ref": "r2_1" 130 | }, 131 | "regolith-rofication": { 132 | "source": "https://github.com/regolith-linux/regolith-rofication.git", 133 | "ref": "r2_1" 134 | }, 135 | "regolith-control-center": { 136 | "source": "https://github.com/regolith-linux/regolith-control-center.git", 137 | "ref": "r2_1" 138 | }, 139 | "regolith-default-settings": { 140 | "source": "https://github.com/regolith-linux/regolith-default-settings.git", 141 | "ref": "r2_1" 142 | }, 143 | "plymouth-theme-regolith": { 144 | "source": "https://github.com/regolith-linux/plymouth-theme-regolith.git", 145 | "ref": "r2_1" 146 | }, 147 | "regolith-distro-ubuntu": { 148 | "source": "https://github.com/regolith-linux/regolith-distro-ubuntu.git", 149 | "ref": "r2_1" 150 | }, 151 | "xrescat": { 152 | "source": "https://github.com/regolith-linux/xrescat.git", 153 | "ref": "r2_1" 154 | }, 155 | "regolith-unclutter-xfixes": { 156 | "source": "https://github.com/regolith-linux/regolith-unclutter-xfixes.git", 157 | "ref": "r2_1" 158 | }, 159 | "arc-icon-theme": { 160 | "source": "https://github.com/regolith-linux/arc-icon-theme.git", 161 | "ref": "r2_1" 162 | }, 163 | "nordic": { 164 | "source": "https://github.com/regolith-linux/nordic.git", 165 | "ref": "r2_1" 166 | }, 167 | "fonts-source-code-pro-ttf": { 168 | "source": "https://github.com/regolith-linux/fonts-source-code-pro-ttf.git", 169 | "ref": "r2_1" 170 | }, 171 | "fonts-nerd-fonts": { 172 | "source": "https://github.com/regolith-linux/fonts-nerd-fonts.git", 173 | "ref": "r2_1" 174 | } 175 | } 176 | } -------------------------------------------------------------------------------- /stage/unstable/package-model.json: -------------------------------------------------------------------------------- 1 | { 2 | "packages": { 3 | "regolith-system-ubuntu": { 4 | "source": "https://github.com/regolith-linux/regolith-system-ubuntu.git", 5 | "ref": "main" 6 | }, 7 | "regolith-lightdm-config": { 8 | "source": "https://github.com/regolith-linux/regolith-lightdm-config.git", 9 | "ref": "master" 10 | }, 11 | "regolith-session": { 12 | "source": "https://github.com/regolith-linux/regolith-session.git", 13 | "ref": "main" 14 | }, 15 | "i3-snapshot": { 16 | "source": "https://github.com/regolith-linux/i3-snapshot.git", 17 | "ref": "master" 18 | }, 19 | "python3-i3ipc": { 20 | "source": "https://github.com/regolith-linux/python3-i3ipc", 21 | "ref": "master" 22 | }, 23 | "fonts-jetbrains-mono": { 24 | "source": "https://github.com/regolith-linux/fonts-jetbrains-mono.git", 25 | "ref": "master" 26 | }, 27 | "fonts-materialdesignicons-webfont": { 28 | "source": "https://github.com/regolith-linux/fonts-materialdesignicons-webfont.git", 29 | "ref": "master" 30 | }, 31 | "i3-wm": { 32 | "source": "https://github.com/regolith-linux/i3-wm.git", 33 | "ref": "main" 34 | }, 35 | "i3-gaps-wm": { 36 | "source": "https://github.com/regolith-linux/i3-gaps-wm.git", 37 | "ref": "main" 38 | }, 39 | "regolith-i3-config": { 40 | "source": "https://github.com/regolith-linux/regolith-i3-config.git", 41 | "ref": "master" 42 | }, 43 | "ayu-theme": { 44 | "source": "https://github.com/regolith-linux/ayu-theme.git", 45 | "ref": "master" 46 | }, 47 | "solarc-theme": { 48 | "source": "https://github.com/regolith-linux/solarc-theme.git", 49 | "ref": "master" 50 | }, 51 | "gruvbox-gtk": { 52 | "source": "https://github.com/regolith-linux/gruvbox-gtk.git", 53 | "ref": "master" 54 | }, 55 | "dracula-gtk": { 56 | "source": "https://github.com/regolith-linux/dracula-gtk.git", 57 | "ref": "master" 58 | }, 59 | "whitesur-gtk-theme": { 60 | "source": "https://github.com/regolith-linux/whitesur-gtk-theme.git", 61 | "ref": "debian" 62 | }, 63 | "regolith-look-default": { 64 | "source": "https://github.com/regolith-linux/regolith-look-default.git", 65 | "ref": "main" 66 | }, 67 | "regolith-look-extra": { 68 | "source": "https://github.com/regolith-linux/regolith-look-extra.git", 69 | "ref": "main" 70 | }, 71 | "i3-next-workspace": { 72 | "source": "https://github.com/regolith-linux/i3-next-workspace.git", 73 | "ref": "main" 74 | }, 75 | "i3-swap-focus": { 76 | "source": "https://github.com/regolith-linux/i3-swap-focus.git", 77 | "ref": "master" 78 | }, 79 | "i3xrocks": { 80 | "source": "https://github.com/regolith-linux/i3xrocks.git", 81 | "ref": "master" 82 | }, 83 | "regolith-i3xrocks-config": { 84 | "source": "https://github.com/regolith-linux/regolith-i3xrocks-config.git", 85 | "ref": "master" 86 | }, 87 | "regolith-desktop": { 88 | "source": "https://github.com/regolith-linux/regolith-desktop.git", 89 | "ref": "main" 90 | }, 91 | "regolith-ftue": { 92 | "source": "https://github.com/regolith-linux/regolith-ftue.git", 93 | "ref": "main" 94 | }, 95 | "regolith-compositor-none": { 96 | "source": "https://github.com/regolith-linux/regolith-compositor-none.git", 97 | "ref": "master" 98 | }, 99 | "regolith-compositor-xcompmgr": { 100 | "source": "https://github.com/regolith-linux/regolith-compositor-xcompmgr.git", 101 | "ref": "master" 102 | }, 103 | "regolith-compositor-compton-glx": { 104 | "source": "https://github.com/regolith-linux/regolith-compositor-compton-glx.git", 105 | "ref": "master" 106 | }, 107 | "picom": { 108 | "source": "https://github.com/regolith-linux/picom.git", 109 | "ref": "debian-v9" 110 | }, 111 | "regolith-compositor-picom-glx": { 112 | "source": "https://github.com/regolith-linux/regolith-compositor-picom-glx.git", 113 | "ref": "master" 114 | }, 115 | "remontoire": { 116 | "source": "https://github.com/regolith-linux/remontoire.git", 117 | "ref": "master" 118 | }, 119 | "ilia": { 120 | "source": "https://github.com/regolith-linux/ilia.git", 121 | "ref": "main" 122 | }, 123 | "lago": { 124 | "source": "https://github.com/regolith-linux/lago.git", 125 | "ref": "main" 126 | }, 127 | "regolith-rofi-config": { 128 | "source": "https://github.com/regolith-linux/regolith-rofi-config.git", 129 | "ref": "i3cp" 130 | }, 131 | "regolith-rofication": { 132 | "source": "https://github.com/regolith-linux/regolith-rofication.git", 133 | "ref": "master" 134 | }, 135 | "regolith-control-center": { 136 | "source": "https://github.com/regolith-linux/regolith-control-center.git", 137 | "ref": "main" 138 | }, 139 | "regolith-default-settings": { 140 | "source": "https://github.com/regolith-linux/regolith-default-settings.git", 141 | "ref": "main" 142 | }, 143 | "plymouth-theme-regolith": { 144 | "source": "https://github.com/regolith-linux/plymouth-theme-regolith.git", 145 | "ref": "master" 146 | }, 147 | "regolith-distro-ubuntu": { 148 | "source": "https://github.com/regolith-linux/regolith-distro-ubuntu.git", 149 | "ref": "main" 150 | }, 151 | "xrescat": { 152 | "source": "https://github.com/regolith-linux/xrescat.git", 153 | "ref": "master" 154 | }, 155 | "regolith-unclutter-xfixes": { 156 | "source": "https://github.com/regolith-linux/regolith-unclutter-xfixes.git", 157 | "ref": "master" 158 | }, 159 | "arc-icon-theme": { 160 | "source": "https://github.com/regolith-linux/arc-icon-theme.git", 161 | "ref": "main" 162 | }, 163 | "nordic": { 164 | "source": "https://github.com/regolith-linux/nordic.git", 165 | "ref": "main" 166 | }, 167 | "fonts-source-code-pro-ttf": { 168 | "source": "https://github.com/regolith-linux/fonts-source-code-pro-ttf.git", 169 | "ref": "main" 170 | }, 171 | "fonts-nerd-fonts": { 172 | "source": "https://github.com/regolith-linux/fonts-nerd-fonts.git", 173 | "ref": "debian" 174 | } 175 | } 176 | } -------------------------------------------------------------------------------- /stage/testing/package-model.json: -------------------------------------------------------------------------------- 1 | { 2 | "packages": { 3 | "regolith-system-ubuntu": { 4 | "source": "https://github.com/regolith-linux/regolith-system-ubuntu.git", 5 | "ref": "r2_1-beta2" 6 | }, 7 | "regolith-lightdm-config": { 8 | "source": "https://github.com/regolith-linux/regolith-lightdm-config.git", 9 | "ref": "r2_1-beta2" 10 | }, 11 | "regolith-session": { 12 | "source": "https://github.com/regolith-linux/regolith-session.git", 13 | "ref": "r2_1-beta2" 14 | }, 15 | "i3-snapshot": { 16 | "source": "https://github.com/regolith-linux/i3-snapshot.git", 17 | "ref": "r2_1-beta2" 18 | }, 19 | "python3-i3ipc": { 20 | "source": "https://github.com/regolith-linux/python3-i3ipc", 21 | "ref": "r2_1-beta2" 22 | }, 23 | "fonts-jetbrains-mono": { 24 | "source": "https://github.com/regolith-linux/fonts-jetbrains-mono.git", 25 | "ref": "r2_1-beta2" 26 | }, 27 | "fonts-materialdesignicons-webfont": { 28 | "source": "https://github.com/regolith-linux/fonts-materialdesignicons-webfont.git", 29 | "ref": "r2_1-beta2" 30 | }, 31 | "i3-wm": { 32 | "source": "https://github.com/regolith-linux/i3-wm.git", 33 | "ref": "r2_1-beta2" 34 | }, 35 | "i3-gaps-wm": { 36 | "source": "https://github.com/regolith-linux/i3-gaps-wm.git", 37 | "ref": "r2_1-beta2" 38 | }, 39 | "regolith-i3-config": { 40 | "source": "https://github.com/regolith-linux/regolith-i3-config.git", 41 | "ref": "r2_1-beta2" 42 | }, 43 | "ayu-theme": { 44 | "source": "https://github.com/regolith-linux/ayu-theme.git", 45 | "ref": "r2_1-beta2" 46 | }, 47 | "solarc-theme": { 48 | "source": "https://github.com/regolith-linux/solarc-theme.git", 49 | "ref": "r2_1-beta2" 50 | }, 51 | "gruvbox-gtk": { 52 | "source": "https://github.com/regolith-linux/gruvbox-gtk.git", 53 | "ref": "r2_1-beta2" 54 | }, 55 | "dracula-gtk": { 56 | "source": "https://github.com/regolith-linux/dracula-gtk.git", 57 | "ref": "r2_1-beta2" 58 | }, 59 | "whitesur-gtk-theme": { 60 | "source": "https://github.com/regolith-linux/whitesur-gtk-theme.git", 61 | "ref": "r2_1-beta2" 62 | }, 63 | "regolith-look-default": { 64 | "source": "https://github.com/regolith-linux/regolith-look-default.git", 65 | "ref": "r2_1-beta2" 66 | }, 67 | "regolith-look-extra": { 68 | "source": "https://github.com/regolith-linux/regolith-look-extra.git", 69 | "ref": "r2_1-beta2" 70 | }, 71 | "i3-next-workspace": { 72 | "source": "https://github.com/regolith-linux/i3-next-workspace.git", 73 | "ref": "r2_1-beta2" 74 | }, 75 | "i3-swap-focus": { 76 | "source": "https://github.com/regolith-linux/i3-swap-focus.git", 77 | "ref": "r2_1-beta2" 78 | }, 79 | "i3xrocks": { 80 | "source": "https://github.com/regolith-linux/i3xrocks.git", 81 | "ref": "r2_1-beta2" 82 | }, 83 | "regolith-i3xrocks-config": { 84 | "source": "https://github.com/regolith-linux/regolith-i3xrocks-config.git", 85 | "ref": "r2_1-beta2" 86 | }, 87 | "regolith-desktop": { 88 | "source": "https://github.com/regolith-linux/regolith-desktop.git", 89 | "ref": "r2_1-beta2" 90 | }, 91 | "regolith-ftue": { 92 | "source": "https://github.com/regolith-linux/regolith-ftue.git", 93 | "ref": "r2_1-beta2" 94 | }, 95 | "regolith-compositor-none": { 96 | "source": "https://github.com/regolith-linux/regolith-compositor-none.git", 97 | "ref": "r2_1-beta2" 98 | }, 99 | "regolith-compositor-xcompmgr": { 100 | "source": "https://github.com/regolith-linux/regolith-compositor-xcompmgr.git", 101 | "ref": "r2_1-beta2" 102 | }, 103 | "regolith-compositor-compton-glx": { 104 | "source": "https://github.com/regolith-linux/regolith-compositor-compton-glx.git", 105 | "ref": "r2_1-beta2" 106 | }, 107 | "picom": { 108 | "source": "https://github.com/regolith-linux/picom.git", 109 | "ref": "r2_1-beta2" 110 | }, 111 | "regolith-compositor-picom-glx": { 112 | "source": "https://github.com/regolith-linux/regolith-compositor-picom-glx.git", 113 | "ref": "r2_1-beta2" 114 | }, 115 | "remontoire": { 116 | "source": "https://github.com/regolith-linux/remontoire.git", 117 | "ref": "r2_1-beta2" 118 | }, 119 | "ilia": { 120 | "source": "https://github.com/regolith-linux/ilia.git", 121 | "ref": "r2_1-beta2" 122 | }, 123 | "lago": { 124 | "source": "https://github.com/regolith-linux/lago.git", 125 | "ref": "r2_1-beta2" 126 | }, 127 | "regolith-rofi-config": { 128 | "source": "https://github.com/regolith-linux/regolith-rofi-config.git", 129 | "ref": "r2_1-beta2" 130 | }, 131 | "regolith-rofication": { 132 | "source": "https://github.com/regolith-linux/regolith-rofication.git", 133 | "ref": "r2_1-beta2" 134 | }, 135 | "regolith-control-center": { 136 | "source": "https://github.com/regolith-linux/regolith-control-center.git", 137 | "ref": "r2_1-beta2" 138 | }, 139 | "regolith-default-settings": { 140 | "source": "https://github.com/regolith-linux/regolith-default-settings.git", 141 | "ref": "r2_1-beta2" 142 | }, 143 | "plymouth-theme-regolith": { 144 | "source": "https://github.com/regolith-linux/plymouth-theme-regolith.git", 145 | "ref": "r2_1-beta2" 146 | }, 147 | "regolith-distro-ubuntu": { 148 | "source": "https://github.com/regolith-linux/regolith-distro-ubuntu.git", 149 | "ref": "r2_1-beta2" 150 | }, 151 | "xrescat": { 152 | "source": "https://github.com/regolith-linux/xrescat.git", 153 | "ref": "r2_1-beta2" 154 | }, 155 | "regolith-unclutter-xfixes": { 156 | "source": "https://github.com/regolith-linux/regolith-unclutter-xfixes.git", 157 | "ref": "r2_1-beta2" 158 | }, 159 | "arc-icon-theme": { 160 | "source": "https://github.com/regolith-linux/arc-icon-theme.git", 161 | "ref": "r2_1-beta2" 162 | }, 163 | "nordic": { 164 | "source": "https://github.com/regolith-linux/nordic.git", 165 | "ref": "r2_1-beta2" 166 | }, 167 | "fonts-source-code-pro-ttf": { 168 | "source": "https://github.com/regolith-linux/fonts-source-code-pro-ttf.git", 169 | "ref": "r2_1-beta2" 170 | }, 171 | "fonts-nerd-fonts": { 172 | "source": "https://github.com/regolith-linux/fonts-nerd-fonts.git", 173 | "ref": "r2_1-beta2" 174 | } 175 | } 176 | } -------------------------------------------------------------------------------- /.github/workflows/build-rpm.yml: -------------------------------------------------------------------------------- 1 | name: RPM Package Builder 2 | 3 | on: 4 | workflow_dispatch: 5 | 6 | concurrency: 7 | group: rpm_builder 8 | cancel-in-progress: true 9 | 10 | jobs: 11 | build: 12 | runs-on: [self-hosted, Linux, X64, fedora, fedora-36] 13 | strategy: 14 | matrix: 15 | stage: [experimental] #, unstable, testing, release] 16 | distro-codename: [fedora-36-amd64] 17 | include: 18 | - distro-codename: fedora-36-amd64 19 | host-os: ubuntu-22.04 20 | arch: amd64 21 | distro: fedora 22 | codename: 36 23 | container: fedora:36 24 | steps: 25 | - uses: actions/checkout@v2 26 | - name: Set Job Parameters 27 | id: init 28 | run: | 29 | echo ::set-output name=MANIFEST_PATH::"${{ github.workspace }}/manifests" 30 | echo ::set-output name=PKG_REPO_PATH::"${{ github.workspace }}/repo" 31 | echo ::set-output name=PKG_BUILD_DIR::"${{ github.workspace }}/packages" 32 | echo ::set-output name=GH_REPO_ROOT::"${{ github.workspace }}" 33 | echo ::set-output name=stage::${{ matrix.stage }} 34 | echo ::set-output name=distro::${{ matrix.distro }} 35 | echo ::set-output name=codename::${{ matrix.codename }} 36 | echo ::set-output name=arch::${{ matrix.arch }} 37 | echo ::set-output name=target::${{ matrix.stage }}-${{ matrix.distro }}-${{ matrix.codename }}-${{ matrix.arch }} 38 | echo ::set-output name=repo_url::https://regolith-desktop.org/${{ matrix.stage }}-${{ matrix.distro }}-${{ matrix.codename }}-${{ matrix.arch }} 39 | - name: Env setup 40 | run: | 41 | set -e 42 | mkdir ${{ steps.init.outputs.MANIFEST_PATH }} || true 43 | mkdir ${{ steps.init.outputs.PKG_BUILD_DIR }} || true 44 | sudo dnf install -y mock 45 | - name: Pull Manifest 46 | run: | 47 | set -e 48 | wget -P "${{ steps.init.outputs.PKG_REPO_PATH }}" "https://regolith-desktop.org/${{ steps.init.outputs.target }}/manifest.txt" || true 49 | echo "Previous manifest:" 50 | cat ${{ steps.init.outputs.PKG_REPO_PATH }}/manifest.txt || true 51 | - name: Check for changes 52 | id: changes 53 | run: | 54 | set -e 55 | set -x 56 | CHANGE_OUTPUT=$(${{ steps.init.outputs.GH_REPO_ROOT }}/.github/scripts/main.sh \ 57 | ${{ steps.init.outputs.GH_REPO_ROOT }} \ 58 | ${{ steps.init.outputs.GH_REPO_ROOT }}/.github/scripts/ext-rpm.sh \ 59 | "${{ steps.init.outputs.stage }}" \ 60 | "${{ steps.init.outputs.distro }}" \ 61 | "${{ steps.init.outputs.codename }}" \ 62 | "${{ steps.init.outputs.arch }}" \ 63 | "unneeded to check change" \ 64 | "unneeded to check change" \ 65 | check \ 66 | ${{ steps.init.outputs.MANIFEST_PATH }} \ 67 | ${{ steps.init.outputs.PKG_REPO_PATH }} \ 68 | ${{ steps.init.outputs.PKG_BUILD_DIR }} | tail -n1) 69 | if [ "$CHANGE_OUTPUT" == "No package changes found, exiting." ]; then 70 | echo ::set-output name=changed::0 71 | echo "No package changes to build" 72 | else 73 | echo ::set-output name=changed::1 74 | echo "New Manifest: " 75 | cat ${{ steps.init.outputs.MANIFEST_PATH }}/next-manifest.txt 76 | fi 77 | - uses: webfactory/ssh-agent@v0.5.4 78 | if: steps.changes.outputs.changed == 1 79 | with: 80 | ssh-private-key: ${{ secrets.KAMATERA_SSH_KEY }} 81 | - name: Pull repo 82 | if: steps.changes.outputs.changed == 1 83 | run: | 84 | set -e 85 | set -x 86 | ssh-keyscan -H ${{ secrets.KAMATERA_HOSTNAME }} >> ~/.ssh/known_hosts 87 | scp -r root@${{ secrets.KAMATERA_HOSTNAME }}:/var/www/html/${{ steps.init.outputs.target }}/* "${{ steps.init.outputs.PKG_REPO_PATH }}" \ 88 | || mkdirs "${{ steps.init.outputs.PKG_REPO_PATH }}" || true 89 | - name: Build 90 | if: steps.changes.outputs.changed == 1 91 | run: | 92 | set -e 93 | set -x 94 | export DEBEMAIL="regolith.linux@gmail.com" 95 | export DEBFULLNAME="Regolith Linux" 96 | export DEBIAN_FRONTEND=noninteractive 97 | mkdir -p ~/.gnupg/ 98 | printf "${{ secrets.PACKAGE_PRIVATE_KEY }}" | base64 --decode > ~/.gnupg/private.key 99 | gpg --batch --import ~/.gnupg/private.key 100 | ${{ steps.init.outputs.GH_REPO_ROOT }}/.github/scripts/main.sh \ 101 | ${{ steps.init.outputs.GH_REPO_ROOT }} \ 102 | ${{ steps.init.outputs.GH_REPO_ROOT }}/.github/scripts/ext-rpm.sh \ 103 | "${{ steps.init.outputs.stage }}" \ 104 | "${{ steps.init.outputs.distro }}" \ 105 | "${{ steps.init.outputs.codename }}" \ 106 | "${{ steps.init.outputs.arch }}" \ 107 | "${{ steps.init.outputs.repo_url }}" \ 108 | Default \ 109 | build \ 110 | ${{ steps.init.outputs.MANIFEST_PATH }} \ 111 | ${{ steps.init.outputs.PKG_REPO_PATH }} \ 112 | ${{ steps.init.outputs.PKG_BUILD_DIR }} | tee -a ${{ steps.init.outputs.GH_REPO_ROOT }}/CHANGELOG_${{ steps.init.outputs.target }}.raw.txt 113 | if [ -s "${{ steps.init.outputs.PKG_REPO_PATH }}/manifest.txt" ]; then 114 | cat ${{ steps.init.outputs.GH_REPO_ROOT }}/CHANGELOG_${{ steps.init.outputs.target }}.raw.txt | grep ^CHLOG: | cut -c 7- > ${{ steps.init.outputs.GH_REPO_ROOT }}/CHANGELOG_${{ steps.init.outputs.target }}.txt 115 | else 116 | echo "Manifest is empty, build failed" 117 | exit 1 118 | fi 119 | - name: Deploy via rsync 120 | if: steps.changes.outputs.changed == 1 121 | run: | 122 | set -e 123 | set -x 124 | rsync -avzh ${{ steps.init.outputs.PKG_REPO_PATH }}/* root@${{ secrets.KAMATERA_HOSTNAME }}:/var/www/html/${{ steps.init.outputs.target }} 125 | - name: Inspect Manifest 126 | if: steps.changes.outputs.changed == 1 127 | run: | 128 | cat ${{ steps.init.outputs.PKG_REPO_PATH }}/manifest.txt || true 129 | - uses: actions/upload-artifact@v3 130 | if: steps.changes.outputs.changed == 1 131 | with: 132 | name: CHANGELOG_${{ steps.init.outputs.target }} 133 | path: | 134 | ${{ steps.init.outputs.GH_REPO_ROOT }}/CHANGELOG_${{ steps.init.outputs.target }}.txt 135 | -------------------------------------------------------------------------------- /.github/scripts/main.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | # Emit manifest entry line for package 5 | handle_package() { 6 | # Get git hash 7 | local COMMIT_HASH=$(git ls-remote $PACAKGE_SOURCE_URL $PACKAGE_SOURCE_REF | awk '{ print $1}') 8 | 9 | echo "$PACKAGE_NAME $PACAKGE_SOURCE_URL $PACKAGE_SOURCE_REF $COMMIT_HASH" >> "$NEXT_MANIFEST_FILE" 10 | 11 | echo "Updated manifest $NEXT_MANIFEST_FILE for package $PACKAGE_NAME" 12 | } 13 | 14 | # Traverse each package in the model and call handle_package 15 | traverse_package_model() { 16 | jq -rc 'delpaths([path(.[][]| select(.==null))]) | .packages | keys | .[]' < "$PACKAGE_MODEL_FILE" | while IFS='' read -r package; do 17 | # Set the package name and model desc 18 | PACKAGE_NAME="$package" 19 | 20 | # If a package filter was specified, match filter. 21 | if [[ -n "$PACKAGE_FILTER" && "$PACKAGE_FILTER" != "$PACKAGE_NAME" ]]; then 22 | continue 23 | fi 24 | 25 | PACAKGE_SOURCE_URL=$(jq -r ".packages.\"$package\".source" < "$PACKAGE_MODEL_FILE") 26 | PACKAGE_SOURCE_REF=$(jq -r ".packages.\"$package\".ref" < "$PACKAGE_MODEL_FILE") 27 | 28 | # Apply functions to package model 29 | handle_package 30 | done 31 | } 32 | 33 | # Generate a json file from a root and any additions in each level of the stage tree 34 | merge_models() { 35 | if [ ! -f "$ROOT_MODEL_PATH" ]; then 36 | echo "Invalid root model path: $ROOT_MODEL_PATH" 37 | exit 1 38 | fi 39 | 40 | if [ ! -d "$MANIFEST_PATH" ]; then 41 | mkdir -p "$MANIFEST_PATH" 42 | fi 43 | 44 | # Copy root model to build dir 45 | WORKING_ROOT_MODEL="$MANIFEST_PATH/root-model.json" 46 | cp "$ROOT_MODEL_PATH" "$WORKING_ROOT_MODEL" 47 | 48 | # Optionally merge stage package model 49 | STAGE_PACKAGE_MODEL="$REPO_ROOT/stage/$STAGE/package-model.json" 50 | WORKING_STAGE_MODEL="$MANIFEST_PATH/$STAGE-model.json" 51 | if [ -f "$STAGE_PACKAGE_MODEL" ]; then 52 | jq -s '.[0] * .[1]' "$WORKING_ROOT_MODEL" "$STAGE_PACKAGE_MODEL" > "$WORKING_STAGE_MODEL" 53 | else 54 | cp "$WORKING_ROOT_MODEL" "$WORKING_STAGE_MODEL" 55 | fi 56 | 57 | # Optionally merge distro package model 58 | DISTRO_PACKAGE_MODEL="$REPO_ROOT/stage/$STAGE/$DISTRO/package-model.json" 59 | WORKING_DISTRO_MODEL="$MANIFEST_PATH/$STAGE-$DISTRO-model.json" 60 | if [ -f "$DISTRO_PACKAGE_MODEL" ]; then 61 | jq -s '.[0] * .[1]' "$WORKING_STAGE_MODEL" "$DISTRO_PACKAGE_MODEL" > "$WORKING_DISTRO_MODEL" 62 | else 63 | cp "$WORKING_STAGE_MODEL" "$WORKING_DISTRO_MODEL" 64 | fi 65 | 66 | # Optionally merge codename package model 67 | CODENAME_PACKAGE_MODEL="$REPO_ROOT/stage/$STAGE/$DISTRO/$CODENAME/package-model.json" 68 | WORKING_CODENAME_MODEL="$MANIFEST_PATH/$STAGE-$DISTRO-$CODENAME-model.json" 69 | if [ -f "$CODENAME_PACKAGE_MODEL" ]; then 70 | jq -s '.[0] * .[1]' "$WORKING_DISTRO_MODEL" "$CODENAME_PACKAGE_MODEL" > "$WORKING_CODENAME_MODEL" 71 | else 72 | cp "$WORKING_DISTRO_MODEL" "$WORKING_CODENAME_MODEL" 73 | fi 74 | 75 | # Optionally merge arch package model 76 | ARCH_PACKAGE_MODEL="$REPO_ROOT/stage/$STAGE/$DISTRO/$CODENAME/$ARCH/package-model.json" 77 | WORKING_ARCH_MODEL="$MANIFEST_PATH/$STAGE-$DISTRO-$CODENAME-$ARCH-model.json" 78 | if [ -f "$ARCH_PACKAGE_MODEL" ]; then 79 | jq -s '.[0] * .[1]' "$WORKING_CODENAME_MODEL" "$ARCH_PACKAGE_MODEL" > "$WORKING_ARCH_MODEL" 80 | else 81 | cp "$WORKING_CODENAME_MODEL" "$WORKING_ARCH_MODEL" 82 | fi 83 | 84 | PACKAGE_MODEL_FILE="$WORKING_ARCH_MODEL" 85 | } 86 | 87 | # Traverse the stage tree and execute any found setup.sh scripts 88 | source_setup_scripts() { 89 | local setup_script_locations=( 90 | "$REPO_ROOT/stage/setup.sh" 91 | "$REPO_ROOT/stage/$STAGE/setup.sh" 92 | "$REPO_ROOT/stage/$STAGE/$DISTRO/setup.sh" 93 | "$REPO_ROOT/stage/$STAGE/$DISTRO/$CODENAME/setup.sh" 94 | "$REPO_ROOT/stage/$STAGE/$DISTRO/$CODENAME/$ARCH/setup.sh" 95 | ) 96 | 97 | for setup_file in "${setup_script_locations[@]}" 98 | do 99 | if [ -f "$setup_file" ]; then 100 | echo "Executing setup file $setup_file..." 101 | source "$setup_file" 102 | fi 103 | done 104 | } 105 | 106 | build_packages() { 107 | echo "Building Packages:" 108 | echo $PACKAGE_CHANGES 109 | 110 | set -x 111 | 112 | while IFS= read -r PKG_LINE; do 113 | PACKAGE_NAME=$(echo "$PKG_LINE" | cut -d" " -f1) 114 | PACKAGE_URL=$(echo "$PKG_LINE" | cut -d" " -f2) 115 | PACKAGE_REF=$(echo "$PKG_LINE" | cut -d" " -f3) 116 | 117 | echo "Building $PACKAGE_NAME" 118 | 119 | checkout 120 | update_changelog 121 | if dist_valid; then 122 | stage_source 123 | build_src_package 124 | build_bin_package 125 | publish 126 | else 127 | echo "dist codename does not match in package changelog, ignoring $PACKAGE_NAME." 128 | fi 129 | done <<< "$PACKAGE_CHANGES" 130 | 131 | echo "Completed building packages" 132 | } 133 | 134 | #### Init input params 135 | 136 | REPO_ROOT=$(realpath "$1") 137 | EXTENSION=$2 138 | STAGE=$3 139 | DISTRO=$4 140 | CODENAME=$5 141 | ARCH=$6 142 | PACKAGE_REPO_URL=$7 143 | APT_KEY=$8 144 | MODE=$9 145 | MANIFEST_PATH=${10} 146 | PKG_REPO_PATH=${11} 147 | PKG_BUILD_DIR=${12} 148 | 149 | 150 | GIT_EXT="$REPO_ROOT/.github/scripts/ext-git.sh" 151 | if [ ! -f "$GIT_EXT" ]; then 152 | echo "Extension $GIT_EXT doesn't exist, aborting." 153 | exit 1 154 | else 155 | source $GIT_EXT 156 | fi 157 | 158 | if [ ! -f "$EXTENSION" ]; then 159 | echo "Extension $EXTENSION doesn't exist, aborting." 160 | exit 1 161 | else 162 | source $EXTENSION 163 | fi 164 | 165 | #### Init globals 166 | 167 | ROOT_MODEL_PATH="$REPO_ROOT/stage/package-model.json" 168 | 169 | #### Setup files 170 | 171 | if [ -d "$MANIFEST_PATH" ]; then 172 | echo "Deleting pre-existing manifest dir $MANIFEST_PATH" 173 | rm -Rf "$MANIFEST_PATH" 174 | fi 175 | 176 | if [ -d "$PKG_BUILD_DIR" ]; then 177 | echo "Deleting pre-existing package build dir $PKG_BUILD_DIR" 178 | rm -Rf "$PKG_BUILD_DIR" 179 | fi 180 | 181 | if [ ! -d "$MANIFEST_PATH" ]; then 182 | mkdir -p $MANIFEST_PATH 183 | fi 184 | 185 | if [ ! -d "$PKG_REPO_PATH" ]; then 186 | mkdir -p $PKG_REPO_PATH 187 | fi 188 | 189 | #### Generate Manifest from package model tree and git repo state 190 | 191 | PREV_MANIFEST_FILE="$PKG_REPO_PATH/manifest.txt" 192 | NEXT_MANIFEST_FILE="$MANIFEST_PATH/next-manifest.txt" 193 | 194 | # Create prev manifest if doesn't exist (first run) 195 | if [ ! -f "$PREV_MANIFEST_FILE" ]; then 196 | touch "$PREV_MANIFEST_FILE" 197 | fi 198 | 199 | # Delete pre-existing manifest before generating new 200 | if [ -f "$NEXT_MANIFEST_FILE" ]; then 201 | mv "$NEXT_MANIFEST_FILE" "$MANIFEST_PATH/prev-manifest.txt" 202 | echo "Moved pre-existing manifest file $NEXT_MANIFEST_FILE to $MANIFEST_PATH/prev-manifest.txt" 203 | fi 204 | 205 | # Merge models across stage, distro, codename, arch 206 | merge_models 207 | # Iterate over each package in the model and call handle_package 208 | traverse_package_model 209 | 210 | #### Find packages that need to be built 211 | echo Diffing "$PREV_MANIFEST_FILE" "$NEXT_MANIFEST_FILE" 212 | PACKAGE_CHANGES=$(diff "$PREV_MANIFEST_FILE" "$NEXT_MANIFEST_FILE" | grep '^[>][^>]' | cut -c3- | uniq | sort) 213 | echo "Package diff: $PACKAGE_CHANGES" 214 | 215 | if [ -z "$PACKAGE_CHANGES" ]; then 216 | echo "No package changes found, exiting." 217 | exit 0 218 | fi 219 | 220 | if [ "$MODE" == "build" ]; then 221 | #### Build packages 222 | 223 | setup 224 | build_packages 225 | 226 | #### Cleanup 227 | 228 | rm "$PREV_MANIFEST_FILE" 229 | mv "$NEXT_MANIFEST_FILE" "$PREV_MANIFEST_FILE" 230 | else 231 | echo "$PACKAGE_CHANGES" 232 | fi 233 | -------------------------------------------------------------------------------- /.github/workflows/build-deb-v4.yml: -------------------------------------------------------------------------------- 1 | name: Debian Package Builder v4 2 | 3 | on: 4 | workflow_dispatch: 5 | 6 | concurrency: 7 | group: debian_builder_v4 8 | cancel-in-progress: true 9 | 10 | jobs: 11 | build: 12 | runs-on: ${{ matrix.host-os }} 13 | strategy: 14 | matrix: 15 | stage: [experimental, unstable, testing, release] 16 | distro-codename: [ubuntu-focal-amd64, ubuntu-focal-arm64, ubuntu-jammy-amd64, ubuntu-jammy-arm64, debian-bullseye-amd64, debian-bullseye-arm64, debian-testing-amd64, debian-testing-arm64] 17 | exclude: 18 | - stage: release 19 | distro-codename: debian-testing-amd64 20 | - stage: testing 21 | distro-codename: debian-testing-amd64 22 | - stage: release 23 | distro-codename: debian-testing-arm64 24 | - stage: testing 25 | distro-codename: debian-testing-arm64 26 | - stage: unstable 27 | distro-codename: debian-testing-arm64 28 | include: 29 | - distro-codename: ubuntu-focal-amd64 30 | host-os: ubuntu-20.04 31 | arch: amd64 32 | distro: ubuntu 33 | codename: focal 34 | - distro-codename: ubuntu-focal-arm64 35 | host-os: [self-hosted, Linux, arm64, focal] 36 | arch: arm64 37 | distro: ubuntu 38 | codename: focal 39 | - distro-codename: ubuntu-jammy-amd64 40 | host-os: ubuntu-22.04 41 | arch: amd64 42 | distro: ubuntu 43 | codename: jammy 44 | - distro-codename: ubuntu-jammy-arm64 45 | host-os: [self-hosted, Linux, arm64, jammy] 46 | arch: arm64 47 | distro: ubuntu 48 | codename: jammy 49 | - distro-codename: debian-bullseye-amd64 50 | host-os: ubuntu-20.04 51 | arch: amd64 52 | distro: debian 53 | codename: bullseye 54 | - distro-codename: debian-bullseye-arm64 55 | host-os: [self-hosted, Linux, arm64, focal] 56 | arch: arm64 57 | distro: debian 58 | codename: bullseye 59 | - distro-codename: debian-testing-amd64 60 | host-os: [self-hosted, Linux, X64, bookworm] 61 | arch: amd64 62 | distro: debian 63 | codename: testing 64 | - distro-codename: debian-testing-arm64 65 | host-os: [self-hosted, Linux, arm64, focal] 66 | arch: arm64 67 | distro: debian 68 | codename: testing 69 | steps: 70 | - uses: actions/checkout@v2 71 | - name: Set Job Parameters 72 | id: init 73 | run: | 74 | echo ::set-output name=MANIFEST_PATH::"${{ github.workspace }}/manifests" 75 | echo ::set-output name=PKG_REPO_PATH::"${{ github.workspace }}/repo" 76 | echo ::set-output name=PKG_BUILD_DIR::"${{ github.workspace }}/packages" 77 | echo ::set-output name=GH_REPO_ROOT::"${{ github.workspace }}" 78 | echo ::set-output name=stage::${{ matrix.stage }} 79 | echo ::set-output name=distro::${{ matrix.distro }} 80 | echo ::set-output name=codename::${{ matrix.codename }} 81 | echo ::set-output name=arch::${{ matrix.arch }} 82 | echo ::set-output name=target::${{ matrix.stage }}-${{ matrix.distro }}-${{ matrix.codename }}-${{ matrix.arch }} 83 | echo ::set-output name=repo_url::https://regolith-desktop.org/${{ matrix.stage }}-${{ matrix.distro }}-${{ matrix.codename }}-${{ matrix.arch }} 84 | - name: Env setup 85 | run: | 86 | set -e 87 | mkdir ${{ steps.init.outputs.MANIFEST_PATH }} || true 88 | mkdir ${{ steps.init.outputs.PKG_BUILD_DIR }} || true 89 | wget -qO - https://regolith-desktop.org/regolith.key | sudo apt-key add - 90 | echo deb "[arch=${{ steps.init.outputs.arch }}] ${{ steps.init.outputs.repo_url }} ${{ steps.init.outputs.codename }} main" | sudo tee /etc/apt/sources.list.d/regolith.list 91 | sudo apt update 92 | DEBIAN_FRONTEND=noninteractive sudo apt install -y --no-install-recommends jq git devscripts reprepro wget 93 | - name: Pull Manifest 94 | run: | 95 | set -e 96 | wget -P "${{ steps.init.outputs.PKG_REPO_PATH }}" "https://regolith-desktop.org/${{ steps.init.outputs.target }}/manifest.txt" || true 97 | echo "Previous manifest:" 98 | cat ${{ steps.init.outputs.PKG_REPO_PATH }}/manifest.txt || true 99 | - name: Check for changes 100 | id: changes 101 | run: | 102 | set -e 103 | set -x 104 | CHANGE_OUTPUT=$(${{ steps.init.outputs.GH_REPO_ROOT }}/.github/scripts/main.sh \ 105 | ${{ steps.init.outputs.GH_REPO_ROOT }} \ 106 | ${{ steps.init.outputs.GH_REPO_ROOT }}/.github/scripts/ext-debian.sh \ 107 | "${{ steps.init.outputs.stage }}" \ 108 | "${{ steps.init.outputs.distro }}" \ 109 | "${{ steps.init.outputs.codename }}" \ 110 | "${{ steps.init.outputs.arch }}" \ 111 | "unneeded to check change" \ 112 | "unneeded to check change" \ 113 | check \ 114 | ${{ steps.init.outputs.MANIFEST_PATH }} \ 115 | ${{ steps.init.outputs.PKG_REPO_PATH }} \ 116 | ${{ steps.init.outputs.PKG_BUILD_DIR }} | tail -n1) 117 | if [ "$CHANGE_OUTPUT" == "No package changes found, exiting." ]; then 118 | echo ::set-output name=changed::0 119 | echo "No package changes to build" 120 | else 121 | echo ::set-output name=changed::1 122 | echo "New Manifest: " 123 | cat ${{ steps.init.outputs.MANIFEST_PATH }}/next-manifest.txt 124 | fi 125 | - uses: webfactory/ssh-agent@v0.5.4 126 | if: steps.changes.outputs.changed == 1 127 | with: 128 | ssh-private-key: ${{ secrets.KAMATERA_SSH_KEY }} 129 | - name: Pull repo 130 | if: steps.changes.outputs.changed == 1 131 | run: | 132 | set -e 133 | set -x 134 | ssh-keyscan -H ${{ secrets.KAMATERA_HOSTNAME }} >> ~/.ssh/known_hosts 135 | scp -r root@${{ secrets.KAMATERA_HOSTNAME }}:/var/www/html/${{ steps.init.outputs.target }}/* "${{ steps.init.outputs.PKG_REPO_PATH }}" \ 136 | || mkdirs "${{ steps.init.outputs.PKG_REPO_PATH }}" || true 137 | - name: Build 138 | if: steps.changes.outputs.changed == 1 139 | run: | 140 | set -e 141 | set -x 142 | export DEBEMAIL="regolith.linux@gmail.com" 143 | export DEBFULLNAME="Regolith Linux" 144 | export DEBIAN_FRONTEND=noninteractive 145 | mkdir -p ~/.gnupg/ 146 | printf "${{ secrets.PACKAGE_PRIVATE_KEY }}" | base64 --decode > ~/.gnupg/private.key 147 | gpg --batch --import ~/.gnupg/private.key 148 | ${{ steps.init.outputs.GH_REPO_ROOT }}/.github/scripts/main.sh \ 149 | ${{ steps.init.outputs.GH_REPO_ROOT }} \ 150 | ${{ steps.init.outputs.GH_REPO_ROOT }}/.github/scripts/ext-debian.sh \ 151 | "${{ steps.init.outputs.stage }}" \ 152 | "${{ steps.init.outputs.distro }}" \ 153 | "${{ steps.init.outputs.codename }}" \ 154 | "${{ steps.init.outputs.arch }}" \ 155 | "${{ steps.init.outputs.repo_url }}" \ 156 | Default \ 157 | build \ 158 | ${{ steps.init.outputs.MANIFEST_PATH }} \ 159 | ${{ steps.init.outputs.PKG_REPO_PATH }} \ 160 | ${{ steps.init.outputs.PKG_BUILD_DIR }} | tee -a ${{ steps.init.outputs.GH_REPO_ROOT }}/CHANGELOG_${{ steps.init.outputs.target }}.raw.txt 161 | if [ -s "${{ steps.init.outputs.PKG_REPO_PATH }}/manifest.txt" ]; then 162 | cat ${{ steps.init.outputs.GH_REPO_ROOT }}/CHANGELOG_${{ steps.init.outputs.target }}.raw.txt | grep ^CHLOG: | cut -c 7- > ${{ steps.init.outputs.GH_REPO_ROOT }}/CHANGELOG_${{ steps.init.outputs.target }}.txt 163 | else 164 | echo "Manifest is empty, build failed" 165 | exit 1 166 | fi 167 | - name: Deploy via rsync 168 | if: steps.changes.outputs.changed == 1 169 | run: | 170 | set -e 171 | set -x 172 | rsync -avzh ${{ steps.init.outputs.PKG_REPO_PATH }}/* root@${{ secrets.KAMATERA_HOSTNAME }}:/var/www/html/${{ steps.init.outputs.target }} 173 | - name: Inspect Manifest 174 | if: steps.changes.outputs.changed == 1 175 | run: | 176 | cat ${{ steps.init.outputs.PKG_REPO_PATH }}/manifest.txt || true 177 | - uses: actions/upload-artifact@v3 178 | if: steps.changes.outputs.changed == 1 179 | with: 180 | name: CHANGELOG_${{ steps.init.outputs.target }} 181 | path: | 182 | ${{ steps.init.outputs.GH_REPO_ROOT }}/CHANGELOG_${{ steps.init.outputs.target }}.txt 183 | test: 184 | needs: build 185 | uses: ./.github/workflows/test-desktop-installable2.yml 186 | generate-release: 187 | needs: build 188 | runs-on: ubuntu-20.04 189 | steps: 190 | - uses: actions/download-artifact@v3 191 | - name: Concat Release Notes 192 | id: release-setup 193 | run: | 194 | set -e 195 | echo ::set-output name=TIMESTAMP::"$(date +%Y%m%d_%H%M%S)" 196 | FILES=$(find . -name CHANGELOG\*) 197 | if [ -n "$FILES" ]; then 198 | cat CHANGELOG_*/CHANGELOG_*.txt >> CHANGELOG.txt 199 | echo ::set-output name=changed::1 200 | else 201 | echo ::set-output name=changed::0 202 | fi 203 | - uses: softprops/action-gh-release@v1 204 | if: steps.release-setup.outputs.changed == 1 205 | with: 206 | body: See CHANGELOG.txt for updates and manifests for current state of repos. 207 | name: Package Build ${{ steps.release-setup.outputs.TIMESTAMP }} 208 | tag_name: pkgbuild-${{ steps.release-setup.outputs.TIMESTAMP }} 209 | files: | 210 | *.txt --------------------------------------------------------------------------------