diff options
| author | Nicky Dasmijn <nicky.dasmijn@posteo.nl> | 2024-04-08 22:39:20 +0200 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-04-08 23:39:20 +0300 | 
| commit | 6b4b33cc129e9482342c9280ae79c9c5ce427ef1 (patch) | |
| tree | 24ba69020d29755529cf043ffaf7b5e1b38ae268 | |
| parent | bbd6dfc21a1a6c07824fc81e0659a2c200581d3b (diff) | |
Linux GHA builds (#1147)
* Linux GHA builds
Add Ubuntu 22.04 runner and Linux dependencies
Do not even try to touch ReleaseFS for Linux yet (this needs KDU, Havok, FMOD)
* Lets play a game of 'guess the havok source url'
* Move to linux-large runner.
* ReleaseOS used OpenAL, not fmod studio (which otherwise is the default)
* - Correction for Linux build dir
- HAVOK / CrashReporting wrestling. HAVOK is always turned on, even for OS builds Turn this off for Linux-ReleaseOS
Same with crashreporting, we need it off for now
* Add missing brace
* When doing a GHA build pack right into RUNNER_TEMP and then signal the created archive as our "viewer_app"
* Upload Linux-ReleaseOS after build
* - Need to use os.path.join and not hyst join
- set_github_output_path can be called unconditionally
* Remove Linux GHA build example.
| -rw-r--r-- | .github/workflows/build.yaml | 24 | ||||
| -rw-r--r-- | .github/workflows/build_linux.yaml | 47 | ||||
| -rw-r--r-- | autobuild.xml | 11 | ||||
| -rwxr-xr-x | build.sh | 30 | ||||
| -rwxr-xr-x | indra/newview/viewer_manifest.py | 50 | 
5 files changed, 82 insertions, 80 deletions
| diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index c7a758bd0f..3ac470b5ed 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -11,7 +11,7 @@ jobs:    build:      strategy:        matrix: -        runner: [windows-large, macos-12-xl] +        runner: [windows-large, macos-12-xl, linux-large]          configuration: [Release, ReleaseOS]          python-version: ["3.11"]          include: @@ -20,6 +20,8 @@ jobs:          exclude:            - runner: macos-12-xl              configuration: ReleaseOS +          - runner: linux-large +            configuration: Release      runs-on: ${{ matrix.runner }}      outputs:        viewer_channel: ${{ steps.build.outputs.viewer_channel }} @@ -95,6 +97,10 @@ jobs:              ${{ runner.os }}-64-${{ matrix.configuration }}-              ${{ runner.os }}-64- +      - name: Install Linux dependencies +        if: runner.os == 'linux' +        run: sudo apt update && sudo apt install -y libfltk1.3-dev libunwind-dev libgl1-mesa-dev libglu1-mesa-dev libx11-dev libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev libxext-dev libxrender-dev libxfixes-dev libxxf86vm-dev libxss-dev libdbus-1-dev libudev-dev libssl-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libfreetype6-dev ninja-build libxft-dev +        - name: Install windows dependencies          if: runner.os == 'Windows'          run: choco install nsis-unicode @@ -230,6 +236,16 @@ jobs:            path: |              ${{ steps.build.outputs.viewer_app }} +      # ND: We only have ReleaseOS builds for Linux so far, thus upload what we have +      # This steps can be deleted once "Release" is in place and makes "ReleaseOS" obsolete (for upload) +      - name: Upload Linux ReleaseOS archive +        if: matrix.configuration == 'ReleaseOS' && steps.build.outputs.viewer_app && matrix.os == 'linux' +        uses: actions/upload-artifact@v3 +        with: +          name: "${{ steps.build.outputs.artifact }}-app" +          path: | +            ${{ steps.build.outputs.viewer_app }} +        # The other upload of nontrivial size is the symbol file. Use a distinct        # artifact for that too.        - name: Upload symbol file @@ -372,7 +388,7 @@ jobs:          with:            name: Windows-metadata -      - name: Rename windows metadata  +      - name: Rename windows metadata          run: |            mv autobuild-package.xml Windows-autobuild-package.xml            mv newview/viewer_version.txt Windows-viewer_version.txt @@ -381,7 +397,7 @@ jobs:          with:            name: macOS-metadata -      - name: Rename macOS metadata  +      - name: Rename macOS metadata          run: |            mv autobuild-package.xml macOS-autobuild-package.xml            mv newview/viewer_version.txt macOS-viewer_version.txt @@ -407,7 +423,7 @@ jobs:            append_body: true            fail_on_unmatched_files: true            files: | -            *.dmg  +            *.dmg              *.exe              *-autobuild-package.xml              *-viewer_version.txt diff --git a/.github/workflows/build_linux.yaml b/.github/workflows/build_linux.yaml deleted file mode 100644 index 005284e984..0000000000 --- a/.github/workflows/build_linux.yaml +++ /dev/null @@ -1,47 +0,0 @@ -name: Linux build example -on: -  workflow_dispatch: -  push: -jobs: -  build: -    runs-on: ubuntu-22.04 -    env: -      AUTOBUILD_ADDRSIZE: 64 -      AUTOBUILD_VARIABLES_FILE: ${{ github.workspace }}/.build-variables/variables -    steps: -      - name: Checkout code -        uses: actions/checkout@v4 -        with: -          ref: ${{ github.event.pull_request.head.sha || github.sha }} - -      - name: Setup python -        uses: actions/setup-python@v5 -        with: -          python-version: ${{ matrix.python-version }} - -      - name: Checkout build variables -        uses: actions/checkout@v4 -        with: -          repository: secondlife/build-variables -          ref: viewer -          path: .build-variables - -      - name: Checkout master-message-template -        uses: actions/checkout@v4 -        with: -          repository: secondlife/master-message-template -          path: .master-message-template - -      - name: Install autobuild and python dependencies -        run: pip3 install autobuild llsd - -      - name: Install Linux dependencies -        if: runner.os == 'linux' -        run: sudo apt update && sudo apt install -y libfltk1.3-dev libunwind-dev libgl1-mesa-dev libglu1-mesa-dev libx11-dev libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev libxext-dev libxrender-dev libxfixes-dev libxxf86vm-dev libxss-dev libdbus-1-dev libudev-dev libssl-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libfreetype6-dev ninja-build libxft-dev - -      - name: Build -        id: build -        shell: bash -        run: | -          autobuild configure -c ReleaseOS -A64 -          cd build-linux-x86_64 && ninja -k0 diff --git a/autobuild.xml b/autobuild.xml index e95eb13a6b..ca774fc769 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -954,9 +954,13 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>00d0333936a67059a43a6ec8ac38d564</string> +              <string>ebfb82b6143874e7938b9d1e8a70d0a2e28aa818</string> +              <key>hash_algorithm</key> +              <string>sha1</string>                <key>url</key> -              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/748/1563/havok_source-2012.1-2-linux64-500739.tar.bz2</string> +              <string>https://api.github.com/repos/secondlife/3p-havok-source/releases/assets/108912599</string> +              <key>creds</key> +              <string>github</string>              </map>              <key>name</key>              <string>linux64</string> @@ -3386,7 +3390,8 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>                    <string>-G</string>                    <string>Ninja</string>                    <string>-DLL_TESTS=Off</string> -</array> +                  <string>-DUSE_OPENAL=On</string> +                </array>                </map>                <key>build</key>                <map> @@ -48,7 +48,7 @@ build_dir_Darwin()  build_dir_Linux()  { -  echo build-linux-i686 +  echo build-linux-x86_64  }  build_dir_CYGWIN() @@ -156,6 +156,22 @@ pre_build()                    "-DSIGNING_IDENTITY:STRING=Developer ID Application: Linden Research, Inc.")      fi +    if [[ "$arch" == "Linux" ]] +    then +      # RELEASE_CRASH_REPORTING is tuned on unconditionaly, this is fine but not for Linux as of now (due to missing breakpad/crashpad support) +      RELEASE_CRASH_REPORTING=OFF + +      # Builds turn on HAVOK even when config is ReleaseOS. +      # This needs AUTOBUILD_GITHUB_TOKEN to be set in the environment. But this is not set for PRs apparently. +      # Still this seemlingy works on Windows and Mac, why not on the Linux runner? Mystery to be solved elsewhere. + + +      if [[ "$variant" == "ReleaseOS" ]] +      then +          HAVOK=OFF +      fi +    fi +      if [ "${RELEASE_CRASH_REPORTING:-}" != "OFF" ]      then          case "$arch" in @@ -200,14 +216,14 @@ package_llphysicsextensions_tpv()    tpv_status=0    # nat 2016-12-21: without HAVOK, can't build PhysicsExtensions_TPV.    if [ "$variant" = "Release" -a "${HAVOK:-}" != "OFF" ] -  then  +  then        tpvconfig="$build_dir/packages/llphysicsextensions/autobuild-tpv.xml"        test -r "$tpvconfig" || fatal "No llphysicsextensions_tpv autobuild configuration found"        # SL-19942: autobuild ignores -c switch if AUTOBUILD_CONFIGURATION set        unset AUTOBUILD_CONFIGURATION        "$autobuild" build --quiet --config-file "$(native_path "$tpvconfig")" -c Tpv \            || fatal "failed to build llphysicsextensions_tpv" -       +        # capture the package file name for use in upload later...        PKGTMP=`mktemp -t pgktpv.XXXXXX`        cleanup="$cleanup ; rm $PKGTMP* 2>/dev/null" @@ -240,7 +256,7 @@ build()      || fatal "failed building $variant"      echo true >"$build_dir"/build_ok      end_section "autobuild $variant" -     +      begin_section "extensions $variant"      # Run build extensions      if [ -d ${build_dir}/packages/build-extensions ] @@ -313,7 +329,7 @@ begin_section "select viewer channel"  # Look for a branch-specific viewer_channel setting  #    changeset_branch is set in the sling-buildscripts  viewer_build_branch=$(echo -n "${changeset_branch:-$(repo_branch ${BUILDSCRIPTS_SRC:-$(pwd)})}" | tr -Cs 'A-Za-z0-9_' '_' | sed -E 's/^_+//; s/_+$//') -if [ -n "$viewer_build_branch" ]  +if [ -n "$viewer_build_branch" ]  then      branch_viewer_channel_var="${viewer_build_branch}_viewer_channel"      if [ -n "${!branch_viewer_channel_var}" ] @@ -435,7 +451,7 @@ do        record_event "configure for $variant failed: build skipped"    fi -  if ! $succeeded  +  if ! $succeeded    then        record_event "remaining variants skipped due to $variant failure"        break @@ -500,7 +516,7 @@ then          fi        done        end_section "Upload Debian Repository" -       +      else        record_event "debian build not enabled"      fi diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 3de57c6bf4..c97d421504 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -59,7 +59,7 @@ class ViewerManifest(LLManifest):          # files during the build (see copy_w_viewer_manifest          # and copy_l_viewer_manifest targets)          return 'package' in self.args['actions'] -     +      def construct(self):          super(ViewerManifest, self).construct()          self.path(src="../../scripts/messages/message_template.msg", dst="app_settings/message_template.msg") @@ -87,7 +87,7 @@ class ViewerManifest(LLManifest):                  # ... and the entire image filters directory                  self.path("filters") -             +                  # ... and the included spell checking dictionaries                  pkgdir = os.path.join(self.args['build'], os.pardir, 'packages')                  with self.prefix(src=pkgdir): @@ -260,14 +260,14 @@ class ViewerManifest(LLManifest):      def app_name_oneword(self):          return ''.join(self.app_name().split()) -     +      def icon_path(self):          return "icons/" + self.channel_type()      def extract_names(self,src):          """Extract contributor names from source file, returns string"""          try: -            with open(src, 'r') as contrib_file:  +            with open(src, 'r') as contrib_file:                  lines = contrib_file.readlines()          except IOError:              print("Failed to open '%s'" % src) @@ -491,7 +491,7 @@ class Windows_x86_64_Manifest(ViewerManifest):                  raise Exception("Directories are not supported by test_CRT_and_copy_action()")          else:              print("Doesn't exist:", src) -         +      def construct(self):          super().construct() @@ -543,7 +543,7 @@ class Windows_x86_64_Manifest(ViewerManifest):          self.path2basename(os.path.join(os.pardir,                                          'llplugin', 'slplugin', self.args['configuration']),                             "slplugin.exe") -         +          # Get shared libs from the shared libs staging directory          with self.prefix(src=os.path.join(self.args['build'], os.pardir,                                            'sharedlibs', self.args['buildtype'])): @@ -582,7 +582,7 @@ class Windows_x86_64_Manifest(ViewerManifest):              # Vivox libraries              self.path("vivoxsdk_x64.dll")              self.path("ortp_x64.dll") -             +              # OpenSSL              self.path("libcrypto-1_1-x64.dll")              self.path("libssl-1_1-x64.dll") @@ -709,7 +709,7 @@ class Windows_x86_64_Manifest(ViewerManifest):                  self.path("plugins/")          if not self.is_packaging_viewer(): -            self.package_file = "copied_deps"     +            self.package_file = "copied_deps"      def nsi_file_commands(self, install=True):          def INSTDIR(path): @@ -768,7 +768,7 @@ class Windows_x86_64_Manifest(ViewerManifest):          installer_file = self.installer_base_name() + '_Setup.exe'          substitution_strings['installer_file'] = installer_file -         +          version_vars = """          !define INSTEXE "SLVersionChecker.exe"          !define VERSION "%(version_short)s" @@ -777,7 +777,7 @@ class Windows_x86_64_Manifest(ViewerManifest):          !define VERSION_REGISTRY "%(version_registry)s"          !define VIEWER_EXE "%(final_exe)s"          """ % substitution_strings -         +          if self.channel_type() == 'release':              substitution_strings['caption'] = CHANNEL_VENDOR_BASE          else: @@ -908,7 +908,7 @@ class Darwin_x86_64_Manifest(ViewerManifest):                  # yields a slightly smaller binary but makes crash                  # logs mostly useless. This may be desirable for the                  # final release. Or not. -                if ("package" in self.args['actions'] or  +                if ("package" in self.args['actions'] or                      "unpacked" in self.args['actions']):                      self.run_command(                          ['strip', '-S', executable]) @@ -933,7 +933,7 @@ class Darwin_x86_64_Manifest(ViewerManifest):                  with self.prefix(src=relpkgdir, dst=""):                      self.path("libndofdev.dylib") -                    self.path("libhunspell-*.dylib")    +                    self.path("libhunspell-*.dylib")                  with self.prefix(src_dst="cursors_mac"):                      self.path("*.tif") @@ -1204,7 +1204,7 @@ class LinuxManifest(ViewerManifest):          pkgdir = os.path.join(self.args['build'], os.pardir, 'packages')          if "package_dir" in self.args:              pkgdir = self.args['package_dir'] -         +          relpkgdir = os.path.join(pkgdir, "lib", "release")          debpkgdir = os.path.join(pkgdir, "lib", "debug") @@ -1343,6 +1343,9 @@ class LinuxManifest(ViewerManifest):      def package_finish(self):          installer_name = self.installer_base_name() +        # When running as a GitHub Action job, RUNNER_TEMP is defined as the tmp dir +        RUNNER_TEMP = os.getenv('RUNNER_TEMP') +          self.strip_binaries()          # Fix access permissions @@ -1357,21 +1360,30 @@ class LinuxManifest(ViewerManifest):          # temporarily move directory tree so that it has the right          # name in the tarfile          realname = self.get_dst_prefix() -        tempname = self.build_path_of(installer_name) -        self.run_command(["mv", realname, tempname]) +        versionedName = self.build_path_of(installer_name) + +        tarName = versionedName + ".tar.bz2" + +        # If using a github runner we divert packaging a little. Considering this wil be a VM/docker image +        # we can just pack the final installer into RUNNER_TEMP and not into the usual stop we'd pick when +        # not building a GHA release +        if RUNNER_TEMP: +            tarName = os.path.join(RUNNER_TEMP, self.package_file) + +        self.run_command(["mv", realname, versionedName]) +          try:              # only create tarball if it's a release build.              if self.args['buildtype'].lower() == 'release': -                # --numeric-owner hides the username of the builder for -                # security etc.                  self.run_command(['tar', '-C', self.get_build_prefix(),                                    '--numeric-owner', '-cjf', -                                 tempname + '.tar.bz2', installer_name]) +                                 tarName, installer_name]) +                self.set_github_output_path('viewer_app', tarName)              else:                  print("Skipping %s.tar.bz2 for non-Release build (%s)" % \                        (installer_name, self.args['buildtype']))          finally: -            self.run_command(["mv", tempname, realname]) +            self.run_command(["mv", versionedName, realname])      def strip_binaries(self):          doStrip = False | 
