From a79370a56cf34fa4bb7cecc07441a83dad10c068 Mon Sep 17 00:00:00 2001 From: Lake Date: Sat, 20 Sep 2025 12:55:40 +1000 Subject: [PATCH] tweaked build ci/cd --- .gitea/workflows/create-image.yaml | 23 ++-- .gitea/workflows/create-runner.yaml | 5 +- .../scripts/build-individual-image.sh | 101 ------------------ .../workflows/scripts/build-runner-image.sh | 56 +++++----- .github/workflows/create-image.yaml | 9 +- .github/workflows/create-runner.yaml | 7 +- dockerfiles/individual.dockerfile | 41 ------- dockerfiles/runner.dockerfile | 59 +++++----- 8 files changed, 93 insertions(+), 208 deletions(-) delete mode 100755 .gitea/workflows/scripts/build-individual-image.sh delete mode 100644 dockerfiles/individual.dockerfile diff --git a/.gitea/workflows/create-image.yaml b/.gitea/workflows/create-image.yaml index 2711e46..b675a22 100644 --- a/.gitea/workflows/create-image.yaml +++ b/.gitea/workflows/create-image.yaml @@ -1,9 +1,12 @@ name: 🤓 Individual Runners on: - # push: - # branches: [main] - # paths: ['versions.txt'] + push: + branches: [main] + paths: + - versions.txt + - dockerfiles/runner.dockerfile + - .gitea/workflows/create-runner.yaml workflow_dispatch: inputs: @@ -32,6 +35,8 @@ jobs: env: DOCKER_REGISTRY: docker.lakes.house/ UNITY_VERSION: ${{ github.event.inputs.unity_version }} + GAMECI_OS: ubuntu + GAMECI_VERSION: 3 strategy: matrix: @@ -48,10 +53,11 @@ jobs: steps: - uses: actions/checkout@v4 + - name: Login to Docker Registry uses: docker/login-action@v3 with: - registry: ${{ env.DOCKER_REGISTRY }} # usual credentials for bastion.local + registry: ${{ env.DOCKER_REGISTRY }} username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} @@ -63,14 +69,15 @@ jobs: echo "Unity Version: $VERSION" - name: Docker Build - run: .gitea/workflows/scripts/build-image.sh + run: .gitea/workflows/scripts/build-runner-image.sh id: build-image env: UNITY_VERSION: ${{ env.UNITY_VERSION }} - UNITY_PLATFORM: ${{ matrix.platform }} - IMAGE: ${{ env.DOCKER_REGISTRY }}unityci/editor + UNITY_MODULES: ${{ matrix.platform }} GAMECI_VERSION: ${{ env.GAMECI_VERSION }} - ONLY_RUNNER_TAG: true + GAMECI_OS: ${{ env.GAMECI_OS }} + IMAGE: ${{ env.DOCKER_REGISTRY }}unityci/editor + TAG: ${{ env.GAMECI_OS }}-${{ env.UNITY_VERSION }}-${{ matrix.platform }}-runner - name: Docker Push run: | diff --git a/.gitea/workflows/create-runner.yaml b/.gitea/workflows/create-runner.yaml index abe2acd..9143b02 100644 --- a/.gitea/workflows/create-runner.yaml +++ b/.gitea/workflows/create-runner.yaml @@ -7,6 +7,7 @@ on: - versions.txt - dockerfiles/runner.dockerfile - .github/workflows/create-runner.yaml + workflow_dispatch: jobs: @@ -15,6 +16,7 @@ jobs: env: DOCKER_REGISTRY: docker.lakes.house/ UNITY_MODULES: webgl android ios mac-mono windows-mono linux-il2cpp + GAMECI_OS: ubuntu GAMECI_VERSION: 3 name: Build @@ -40,8 +42,9 @@ jobs: UNITY_VERSION: ${{ env.UNITY_VERSION }} UNITY_MODULES: ${{ env.UNITY_MODULES }} GAMECI_VERSION: ${{ env.GAMECI_VERSION }} - GAMECI_OS: ubuntu + GAMECI_OS: ${{ env.GAMECI_OS }} IMAGE: ${{ env.DOCKER_REGISTRY }}unityci/editor + TAG: ${{ env.GAMECI_OS }}-${{ env.UNITY_VERSION }}-runner - name: Docker Push run: | diff --git a/.gitea/workflows/scripts/build-individual-image.sh b/.gitea/workflows/scripts/build-individual-image.sh deleted file mode 100755 index fdb9226..0000000 --- a/.gitea/workflows/scripts/build-individual-image.sh +++ /dev/null @@ -1,101 +0,0 @@ -#!/bin/sh -# Ensure UNITY_VERSION is set, pull from arguments if not -if [ -z "${UNITY_VERSION}" ]; then - if [ -n "$1" ]; then - UNITY_VERSION=$1 - else - echo "Error: UNITY_VERSION is not set." - exit 1 - fi -fi - -# Ensure UNITY_PLATFORM is set, pull from arguments if not -if [ -z "${UNITY_PLATFORM}" ]; then - if [ -n "$2" ]; then - UNITY_PLATFORM=$2 - else - echo "Error: UNITY_PLATFORM is not set." - exit 1 - fi -fi - -# Ensure IMAGE is set, pull from arguments if not -if [ -z "${IMAGE}" ]; then - if [ -n "$3" ]; then - IMAGE=$3 - else - echo "Error: IMAGE is not set." - exit 1 - fi -fi - -# Ensure GAME_CI_VERSION is set, default to 3 if not -if [ -z "${GAMECI_VERSION}" ]; then - GAMECI_VERSION=3 -fi - -# Ensure IMAGE_OS is set, default to ubuntu if not -if [ -z "${GAMECI_OS}" ]; then - - # windows-il2cpp requires windows OS - if [ "${UNITY_PLATFORM}" = "windows-il2cpp" ]; then - GAMECI_OS="windows" - else - GAMECI_OS="ubuntu" - fi - - # TODO: MacOS probably requires a mac image. - # Might be worth just putting this in the strategy at this point -fi - -# Ensure PLATFORM is set, default to the current system if not -if [ -z "${PLATFORM}" ]; then - PLATFORM=$(uname -m) - case "${PLATFORM}" in - x86_64) PLATFORM="linux/amd64" ;; - arm64) PLATFORM="linux/arm64" ;; - *) - echo "Error: Unsupported platform ${PLATFORM}." - exit 1 - ;; - esac -fi - - -BASE_IMAGE=unityci/editor:${GAMECI_OS}-${UNITY_VERSION}-${UNITY_PLATFORM}-${GAMECI_VERSION} -SHORT_TAG=${GAMECI_OS}-${UNITY_VERSION}-${UNITY_PLATFORM} -TAG=${SHORT_TAG}-runner -FULL_IMAGE=${IMAGE}:${TAG} - -ADDITIONAL_TAGS="" -if [ "${ONLY_RUNNER_TAG}" != "true" ]; then - ADDITIONAL_TAGS="$ADDITIONAL_TAGS -t ${IMAGE}:${SHORT_TAG}" - ADDITIONAL_TAGS="$ADDITIONAL_TAGS -t ${IMAGE}:${SHORT_TAG}-${GAMECI_VERSION}" -fi - -echo "Building Docker image ${FULL_IMAGE}" -echo "- Platfrom: ${PLATFORM}" -echo "- Base: ${BASE_IMAGE}" -echo "- Tag: ${TAG}" -echo "- Image: ${IMAGE}:${TAG}" -echo "- Additional Tags: ${ADDITIONAL_TAGS}" - -docker build \ - --platform ${PLATFORM} \ - --build-arg BASE_IMAGE=${BASE_IMAGE} \ - ${ADDITIONAL_TAGS} \ - -t ${FULL_IMAGE} \ - ${DOCKER_BUILD_ARGS} \ - -f ./dockerfiles/individual.dockerfile . - -if [ $? -ne 0 ]; then - echo "Error: Docker build failed." - exit 1 -fi - -# Export IMAGE and TAG for GitHub Actions -if [ -n "$GITHUB_OUTPUT" ]; then - echo "IMAGE=${IMAGE}" >> $GITHUB_OUTPUT - echo "TAG=${TAG}" >> $GITHUB_OUTPUT - echo "FULL_IMAGE=${FULL_IMAGE}" >> $GITHUB_OUTPUT -fi diff --git a/.gitea/workflows/scripts/build-runner-image.sh b/.gitea/workflows/scripts/build-runner-image.sh index c3648a8..cccfede 100755 --- a/.gitea/workflows/scripts/build-runner-image.sh +++ b/.gitea/workflows/scripts/build-runner-image.sh @@ -11,16 +11,16 @@ fi # Fetch the changelog and extract the changeset ID for the specified Unity version # This is because hub doesnt remember every version of unity and uses the changset for the exact id lookup. -if [ -z "${UNITY_CHANGESET}" ]; then - echo "Warning: No changeset provided. Scraping one from the change logs." - echo "This might take a while. Use the UNITY_CHANGESET to avoid this lookup." - CHANGELOG_URL="https://unity.com/releases/editor/whats-new/${UNITY_VERSION}" - UNITY_CHANGESET=$(curl -s -r 0-500 "$CHANGELOG_URL" | grep -oP 'unityhub://(?:[0-9a-z.])+/\K([a-z0-9]+)' | head -n 1) - if [ -z "$UNITY_CHANGESET" ]; then - echo "Error: Could not extract changeset for Unity version ${UNITY_VERSION}." - exit 1 - fi -fi +# if [ -z "${UNITY_CHANGESET}" ]; then +# echo "Warning: No changeset provided. Scraping one from the change logs." +# echo "This might take a while. Use the UNITY_CHANGESET to avoid this lookup." +# CHANGELOG_URL="https://unity.com/releases/editor/whats-new/${UNITY_VERSION}" +# UNITY_CHANGESET=$(curl -s -r 0-500 "$CHANGELOG_URL" | grep -oP 'unityhub://(?:[0-9a-z.])+/\K([a-z0-9]+)' | head -n 1) +# if [ -z "$UNITY_CHANGESET" ]; then +# echo "Error: Could not extract changeset for Unity version ${UNITY_VERSION}." +# exit 1 +# fi +# fi # Ensure we have some modules if [ -z "${UNITY_MODULES}" ]; then @@ -32,16 +32,6 @@ if [ -z "${UNITY_MODULES}" ]; then fi fi -# Ensure IMAGE is set, pull from arguments if not -if [ -z "${IMAGE}" ]; then - if [ -n "$3" ]; then - IMAGE=$3 - else - echo "Error: IMAGE is not set." - exit 1 - fi -fi - # Ensure GAME_CI_VERSION is set, default to 3 if not if [ -z "${GAMECI_VERSION}" ]; then GAMECI_VERSION=3 @@ -74,6 +64,22 @@ if [ -z "${PLATFORM}" ]; then esac fi +# Ensure IMAGE is set, pull from arguments if not +if [ -z "${IMAGE}" ]; then + if [ -n "$3" ]; then + IMAGE=$3 + else + echo "Error: IMAGE is not set." + exit 1 + fi +fi + +# Ensure the TAG is set, default to latest if not +if [ -z "${TAG}" ]; then + TAG="${GAMECI_OS}-${UNITY_VERSION}-runner" +fi + + # Ensure some additional build settings are set if [ -z "${DOCKER_BUILD_ARGS}" ]; then DOCKER_BUILD_ARGS="" @@ -81,21 +87,19 @@ fi BASE_TAG=${GAMECI_OS}-${UNITY_VERSION}-base-${GAMECI_VERSION} BASE_IMAGE=unityci/editor:${BASE_TAG} -DEST_TAG=${GAMECI_OS}-${UNITY_VERSION}-runner -DEST_IMAGE=${IMAGE}:${DEST_TAG} +DEST_IMAGE=${IMAGE}:${TAG} echo "Building Docker image ${DEST_IMAGE}" echo "- Version: ${UNITY_VERSION}" echo "- Changeset: ${UNITY_CHANGESET}" echo "- Platfrom: ${PLATFORM}" echo "- Base: ${BASE_IMAGE}" -echo "- Tag: ${DEST_TAG}" +echo "- Tag: ${TAG}" echo "- Image: ${DEST_IMAGE}" -docker buildx build \ +docker build \ --platform ${PLATFORM} \ --build-arg "VERSION=${UNITY_VERSION}" \ - --build-arg "CHANGESET=${UNITY_CHANGESET}" \ --build-arg "BASE_IMAGE=${BASE_IMAGE}" \ --build-arg "MODULE=${UNITY_MODULES}" \ -t ${DEST_IMAGE} ${DOCKER_BUILD_ARGS} \ @@ -109,6 +113,6 @@ fi # Export IMAGE and TAG for GitHub Actions if [ -n "$GITHUB_OUTPUT" ]; then echo "IMAGE=${IMAGE}" >> $GITHUB_OUTPUT - echo "TAG=$DEST_TAG" >> $GITHUB_OUTPUT + echo "TAG=$TAG" >> $GITHUB_OUTPUT echo "FULL_IMAGE=${DEST_IMAGE}" >> $GITHUB_OUTPUT fi diff --git a/.github/workflows/create-image.yaml b/.github/workflows/create-image.yaml index df1e458..eb41129 100644 --- a/.github/workflows/create-image.yaml +++ b/.github/workflows/create-image.yaml @@ -12,6 +12,9 @@ on: jobs: build-docker: runs-on: ubuntu-latest + env: + GAMECI_OS: ubuntu + GAMECI_VERSION: 3 strategy: matrix: @@ -48,9 +51,11 @@ jobs: env: UNITY_VERSION: ${{ env.UNITY_VERSION }} UNITY_PLATFORM: ${{ matrix.platform }} - IMAGE: "${{ vars.DOCKERHUB_USERNAME }}/unity-runner" GAMECI_VERSION: ${{ env.GAMECI_VERSION }} - + GAMECI_OS: ${{ env.GAMECI_OS }} + IMAGE: "${{ vars.DOCKERHUB_USERNAME }}/unity-runner" + TAG: ${{ env.GAMECI_OS }}-${{ env.UNITY_VERSION }}-${{ matrix.platform }}-runner + - name: Docker Push run: | echo "Pushing Docker Image ${{ steps.build-image.outputs.FULL_IMAGE }}" diff --git a/.github/workflows/create-runner.yaml b/.github/workflows/create-runner.yaml index ced1f11..af36e36 100644 --- a/.github/workflows/create-runner.yaml +++ b/.github/workflows/create-runner.yaml @@ -14,7 +14,9 @@ jobs: runs-on: ubuntu-latest env: UNITY_MODULES: webgl android ios mac-mono windows-mono linux-il2cpp - + GAMECI_OS: ubuntu + GAMECI_VERSION: 3 + environment: name: Docker Hub @@ -41,8 +43,9 @@ jobs: UNITY_VERSION: ${{ env.UNITY_VERSION }} UNITY_MODULES: ${{ env.UNITY_MODULES }} GAMECI_VERSION: ${{ env.GAMECI_VERSION }} - GAMECI_OS: ubuntu + GAMECI_OS: ${{ env.GAMECI_OS }} IMAGE: "${{ vars.DOCKERHUB_USERNAME }}/unity-runner" + TAG: ${{ env.GAMECI_OS }}-${{ env.UNITY_VERSION }}-runner - name: Docker Push run: | diff --git a/dockerfiles/individual.dockerfile b/dockerfiles/individual.dockerfile deleted file mode 100644 index fd7f140..0000000 --- a/dockerfiles/individual.dockerfile +++ /dev/null @@ -1,41 +0,0 @@ -ARG BASE_IMAGE=unityci/editor - -FROM $BASE_IMAGE -RUN apt-get update && \ - apt-get install -y \ - git \ - curl \ - gcc \ - make \ - libssl-dev \ - zlib1g-dev \ - libsqlite3-dev - -# Set up the scripts -RUN git clone --depth=1 https://github.com/game-ci/unity-builder.git /gameci && \ - cp -rf /gameci/dist/platforms/ubuntu/steps /steps && \ - cp -rf /gameci/dist/default-build-script /UnityBuilderAction && \ - cp /gameci/dist/platforms/ubuntu/entrypoint.sh /entrypoint.sh - -# Set up Node.js environment for github actions -RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \ - apt-get install -y nodejs && \ - npm install -g npm@latest - -# Install Blender -ARG BLENDER_SHORT_VERSION=3.4 -ARG BLENDER_FULL_VERSION=3.4.1 -RUN echo "BLENDER_FULL_VERSION: $BLENDER_FULL_VERSION" && \ - echo echo "BLENDER_SHORT_VERSION: $BLENDER_SHORT_VERSION" && \ - apt-get install -y wget && \ - wget https://download.blender.org/release/Blender$BLENDER_SHORT_VERSION/blender-$BLENDER_FULL_VERSION-linux-x64.tar.xz && \ - tar -xf blender-$BLENDER_FULL_VERSION-linux-x64.tar.xz && \ - rm blender-$BLENDER_FULL_VERSION-linux-x64.tar.xz -ENV PATH="$PATH:/blender-$BLENDER_FULL_VERSION-linux-x64" - -# Add custom scripts -COPY scripts/build.sh /build.sh -RUN chmod +x /build.sh - -# Done -ENTRYPOINT [ "/entrypoint.sh" ] \ No newline at end of file diff --git a/dockerfiles/runner.dockerfile b/dockerfiles/runner.dockerfile index 953c447..189ebe8 100644 --- a/dockerfiles/runner.dockerfile +++ b/dockerfiles/runner.dockerfile @@ -14,15 +14,15 @@ COPY --from=editor "$UNITY_PATH/" /opt/unity/editors/$VERSION/ # Install modules for that editor ARG MODULE="non-existent-module" RUN for mod in $MODULE; do \ - if [ "$mod" = "base" ] ; then \ - echo "running default modules for this baseOs"; \ - else \ - unity-hub install-modules --version "$VERSION" --module "$mod" --childModules | tee /var/log/install-module-${mod}.log && \ - grep 'Missing module\|Completed with errors' /var/log/install-module-${mod}.log | exit $(wc -l); \ - fi \ - done \ - # Set execute permissions for modules - && chmod -R 755 /opt/unity/editors/$VERSION/Editor/Data/PlaybackEngines + if [ "$mod" = "base" ] ; then \ + echo "running default modules for this baseOs"; \ + else \ + unity-hub install-modules --version "$VERSION" --module "$mod" --childModules | tee /var/log/install-module-${mod}.log && \ + grep 'Missing module\|Completed with errors' /var/log/install-module-${mod}.log | exit $(wc -l); \ + fi \ + done \ + # Set execute permissions for modules + && chmod -R 755 /opt/unity/editors/$VERSION/Editor/Data/PlaybackEngines RUN echo "$VERSION-$MODULE" | grep -q -vP '^(2021.2.(?![0-4](?![0-9]))|2021.[3-9]|202[2-9]|[6-9][0-9]{3}|[1-9][0-9]{4,}).*linux' \ && exit 0 \ @@ -46,40 +46,45 @@ COPY --from=builder /opt/unity/editors/$VERSION/ "$UNITY_PATH/" RUN echo $VERSION > "$UNITY_PATH/version" RUN apt-get update && \ - apt-get install -y \ - git \ - curl \ - gcc \ - make \ - libssl-dev \ - zlib1g-dev \ - libsqlite3-dev + apt-get install -y \ + git \ + curl \ + gcc \ + make \ + libssl-dev \ + zlib1g-dev \ + libsqlite3-dev # Set up the scripts RUN git clone --depth=1 https://github.com/game-ci/unity-builder.git /gameci && \ - cp -rf /gameci/dist/platforms/ubuntu/steps /steps && \ - cp -rf /gameci/dist/default-build-script /UnityBuilderAction && \ - cp /gameci/dist/platforms/ubuntu/entrypoint.sh /entrypoint.sh + cp -rf /gameci/dist/platforms/ubuntu/steps /steps && \ + cp -rf /gameci/dist/default-build-script /UnityBuilderAction && \ + cp /gameci/dist/platforms/ubuntu/entrypoint.sh /entrypoint.sh # Set up Node.js environment for github actions RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \ - apt-get install -y nodejs && \ - npm install -g npm@latest + apt-get install -y nodejs && \ + npm install -g npm@latest # Install Blender ARG BLENDER_SHORT_VERSION=3.4 ARG BLENDER_FULL_VERSION=3.4.1 RUN echo "BLENDER_FULL_VERSION: $BLENDER_FULL_VERSION" && \ - echo echo "BLENDER_SHORT_VERSION: $BLENDER_SHORT_VERSION" && \ - apt-get install -y wget && \ - wget https://download.blender.org/release/Blender$BLENDER_SHORT_VERSION/blender-$BLENDER_FULL_VERSION-linux-x64.tar.xz && \ - tar -xf blender-$BLENDER_FULL_VERSION-linux-x64.tar.xz && \ - rm blender-$BLENDER_FULL_VERSION-linux-x64.tar.xz + echo echo "BLENDER_SHORT_VERSION: $BLENDER_SHORT_VERSION" && \ + apt-get install -y wget && \ + wget https://download.blender.org/release/Blender$BLENDER_SHORT_VERSION/blender-$BLENDER_FULL_VERSION-linux-x64.tar.xz && \ + tar -xf blender-$BLENDER_FULL_VERSION-linux-x64.tar.xz && \ + rm blender-$BLENDER_FULL_VERSION-linux-x64.tar.xz ENV PATH="$PATH:/blender-$BLENDER_FULL_VERSION-linux-x64" # Add custom scripts COPY scripts/build.sh /build.sh RUN chmod +x /build.sh +LABEL com.unity3d.version="$VERSION" +LABEL com.unity3d.modules="$MODULE" +LABEL org.blender.version="$BLENDER_FULL_VERSION" + # Done +ENTRYPOINT [ "/entrypoint.sh" ] # ENTRYPOINT [ "/bin/bash" ]~ \ No newline at end of file