Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

infra: Build also live and updates images #5071

Merged
merged 3 commits into from
Aug 29, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,22 @@
# THIS FILE IS GENERATED FROM A TEMPLATE
# DO NOT EDIT THIS FILE MANUALLY!
# ======================================
# The template is located in: build-boot-iso.yml.j2
# The template is located in: build-image.yml.j2

# Build a boot.iso from a PR triggered by a "/boot-iso" comment or manually.
# You can use the --webui option to build a webui boot.iso instead
# Build a bootable image from a PR triggered by a "/build-image" comment or manually.
#
# Choose type of the image with these options:
# --boot.iso
# --live
# --updates.img
#
# If none of these is present, --boot-iso is assumed.
# If more are present at once, all variants are built.
#
# To use webui on boot.iso, add also:
# --webui

name: Build boot.iso
name: Build images
on:
issue_comment:
types: [created]
Expand All @@ -22,7 +32,7 @@ permissions:

jobs:
pr-info:
if: github.event_name == 'workflow_dispatch' || startsWith(github.event.comment.body, '/boot-iso')
if: github.event_name == 'workflow_dispatch' || startsWith(github.event.comment.body, '/build-image')
runs-on: ubuntu-latest
steps:
- name: Query comment author repository permissions
Expand Down Expand Up @@ -59,9 +69,13 @@ jobs:
env:
BODY: ${{ github.event.comment.body }}
run: |
# extract first line and cut out the "/boot-iso" first word
# extract first line and cut out the "/build-image" first word
ARGS=$(echo "$BODY" | sed -n '1 s/^[^ ]* *//p' | sed 's/[[:space:]]*$//')
echo "arguments are: $ARGS"
if ! [[ "$ARGS" == *"--boot.iso"* || "$ARGS" == *"--live"* || "$ARGS" == *"--updates.img"* ]] ; then
ARGS="$ARGS --boot.iso"
echo "adding implicit --boot.iso, arguments now are: $ARGS"
fi
echo "args=${ARGS}" >> $GITHUB_OUTPUT

- name: Construct image description
Expand Down Expand Up @@ -112,10 +126,10 @@ jobs:
args: ${{ steps.parse_args.outputs.args }}
image_description: ${{ steps.image_description.outputs.image_description }}

run:
boot-iso:
needs: pr-info
# only do this for Fedora for now; once we have RHEL 8/9 boot.iso builds working, also support these
if: needs.pr-info.outputs.allowed_user == 'true'
if: needs.pr-info.outputs.allowed_user == 'true' && contains(needs.pr-info.outputs.args, '--boot.iso')
runs-on: [self-hosted, kstest]
timeout-minutes: 300
env:
Expand Down Expand Up @@ -158,7 +172,7 @@ jobs:
mkdir -p ./anaconda_rpms/
cp -av ./result/build/01-rpm-build/*.rpm ./anaconda_rpms/

- name: Build the boot.iso
- name: Build the ISO image
run: |
mkdir -p images
if [[ "${{ needs.pr-info.outputs.args }}" == *"--webui"* ]] ; then
Expand All @@ -184,22 +198,89 @@ jobs:
- name: Upload image
uses: actions/upload-artifact@v3
with:
name: image ${{ needs.pr-info.outputs.image_description }}
name: boot.iso image for ${{ needs.pr-info.outputs.image_description }}
path: |
images/*.iso

- name: Add comment with link to PR
if: github.event_name != 'workflow_dispatch'
- name: Set result status
if: always()
uses: octokit/[email protected]
with:
route: 'POST /repos/${{ github.repository }}/statuses/${{ needs.pr-info.outputs.sha }}'
context: '${{ env.STATUS_NAME }} ${{ needs.pr-info.outputs.launch_args }}'
state: ${{ job.status }}
target_url: 'https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}'
env:
GH_TOKEN: ${{ github.token }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

live-iso:
needs: pr-info
if: needs.pr-info.outputs.allowed_user == 'true' && contains(needs.pr-info.outputs.args, '--live')
runs-on: [self-hosted, kstest]
timeout-minutes: 300
env:
STATUS_NAME: live-iso
CONTAINER_TAG: 'lorax'
ISO_BUILD_CONTAINER_NAME: 'quay.io/rhinstaller/anaconda-live-iso-creator'
steps:
# we post statuses manually as this does not run from a pull_request event
# https://developer.github.com/v3/repos/statuses/#create-a-status
- name: Create in-progress status
uses: octokit/[email protected]
with:
route: 'POST /repos/${{ github.repository }}/statuses/${{ needs.pr-info.outputs.sha }}'
context: '${{ env.STATUS_NAME }} ${{ needs.pr-info.outputs.launch_args }}'
state: pending
target_url: 'https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Clone repository
uses: actions/checkout@v3
with:
ref: ${{ needs.pr-info.outputs.sha }}
fetch-depth: 0

- name: Build anaconda-rpm container (for RPM build)
run: |
sha="${{ needs.pr-info.outputs.sha }}"
url="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
echo -n "\`boot.iso\` built successfully based on commit $sha. " >> comment.txt
echo -e "Download it from the bottom of the [job status page]($url).\n" >> comment.txt
echo "Comment to be posted:"
cat comment.txt
gh pr comment ${{ github.event.issue.number }} -F comment.txt
# set static tag to avoid complications when looking what tag is used
make -f ./Makefile.am anaconda-rpm-build CI_TAG=$CONTAINER_TAG

- name: Build Anaconda RPM files
run: |
# output of the build will be stored in ./result/build/01-rpm-build/*.rpm
make -f ./Makefile.am container-rpms-scratch CI_TAG=$CONTAINER_TAG

- name: Build anaconda-live-iso-creator container image
run: |
# set static tag to avoid complications when looking what tag is used
make -f ./Makefile.am anaconda-live-iso-creator-build CI_TAG=$CONTAINER_TAG

- name: Build the ISO image
run: |
mkdir -p images
make -f Makefile.am container-live-iso-build CI_TAG=$CONTAINER_TAG
mv result/iso/Fedora-Workstation.iso "images/${{ needs.pr-info.outputs.image_description }}-Fedora-Workstation.iso"

- name: Make artefacts created by sudo cleanable
if: always()
run:
sudo chown -R github:github .

- name: Collect logs
if: always()
uses: actions/upload-artifact@v3
with:
name: 'logs'
path: |
images/*.log

- name: Upload image artifacts
uses: actions/upload-artifact@v3
with:
name: live image for ${{ needs.pr-info.outputs.image_description }}
path: |
images/*.iso

- name: Set result status
if: always()
Expand All @@ -211,3 +292,88 @@ jobs:
target_url: 'https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

updates-img:
needs: pr-info
if: needs.pr-info.outputs.allowed_user == 'true' && contains(needs.pr-info.outputs.args, '--updates.img')
runs-on: ubuntu-latest
timeout-minutes: 10
env:
STATUS_NAME: updates-img
steps:
- name: Clone repository
uses: actions/checkout@v3
with:
ref: ${{ needs.pr-info.outputs.sha }}
fetch-depth: 0

- name: Install required packages
run: |
sudo apt install -y dracut

- name: Create updates image
run: |
./scripts/makeupdates
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hopefully this will work. Without the tag specification it takes the latest which might be problematic in some cases. Also outdated PR might broke this even more.

I wonder if building RPMs and just adding them to the updates image wouldn't be better solution.

In any case, great improvement - just a bit fragile.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed; if people start using this, perhaps it can do the rebase, same as tests. However in the first approximation I wanted to stay consistent, none of the other image builds rebase. Which might be a problem, now that I think about it... Well, another PR.

new_name="${{ needs.pr-info.outputs.image_description }}-updates.img"
mv updates.img "$new_name"
lsinitrd "$new_name"

- name: Upload image
uses: actions/upload-artifact@v3
with:
name: updates.img for ${{ needs.pr-info.outputs.image_description }}
path: |
*.img

- name: Set result status
if: always()
uses: octokit/[email protected]
with:
route: 'POST /repos/${{ github.repository }}/statuses/${{ needs.pr-info.outputs.sha }}'
context: '${{ env.STATUS_NAME }} ${{ needs.pr-info.outputs.launch_args }}'
state: ${{ job.status }}
target_url: 'https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

finalize:
needs: [pr-info, boot-iso, live-iso, updates-img]
runs-on: ubuntu-latest
# needs always() to run even if builds failed
if: ${{ always() && !cancelled() && github.event_name != 'workflow_dispatch' && needs.pr-info.outputs.allowed_user == 'true' }}
steps:

- name: Clone repository
# need the repo to successfully post a comment :-/
uses: actions/checkout@v3
with:
ref: ${{ needs.pr-info.outputs.sha }}
fetch-depth: 1

- name: Add comment with link to PR
env:
GH_TOKEN: ${{ github.token }}
run: |
sha="${{ needs.pr-info.outputs.sha }}"
url="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}#artifacts"

echo -e -n "Images built based on commit $sha:\n" > comment.txt
if [[ "${{ needs.pr-info.outputs.args }}" == *"--boot.iso"* ]] ; then
# <job>.result can be success, failure, cancelled, or skipped
# https://docs.github.com/en/actions/learn-github-actions/contexts#jobs-context
echo -e "- \`boot.iso\`: ${{ needs.boot-iso.result }}\n" >> comment.txt
fi
if [[ "${{ needs.pr-info.outputs.args }}" == *"--live"* ]] ; then
echo -e "- Live: ${{ needs.live-iso.result }}\n" >> comment.txt
fi
if [[ "${{ needs.pr-info.outputs.args }}" == *"--updates.img"* ]] ; then
echo -e "- \`updates.img\`: ${{ needs.updates-img.result }}\n" >> comment.txt
fi
echo -e "\nDownload the images from the bottom of the [job status page]($url).\n" >> comment.txt

echo "Comment to be posted:"
cat comment.txt

gh pr comment \
${{ github.event.issue.number }} \
-F comment.txt
Loading