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

[wip] cleanup local dev ux #11

Merged
merged 2 commits into from
Dec 19, 2024
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
106 changes: 55 additions & 51 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,14 @@ on:
workflow_dispatch:

env:
IMAGE_NAME: "main"
IMAGE_DESC: "CentOS Stream-based images"
IMAGE_REGISTRY: "ghcr.io/${{ github.repository_owner }}"
DEFAULT_TAG: "latest"
CENTOS_VERSION: "stream10"

concurrency:
group: ${{ github.workflow }}-${{ github.ref || github.run_id }}-${{ inputs.brand_name}}-${{ inputs.stream_name }}
group: ${{ github.workflow }}-${{ github.ref || github.run_id }}
Copy link
Member Author

Choose a reason for hiding this comment

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

Dropping this for now, we can re-add it if needed in the future

cancel-in-progress: true

jobs:
Expand All @@ -36,68 +39,60 @@ jobs:
- name: Checkout Push to Registry action
uses: actions/checkout@v4

- name: Install Just
shell: bash
run: |
set -eoux pipefail
JUST_VERSION=$(curl -L https://api.github.com/repos/casey/just/releases/latest | jq -r '.tag_name')
curl -sSLO https://github.com/casey/just/releases/download/${JUST_VERSION}/just-${JUST_VERSION}-x86_64-unknown-linux-musl.tar.gz
tar -zxvf just-${JUST_VERSION}-x86_64-unknown-linux-musl.tar.gz -C /tmp just
sudo mv /tmp/just /usr/local/bin/just
rm -f just-${JUST_VERSION}-x86_64-unknown-linux-musl.tar.gz
- name: Setup Just
uses: extractions/setup-just@v2

- name: Check Just Syntax
shell: bash
run: |
just check

- name: Image Name
shell: bash
run: |
IMAGE_NAME="$(just image_name)"
echo "IMAGE_NAME=${IMAGE_NAME}" >> $GITHUB_ENV

- name: Default Tag
shell: bash
run: |
DEFAULT_TAG="$(just generate-default-tag)"
echo "Default Tag: ${DEFAULT_TAG}"
echo "DEFAULT_TAG=${DEFAULT_TAG}" >> $GITHUB_ENV

- name: Maximize build space
uses: ublue-os/remove-unwanted-software@v7
with:
remove-codeql: true

- name: Build Image
id: build-image
shell: bash
run: |
just build

- name: Generate tags
id: generate-tags
shell: bash
run: |
alias_tags="$(just generate-build-tags \
"latest" \
"1" \
"$(podman inspect ${{ env.IMAGE_NAME }}:${{ env.DEFAULT_TAG }} | jq -r '.[].Config.Labels["org.opencontainers.image.version"]')" \
"${{ github.event_name }}" \
"${{ github.event.number }}")"

echo "Tags for this Action..."
echo "$alias_tags"
echo "alias_tags=${alias_tags}" >> $GITHUB_OUTPUT

# Tag Images
- name: Tag Images
shell: bash
run: |
set -eoux pipefail
just tag-images "${{ env.IMAGE_NAME }}" \
"${{ env.DEFAULT_TAG }}" \
"${{ steps.generate-tags.outputs.alias_tags }}"
Comment on lines -82 to -100
Copy link
Member Author

Choose a reason for hiding this comment

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

Pulled this back into the github action workflow, since it's not needed for local dev.

# Generate a timestamp for creating an image version history
TIMESTAMP="$(date +%Y%m%d)"
COMMIT_TAGS=()
BUILD_TAGS=()

# Have tags for tracking builds during pull request
SHA_SHORT="${GITHUB_SHA::7}"
COMMIT_TAGS+=("pr-${{ github.event.number }}")
COMMIT_TAGS+=("${SHA_SHORT}")

# Append matching timestamp tags to keep a version history
for TAG in "${BUILD_TAGS[@]}"; do
BUILD_TAGS+=("${TAG}-${TIMESTAMP}")
done

BUILD_TAGS+=("${TIMESTAMP}")
BUILD_TAGS+=("${DEFAULT_TAG}")
BUILD_TAGS+=("${CENTOS_VERSION}")
BUILD_TAGS+=("${CENTOS_VERSION}.${TIMESTAMP}")

if [[ "${{ github.event_name }}" == "pull_request" ]]; then
echo "Generated the following commit tags: "
for TAG in "${COMMIT_TAGS[@]}"; do
echo "${TAG}"
done

alias_tags=("${COMMIT_TAGS[@]}")
else
alias_tags=("${BUILD_TAGS[@]}")
fi

echo "Generated the following build tags: "
for TAG in "${BUILD_TAGS[@]}"; do
echo "${TAG}"
done

echo "alias_tags=${alias_tags[*]}" >> $GITHUB_OUTPUT

# Workaround bug where capital letters in your GitHub username make it impossible to push to GHCR.
# https://github.com/macbre/push-to-ghcr/issues/12
Expand All @@ -107,6 +102,13 @@ jobs:
with:
string: ${{ env.IMAGE_REGISTRY }}

- name: Build Image
id: build-image
shell: bash
run: |
IMAGE_FULL="${{ steps.registry_case.outputs.lowercase }}/${IMAGE_NAME}"
just build "${IMAGE_FULL}" "${DEFAULT_TAG}"
Copy link
Member

Choose a reason for hiding this comment

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

We need to refactor the build-vm and run-vm ones after this gets merged. This will kind of break it I think..?

Copy link
Member Author

Choose a reason for hiding this comment

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

That's the main reason this is still wip, but wanted to get this pushed before I called it a night

Copy link
Member

Choose a reason for hiding this comment

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

Worst case dont worry we can work on it outside of this PR. I want to keep the achillobator just run-vm 1 raw workflow, it is super cleeeean!

Copy link
Member Author

Choose a reason for hiding this comment

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

build-vm and run-vm recipes are working now. I did refactor run-vm to run in a container (blatantly stolen from the bluefin run-iso job)


- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
Expand All @@ -124,11 +126,12 @@ jobs:
command: |
set -euox pipefail

IMAGE_FULL="${{ steps.registry_case.outputs.lowercase }}/${IMAGE_NAME}"
for tag in ${{ steps.generate-tags.outputs.alias_tags }}; do
podman push ${{ env.IMAGE_NAME }}:${tag} ${{ steps.registry_case.outputs.lowercase }}/${{ env.IMAGE_NAME }}:${tag}
podman push "${IMAGE_FULL}:${DEFAULT_TAG}" "${IMAGE_FULL}:${tag}"
done

digest=$(skopeo inspect docker://${{ steps.registry_case.outputs.lowercase }}/${{ env.IMAGE_NAME }}:${{ env.DEFAULT_TAG }} --format '{{.Digest}}')
digest=$(skopeo inspect "docker://${IMAGE_FULL}:${DEFAULT_TAG}" --format '{{.Digest}}')

echo "digest=${digest}" >> $GITHUB_OUTPUT

Expand All @@ -139,7 +142,8 @@ jobs:
- name: Sign container image
if: github.event_name != 'pull_request'
run: |
cosign sign -y --key env://COSIGN_PRIVATE_KEY ${{ steps.registry_case.outputs.lowercase }}/${{ env.IMAGE_NAME }}@${TAGS}
IMAGE_FULL="${{ steps.registry_case.outputs.lowercase }}/${IMAGE_NAME}"
cosign sign -y --key env://COSIGN_PRIVATE_KEY ${IMAGE_FULL}@${TAGS}
env:
TAGS: ${{ steps.push.outputs.outputs && fromJSON(steps.push.outputs.outputs).digest }}
COSIGN_EXPERIMENTAL: false
Expand Down
94 changes: 7 additions & 87 deletions Justfile
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
export repo_organization := "centos-workstation"
export image_name := "main"
export centos_version := "stream10"
export repo_organization := env("GITHUB_REPOSITORY_OWNER", "centos-workstation")
export image_name := env("IMAGE_NAME", "main")
export centos_version := env("CENTOS_VERSION", "stream10")
export default_tag := env("DEFAULT_TAG", "latest")
Comment on lines +1 to +4
Copy link
Member Author

Choose a reason for hiding this comment

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

streamline variable config between what's being set in github actions and here.


[private]
default:
Expand Down Expand Up @@ -63,7 +64,7 @@ sudoif command *args:
}
sudoif {{ command }} {{ args }}

build $centos_version="stream10" $tag="latest":
build $target_image=image_name $tag=default_tag:
#!/usr/bin/env bash

# Get Version
Expand All @@ -88,10 +89,10 @@ build $centos_version="stream10" $tag="latest":
podman build \
"${BUILD_ARGS[@]}" \
"${LABELS[@]}" \
--tag "${image_name}:${tag}" \
--tag "${target_image}:${tag}" \
.

build-vm $target_image=("localhost/" + image_name) $tag="latest" $type="qcow2":
build-vm $target_image=("localhost/" + image_name) $tag=default_tag $type="qcow2":
#!/usr/bin/env bash
set -euo pipefail

Expand Down Expand Up @@ -143,84 +144,3 @@ run-vm:
--graphics vnc

virsh start centos-workstation-main

[private]
centos_version:
echo "{{ centos_version }}"

[private]
image_name:
echo "{{ image_name }}"

# Generate Default Tag
[group('Utility')]
generate-default-tag tag="latest":
#!/usr/bin/bash
set -eou pipefail

echo "{{ tag }}"

# Generate Tags
[group('Utility')]
generate-build-tags tag="latest" ghcr="0" $version="" github_event="" github_number="":
#!/usr/bin/bash
set -eoux pipefail

TODAY="$(date +%A)"
if [[ {{ ghcr }} == "0" ]]; then
rm -f /tmp/manifest.json
fi
CENTOS_VERSION="{{ centos_version }}"
DEFAULT_TAG=$(just generate-default-tag {{ tag }})
IMAGE_NAME={{ image_name }}
# Use Build Version from Rechunk
if [[ -z "${version:-}" ]]; then
version="{{ tag }}-${CENTOS_VERSION}.$(date +%Y%m%d)"
fi
version=${version#{{ tag }}-}

# Arrays for Tags
BUILD_TAGS=()
COMMIT_TAGS=()

BUILD_TAGS+=($(date +%Y%m%d))

# Commit Tags
github_number="{{ github_number }}"
SHA_SHORT="$(git rev-parse --short HEAD)"
if [[ "{{ ghcr }}" == "1" ]]; then
COMMIT_TAGS+=(pr-${github_number:-}-{{ tag }}-${version})
COMMIT_TAGS+=(${SHA_SHORT}-{{ tag }}-${version})
fi

# Convenience Tags
BUILD_TAGS+=("{{ tag }}")

# Weekly Stable / Rebuild Stable on workflow_dispatch
github_event="{{ github_event }}"
BUILD_TAGS+=("${CENTOS_VERSION}" "${version}")

if [[ "${github_event}" == "pull_request" ]]; then
alias_tags=("${COMMIT_TAGS[@]}")
else
alias_tags=("${BUILD_TAGS[@]}")
fi

echo "${alias_tags[*]}"

[group('Utility')]
tag-images image_name="" default_tag="" tags="":
#!/usr/bin/bash
set -eou pipefail

# Get Image, and untag
IMAGE=$(podman inspect localhost/{{ image_name }}:{{ default_tag }} | jq -r .[].Id)
podman untag localhost/{{ image_name }}:{{ default_tag }}

# Tag Image
for tag in {{ tags }}; do
podman tag $IMAGE {{ image_name }}:${tag}
done

# Show Images
podman images