diff --git a/.github/workflows/wrap.yml b/.github/workflows/wrap.yml new file mode 100644 index 00000000..91f71c69 --- /dev/null +++ b/.github/workflows/wrap.yml @@ -0,0 +1,153 @@ +# SPDX-FileCopyrightText: 2023 fosslinux +# SPDX-FileCopyrightText: 2024 Max Hearnden +# +# SPDX-License-Identifier: GPL-3.0-or-later + +name: Run under wrap + +on: + workflow_dispatch: + pull_request: + push: + branches: + - master + +jobs: + pass1: + name: Run up to Linux build under wrap + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v3 + with: + submodules: recursive + # There is a strange bug(?) in nongnu, when you clone a git repository + # against a commit != HEAD with depth=1, it errors out. + fetch-depth: 0 + - name: Query cache for sources + id: cache + uses: actions/cache/restore@v3 + with: + path: | + distfiles + key: cache-${{ hashFiles('steps/*/sources') }} + - name: Get sources + if: steps.cache.outputs.cache-hit != 'true' + run: ./download-distfiles.sh + - name: Cache sources + if: steps.cache.outputs.cache-hit != 'true' + uses: actions/cache/save@v3 + with: + path: | + distfiles + key: cache-${{ hashFiles('steps/*/sources') }} + - name: Run bootstrap + run: ./rootfs.py --wrap --external-sources --build-kernels --cores 2 --internal-ci pass1 + - name: Archive created packages + if: failure() # archive failed builds progress + uses: actions/upload-artifact@v3 + with: + name: packages + path: target/external/repo/** + - name: Tar pass1 image + run: tar -cf pass1_image.tar target + - name: Archive pass1_image + uses: actions/upload-artifact@v3 + with: + name: internal_pass1_image + path: pass1_image.tar + + pass2: + name: Run up to Python bootstrap under wrap + needs: pass1 + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v3 + with: + submodules: recursive + # There is a strange bug(?) in nongnu, when you clone a git repository + # against a commit != HEAD with depth=1, it errors out. + fetch-depth: 0 + - name: Get pass1_image + uses: actions/download-artifact@v3 + with: + name: internal_pass1_image + - name: Extract pass1_image + run: tar -xf pass1_image.tar + - name: Query cache for sources + id: cache + uses: actions/cache/restore@v3 + with: + path: | + distfiles + key: cache-${{ hashFiles('steps/*/sources') }} + - name: Get sources + if: steps.cache.outputs.cache-hit != 'true' + run: ./download-distfiles.sh + - name: Cache sources + if: steps.cache.outputs.cache-hit != 'true' + uses: actions/cache/save@v3 + with: + path: | + distfiles + key: cache-${{ hashFiles('steps/*/sources') }} + - name: Run bootstrap + run: ./rootfs.py --wrap --external-sources --build-kernels --cores 2 --internal-ci pass2 + - name: Archive created packages + if: failure() # archive failed builds progress + uses: actions/upload-artifact@v3 + with: + name: internal_packages_pass2 + path: target/external/repo/** + - name: Tar pass2 image + run: tar -cf pass2_image.tar target + - name: Archive pass2_image + uses: actions/upload-artifact@v3 + with: + name: internal_pass2_image + path: pass2_image.tar + + pass3: + name: Run remaining builds under wrap + needs: pass2 + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v3 + with: + submodules: recursive + # There is a strange bug(?) in nongnu, when you clone a git repository + # against a commit != HEAD with depth=1, it errors out. + fetch-depth: 0 + - name: Get pass2_image + uses: actions/download-artifact@v3 + with: + name: internal_pass2_image + - name: Extract pass2_image + run: tar -xf pass2_image.tar + - name: Query cache for sources + id: cache + uses: actions/cache/restore@v3 + with: + path: | + distfiles + key: cache-${{ hashFiles('steps/*/sources') }} + - name: Get sources + if: steps.cache.outputs.cache-hit != 'true' + run: ./download-distfiles.sh + - name: Cache sources + if: steps.cache.outputs.cache-hit != 'true' + uses: actions/cache/save@v3 + with: + path: | + distfiles + key: cache-${{ hashFiles('steps/*/sources') }} + - name: Run bootstrap + run: ./rootfs.py --wrap --external-sources --build-kernels --cores 2 --internal-ci pass3 + - name: Archive created packages + if: always() # archive both failed and successful builds + uses: actions/upload-artifact@v3 + with: + name: packages + path: target/external/repo/** diff --git a/lib/generator.py b/lib/generator.py index 8ccaafbb..1e41f9d3 100755 --- a/lib/generator.py +++ b/lib/generator.py @@ -42,7 +42,13 @@ class Generator(): self.external_dir = os.path.join(self.target_dir, 'external') self.distfiles() - def prepare(self, target, using_kernel=False, kernel_bootstrap=False, wrap=False, target_size=0): + # pylint: disable=too-many-arguments + def prepare(self, + target, + using_kernel=False, + kernel_bootstrap=False, + wrap=False, + target_size=0): """ Prepare basic media of live-bootstrap. /steps -- contains steps to be built @@ -141,8 +147,10 @@ class Generator(): if os.path.isfile(os.path.join(seed_dir, entry)): shutil.copy2(os.path.join(seed_dir, entry), os.path.join(self.target_dir, entry)) if wrap: - shutil.copy2(os.path.join(seed_dir, 'after-wrap.kaem'), os.path.join(self.target_dir, 'after.kaem')) - shutil.copy2(os.path.join(seed_dir, 'after.kaem'), os.path.join(self.target_dir, 'after-wrapped.kaem')) + shutil.copy2(os.path.join(seed_dir, 'after-wrap.kaem'), + os.path.join(self.target_dir, 'after.kaem')) + shutil.copy2(os.path.join(seed_dir, 'after.kaem'), + os.path.join(self.target_dir, 'after-wrapped.kaem')) def distfiles(self): """Copy in distfiles""" diff --git a/rootfs.py b/rootfs.py index a68e5998..87fb29d2 100755 --- a/rootfs.py +++ b/rootfs.py @@ -243,10 +243,15 @@ print(shutil.which('chroot')) init) elif args.wrap: - generator.prepare(target, wrap = True) arch = stage0_arch_map.get(args.arch, args.arch) - init = os.path.join('bootstrap-seeds', 'POSIX', arch, 'kaem-optional-seed') - run(init, cwd = generator.target_dir) + if not args.internal_ci or args.internal_ci == "pass1": + generator.prepare(target, wrap = True) + arg_list = [os.path.join('bootstrap-seeds', 'POSIX', arch, 'kaem-optional-seed')] + else: + generator.reuse(target) + arg_list = [os.path.join(arch, 'bin', 'wrap'), '/init'] + + run(*arg_list, cwd = generator.target_dir) elif args.bare_metal: if args.kernel: