diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index e9e6834..ff7b4b5 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -4,7 +4,7 @@ "name": "Existing Dockerfile", // "build": { // "context": "..", - // "dockerfile": "../Dockerfile", + // "dockerfile": "../Containerfile", // "args": { // "version": "39" // } @@ -13,4 +13,5 @@ "overrideCommand": true, "shutdownAction": "stopContainer", "privileged": true -} \ No newline at end of file +} + diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index a188b67..331afa3 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -124,7 +124,7 @@ jobs: image_repo: ${{ env.IMAGE_REPO}} version: ${{ env.VERSION }} variant: ${{ env.VARIANT }} - action_version: ${{ steps.meta.outputs.tags }} + action_version: ${{ steps.meta.outputs.tags || 'latest' }} - name: Rename ISO run: | diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index f6a4b49..0000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,34 +0,0 @@ -on: - push: - tags: - - 'v[0-9]+.[0-9]+.[0-9]+' - -jobs: - release: - runs-on: ubuntu-latest - steps: - - name: Create Draft Release - id: create_release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: ${{ github.ref_name }} - release_name: "Release ${{ github.ref_name }}" - draft: true - prerelease: false - - #- uses: actions/upload-release-asset@v1.0.1 - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # with: - # upload_url: ${{ steps.create_release.outputs.upload_url }} - # asset_path: ./my-artifact.zip - # asset_name: my-artifact.zip - # asset_content_type: application/zip - - - uses: eregon/publish-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - release_id: ${{ steps.create_release.outputs.id }} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 53e679f..8f65d56 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ /debugdata /build /pkglists +/repos /results /lorax_templates/*.tmpl /xorriso/input.txt @@ -9,4 +10,5 @@ /final-pkgsizes.txt /lorax.conf /output -/*.log \ No newline at end of file +/*.log + diff --git a/Containerfile b/Containerfile index 16f26d8..196a151 100644 --- a/Containerfile +++ b/Containerfile @@ -22,4 +22,5 @@ RUN dnf install -y make && make install-deps VOLUME /build-container-installer/build -ENTRYPOINT ["/bin/bash", "/entrypoint.sh"] \ No newline at end of file +ENTRYPOINT ["/bin/bash", "/entrypoint.sh"] + diff --git a/Makefile b/Makefile index 343505b..0ef451f 100644 --- a/Makefile +++ b/Makefile @@ -9,6 +9,7 @@ VARIANT = Server WEB_UI = false REPOS = /etc/yum.repos.d/fedora.repo /etc/yum.repos.d/fedora-updates.repo ADDITIONAL_TEMPLATES = "" +ROOTFS_SIZE = 4 # Generated vars ## Formatting = _UPPERCASE @@ -16,9 +17,10 @@ _BASE_DIR = $(shell pwd) _IMAGE_REPO_ESCAPED = $(subst /,\/,$(IMAGE_REPO)) _IMAGE_REPO_DOUBLE_ESCAPED = $(subst \,\\\,$(_IMAGE_REPO_ESCAPED)) _VOLID = $(firstword $(subst -, ,$(IMAGE_NAME)))-$(ARCH)-$(IMAGE_TAG) -_REPO_FILES = $(notdir $(REPOS)) +_REPO_FILES = $(subst /etc/yum.repos.d,repos,$(REPOS)) +_LORAX_TEMPLATES = $(subst .in,,$(shell ls lorax_templates/*.tmpl.in)) -ifeq ($(VARIANT),'Server') +ifeq ($(VARIANT),Server) _LORAX_ARGS = --macboot --noupgrade else _LORAX_ARGS = --nomacboot @@ -33,33 +35,35 @@ endif build/deploy.iso: boot.iso container/$(IMAGE_NAME)-$(IMAGE_TAG) xorriso/input.txt mkdir $(_BASE_DIR)/build || true xorriso -dialog on < $(_BASE_DIR)/xorriso/input.txt + implantisomd5 build/deploy.iso # Step 1: Generate Lorax Templates lorax_templates/%.tmpl: lorax_templates/%.tmpl.in - sed 's/@IMAGE_NAME@/$(IMAGE_NAME)/' $(_BASE_DIR)/lorax_templates/$*.tmpl.in > $(_BASE_DIR)/lorax_templates/$*.tmpl + $(eval _VARS = IMAGE_NAME IMAGE_TAG _IMAGE_REPO_DOUBLE_ESCAPED) + $(foreach var,$(_VARS),$(var)=$($(var))) envsubst '$(foreach var,$(_VARS),$$$(var))' < $(_BASE_DIR)/lorax_templates/$*.tmpl.in > $(_BASE_DIR)/lorax_templates/$*.tmpl - sed 's/@IMAGE_TAG@/$(IMAGE_TAG)/' $(_BASE_DIR)/lorax_templates/$*.tmpl > $(_BASE_DIR)/lorax_templates/$*.tmpl.tmp - mv $(_BASE_DIR)/lorax_templates/$*.tmpl{.tmp,} - - sed 's/@IMAGE_REPO_ESCAPED@/$(_IMAGE_REPO_DOUBLE_ESCAPED)/' $(_BASE_DIR)/lorax_templates/$*.tmpl > $(_BASE_DIR)/lorax_templates/$*.tmpl.tmp - mv $(_BASE_DIR)/lorax_templates/$*.tmpl{.tmp,} # Step 2: Replace vars in repo files -%.repo: /etc/yum.repos.d/%.repo - cp /etc/yum.repos.d/$*.repo $(_BASE_DIR)/$*.repo - sed -i "s/\$$releasever/${VERSION}/g" $(_BASE_DIR)/$*.repo - sed -i "s/\$$basearch/${ARCH}/g" $(_BASE_DIR)/$*.repo +repos/%.repo: /etc/yum.repos.d/%.repo + mkdir repos || true + cp /etc/yum.repos.d/$*.repo $(_BASE_DIR)/repos/$*.repo + sed -i "s/\$$releasever/${VERSION}/g" $(_BASE_DIR)/repos/$*.repo + sed -i "s/\$$basearch/${ARCH}/g" $(_BASE_DIR)/repos/$*.repo + +# Don't do anything for custom repos +%.repo: # Step 3: Build boot.iso using Lorax -boot.iso: lorax_templates/set_installer.tmpl lorax_templates/configure_upgrades.tmpl $(_REPO_FILES) - rm -Rf $(_BASE_DIR)/results +boot.iso: $(_LORAX_TEMPLATES) $(_REPO_FILES) + rm -Rf $(_BASE_DIR)/results || true + rm /etc/rpm/macros.image-language-conf || true lorax -p $(IMAGE_NAME) -v $(VERSION) -r $(VERSION) -t $(VARIANT) \ - --isfinal --buildarch=$(ARCH) --volid=$(_VOLID) \ + --isfinal --squashfs-only --buildarch=$(ARCH) --volid=$(_VOLID) \ $(_LORAX_ARGS) \ $(foreach file,$(_REPO_FILES),--repo $(_BASE_DIR)/$(file)) \ - --add-template $(_BASE_DIR)/lorax_templates/set_installer.tmpl \ - --add-template $(_BASE_DIR)/lorax_templates/configure_upgrades.tmpl \ + $(foreach file,$(_LORAX_TEMPLATES),--add-template $(_BASE_DIR)/$(file)) \ $(foreach file,$(ADDITIONAL_TEMPLATES),--add-template $(file)) \ + --rootfs-size $(ROOTFS_SIZE) \ $(_BASE_DIR)/results/ mv $(_BASE_DIR)/results/images/boot.iso $(_BASE_DIR)/ @@ -72,13 +76,8 @@ container/$(IMAGE_NAME)-$(IMAGE_TAG): # Step 5: Generate xorriso script xorriso/%.sh: xorriso/%.sh.in - sed 's/@IMAGE_NAME@/$(IMAGE_NAME)/' $(_BASE_DIR)/xorriso/$*.sh.in > $(_BASE_DIR)/xorriso/$*.sh - - sed 's/@IMAGE_TAG@/$(IMAGE_TAG)/' $(_BASE_DIR)/xorriso/$*.sh > $(_BASE_DIR)/xorriso/$*.sh.tmp - mv $(_BASE_DIR)/xorriso/$*.sh{.tmp,} - - sed 's/@ARCH@/$(ARCH)/' $(_BASE_DIR)/xorriso/$*.sh > $(_BASE_DIR)/xorriso/$*.sh.tmp - mv $(_BASE_DIR)/xorriso/$*.sh{.tmp,} + $(eval _VARS = IMAGE_NAME IMAGE_TAG ARCH VERSION) + $(foreach var,$(_VARS),$(var)=$($(var))) envsubst '$(foreach var,$(_VARS),$$$(var))' < $(_BASE_DIR)/xorriso/$*.sh.in > $(_BASE_DIR)/xorriso/$*.sh # Step 6: Generate xorriso input xorriso/input.txt: xorriso/gen_input.sh @@ -86,11 +85,12 @@ xorriso/input.txt: xorriso/gen_input.sh clean: + rm -Rf $(_BASE_DIR)/build || true rm -Rf $(_BASE_DIR)/container || true rm -Rf $(_BASE_DIR)/debugdata || true rm -Rf $(_BASE_DIR)/pkglists || true + rm -Rf $(_BASE_DIR)/repos || true rm -Rf $(_BASE_DIR)/results || true - rm -Rf $(_BASE_DIR)/build || true rm -f $(_BASE_DIR)/lorax_templates/*.tmpl || true rm -f $(_BASE_DIR)/xorriso/input.txt || true rm -f $(_BASE_DIR)/xorriso/*.sh || true @@ -102,4 +102,5 @@ clean: install-deps: dnf install -y lorax xorriso podman -.PHONY: clean install-deps \ No newline at end of file +.PHONY: clean install-deps + diff --git a/README.md b/README.md index e68d507..e11a6cb 100644 --- a/README.md +++ b/README.md @@ -1,35 +1,26 @@ ![Build status](https://github.com/jasonn3/build-container-installer/actions/workflows/build-and-test.yml/badge.svg??event=push) -# Bulid Container Installer Action -This action is used to generate an ISO for installing OSTrees stored in a container. This utilizes the anaconda command `ostreecontainer` +# Build Container Installer Action +This action is used to enerate an ISO for installing an OSTree stored in a container image. This utilizes the anaconda command `ostreecontainer` -## Makefile -A Makefile is provided for ease of use. There are separate targets for each file generated, however `make` can be used to generate the final image and `make clean` can be used to clean up the workspace. The resulting ISO will be stored in the `build` directory. - -See [Customizing](#customizing) for information about customizing the image that gets created. - -## Container -A container with the necessary tools already installed is provided at `ghcr.io/jasonn3/build-container-installer:latest` - -To use the container file, run `docker run --privileged --volume .:/build-container-installer/build ghcr.io/jasonn3/build-container-installer:latest`. - -This will create an ISO with the baked in defaults of the container image. - -See [Customizing](#customizing) for information about customizing the image that gets created. The variable can either be defined as environment variables or as command arguments. -Examples: - -Building an ISO to install Fedora 38 -```bash -docker run --rm --privileged --volume .:/build-container-installer/build -e VERSION=38 -e IMAGE_NAME=base -e IMAGE_TAG=38 -e VARIANT=Server ghcr.io/jasonn3/build-container-installer:latest +## Usage +This action is designed to be called from a GitHub workflow using the following format +```yaml +- name: Build ISO + uses: jasonn3/build-container-installer/v1.0.0 + with: + arch: ${{ env.ARCH}} + image_name: ${{ env.IMAGE_NAME}} + image_repo: ${{ env.IMAGE_REPO}} + version: ${{ env.VERSION }} + variant: ${{ env.VARIANT }} + action_version: v1.0.0 ``` -Building an ISO to install Fedora 39 -```bash -docker run --rm --privileged --volume .:/build-container-installer/build -e VERSION=39 -e IMAGE_NAME=base -e IMAGE_TAG=39 -e VARIANT=Server ghcr.io/jasonn3/build-container-installer:latest -``` +See [Customizing](#customizing) for information about customizing the ISO that gets created using `with` ## Customizing -The following variables can be used to customize the create image. +The following variables can be used to customize the created ISO. | Variable | Description | Default Value | | ----------------- | -------------------------------------------------------- | ------------------------------ | @@ -45,20 +36,48 @@ The following variables can be used to customize the create image. Available options for VARIANT can be found by running `dnf provides system-release`. Variant will be the third item in the package name. Example: `fedora-release-kinoite-39-34.noarch` will be kinoite -## VSCode Dev Container +## Development +### Makefile +The Makefile contains all of the commands that are run in the action. There are separate targets for each file generated, however `make` can be used to generate the final image and `make clean` can be used to clean up the workspace. The resulting ISO will be stored in the `build` directory. + +`make install-deps` can be used to install the necessary packages + +See [Customizing](#customizing) for information about customizing the ISO that gets created. + +### Container +A container with `make install-deps` already run is provided at `ghcr.io/jasonn3/build-container-installer:latest` + +To use the container file, run `docker run --privileged --volume .:/build-container-installer/build ghcr.io/jasonn3/build-container-installer:latest`. + +This will create an ISO with the baked in defaults of the container image. + +See [Customizing](#customizing) for information about customizing the ISO that gets created. The variable can either be defined as environment variables. +Examples: + +Building an ISO to install Fedora 38 +```bash +docker run --rm --privileged --volume .:/build-container-installer/build -e VERSION=38 -e IMAGE_NAME=base -e IMAGE_TAG=38 -e VARIANT=Server ghcr.io/jasonn3/build-container-installer:latest +``` + +Building an ISO to install Fedora 39 +```bash +docker run --rm --privileged --volume .:/build-container-installer/build -e VERSION=39 -e IMAGE_NAME=base -e IMAGE_TAG=39 -e VARIANT=Server ghcr.io/jasonn3/build-container-installer:latest +``` + +### VSCode Dev Container There is a dev container configuration provided for development. By default it will use the existing container image available at `ghcr.io/jasonn3/build-container-installer:latest`, however, you can have it build a new image by editing `.devcontainer/devcontainer.json` and replacing `image` with `build`. `Ctrl+/` can be used to comment and uncomment blocks of code within VSCode. The code from VSCode will be available at `/workspaces/build-container-installer` once the container has started. Privileged is required for access to loop devices for lorax. -Use existing image -```json +Use existing container image: +``` { "name": "Existing Dockerfile", // "build": { // "context": "..", - // "dockerfile": "../Dockerfile", + // "dockerfile": "../Containerfile", // "args": { // "version": "39" // } @@ -70,13 +89,13 @@ Use existing image } ``` -Build a new image -```json +Build a new container image: +``` { "name": "Existing Dockerfile", "build": { "context": "..", - "dockerfile": "../Dockerfile", + "dockerfile": "../Containerfile", "args": { "version": "39" } @@ -86,4 +105,5 @@ Build a new image "shutdownAction": "stopContainer", "privileged": true } -``` \ No newline at end of file +``` + diff --git a/action.yml b/action.yml index f28a7fe..985bd01 100644 --- a/action.yml +++ b/action.yml @@ -1,5 +1,5 @@ -name: Build Contianer Installer -description: generate an ISO for installing OSTrees stored in a container +name: Build Container Installer +description: Generates an ISO for installing an OSTree stored in a container image inputs: arch: @@ -52,3 +52,4 @@ runs: IMAGE_TAG=${{ inputs.image_tag || inputs.version }} \ WEB_UI=${{ inputs.web_ui }} \ "ADDITIONAL_TEMPLATES=${{ inputs.additional_templates }}" + diff --git a/entrypoint.sh b/entrypoint.sh index bb13346..5005737 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -21,4 +21,5 @@ mkdir /github/workspace/build || true # Copy resulting iso to github workspace and fix permissions cp build/deploy.iso /github/workspace/build -chmod -R ugo=rwX /github/workspace/build \ No newline at end of file +chmod -R ugo=rwX /github/workspace/build + diff --git a/lorax_templates/configure_upgrades.tmpl.in b/lorax_templates/configure_upgrades.tmpl.in index 688cf79..eb75fa7 100644 --- a/lorax_templates/configure_upgrades.tmpl.in +++ b/lorax_templates/configure_upgrades.tmpl.in @@ -1,7 +1,8 @@ append usr/share/anaconda/interactive-defaults.ks "%post --erroronfail" -append usr/share/anaconda/interactive-defaults.ks "sed -i 's/container-image-reference=.*/container-image-reference=ostree-image-signed:docker:\/\/@IMAGE_REPO_ESCAPED@\/@IMAGE_NAME@:@IMAGE_TAG@/' /ostree/deploy/default/deploy/*.origin" +append usr/share/anaconda/interactive-defaults.ks "sed -i 's/container-image-reference=.*/container-image-reference=ostree-image-signed:docker:\/\/${_IMAGE_REPO_DOUBLE_ESCAPED}\/${IMAGE_NAME}:${IMAGE_TAG}/' /ostree/deploy/default/deploy/*.origin" append usr/share/anaconda/interactive-defaults.ks "%end" append usr/share/anaconda/post-scripts/configure_upgrades.ks "%post --erroronfail" -append usr/share/anaconda/post-scripts/configure_upgrades.ks "sed -i 's/container-image-reference=.*/container-image-reference=ostree-image-signed:docker:\/\/@IMAGE_REPO_ESCAPED@\/@IMAGE_NAME@:@IMAGE_TAG@/' /ostree/deploy/default/deploy/*.origin" -append usr/share/anaconda/post-scripts/configure_upgrades.ks "%end" \ No newline at end of file +append usr/share/anaconda/post-scripts/configure_upgrades.ks "sed -i 's/container-image-reference=.*/container-image-reference=ostree-image-signed:docker:\/\/${_IMAGE_REPO_DOUBLE_ESCAPED}\/${IMAGE_NAME}:${IMAGE_TAG}/' /ostree/deploy/default/deploy/*.origin" +append usr/share/anaconda/post-scripts/configure_upgrades.ks "%end" + diff --git a/lorax_templates/set_installer.tmpl.in b/lorax_templates/set_installer.tmpl.in index 13332ff..66f01e0 100644 --- a/lorax_templates/set_installer.tmpl.in +++ b/lorax_templates/set_installer.tmpl.in @@ -1 +1,2 @@ -append usr/share/anaconda/interactive-defaults.ks "ostreecontainer --url=/run/install/repo/@IMAGE_NAME@-@VERSION@ --transport=oci --no-signature-verification" \ No newline at end of file +append usr/share/anaconda/interactive-defaults.ks "ostreecontainer --url=/run/install/repo/${IMAGE_NAME}-${IMAGE_TAG} --transport=oci --no-signature-verification" + diff --git a/xorriso/gen_input.sh.in b/xorriso/gen_input.sh.in index b6fadeb..b660e1b 100644 --- a/xorriso/gen_input.sh.in +++ b/xorriso/gen_input.sh.in @@ -5,10 +5,12 @@ echo "-outdev $(pwd)/build/deploy.iso" echo "-boot_image any replay" echo "-joliet on" echo "-compliance joliet_long_names" -cd container -for file in $(find @IMAGE_NAME@-@IMAGE_TAG@) +pushd container > /dev/null +for file in $(find ${IMAGE_NAME}-${IMAGE_TAG}) do echo "-map $(pwd)/${file} ${file}" echo "-chmod 0444 ${file}" done -echo "-end" \ No newline at end of file +popd > /dev/null +echo "-end" +