react-native-unity icon indicating copy to clipboard operation
react-native-unity copied to clipboard

Are there any example build scripts for Jenkins?

Open kylepark-nsuslab opened this issue 1 year ago • 1 comments

I'm trying to set up a build using Jenkins, but it seems difficult to script because iOS builds typically rely on Xcode. Do you have any examples of build scripts?

kylepark-nsuslab avatar Feb 08 '24 08:02 kylepark-nsuslab

This is a build script that I've created. There were some limitations with Unity Build Post Script, so I decided to try making it with a Ruby script instead. Please let me know if there's a better way.

require 'xcodeproj'
class ChangeDataFolderTarget
  def initialize(project_path, source_target_name, final_target_name, folder_name)
    @project_path = project_path
    @source_target_name = source_target_name
    @final_target_name = final_target_name
    @folder_name = folder_name
  end

  def modify_xcode_project
    puts "Opening Xcode project: #{@project_path}"

    # Open Xcode Project file
    project = Xcodeproj::Project.open(@project_path)

    # add Data folder to Final target
    final_target = project.targets.find { |target| target.name == @final_target_name }
    source_target = project.targets.find { |target| target.name == @source_target_name }

    if final_target && source_target
      # add files from Data folder to Final target
      source_target.resources_build_phase.files.each do |pbx_build_file|
        path = pbx_build_file.display_name.to_s

        if path.include?(@folder_name)
          # add files from Data folder to Final target
          puts "Adding files from Folder: #{@folder_name} to Target: #{@final_target_name}"
          final_target.add_file_references([pbx_build_file.file_ref])

          # source target remove file reference
          source_target.resources_build_phase.remove_file_reference(pbx_build_file.file_ref)
        end
      end
    else
      puts "Error: Target not found - #{@source_target_name} or #{@final_target_name}"
    end

    project.save
  end
end

class ChangePublicNativeCallProxy
  def initialize(project_path, target_name, file_path)
    @project_path = project_path
    @target_name = target_name
    @file_path = file_path
  end

  def modify_xcode_project
    puts "Opening Xcode project: #{@project_path}"

    # Open Xcode Project file
    project = Xcodeproj::Project.open(@project_path)

    # Find UnityFramework target
    unity_framework = project.targets.find { |target| target.name == @target_name }
    if unity_framework 
        native_call_proxy_file = unity_framework.headers_build_phase.files_references.find do |pbx_build_file|
            File.basename(pbx_build_file.path) == File.basename(@file_path)
        end

        if native_call_proxy_file
            build_file = unity_framework.headers_build_phase.files.find do |file|
                file.file_ref == native_call_proxy_file
            end
            
            if build_file
                puts "Setting Target Membership to public for file: #{@file_path} in Target: #{@target_name}"
                build_file.settings ||= {}
                build_file.settings['ATTRIBUTES'] ||= []
                build_file.settings['ATTRIBUTES'] << 'Public'
            else
                puts "build_file is null"
            end
        else
            puts "native_call_proxy_file cannot found"
        end
    else
        puts "unity_framework is null"
    end

    project.save
  end
end

# Process for Data Folder
project_modifier = ChangeDataFolderTarget.new('./OutDir/iOS/Unity-iPhone.xcodeproj', 'Unity-iPhone', 'UnityFramework', 'Data')
project_modifier.modify_xcode_project

# Process for NativeCallProxy.h
project_modifier = ChangePublicNativeCallProxy.new('./OutDir/iOS/Unity-iPhone.xcodeproj', 'UnityFramework', 'Libraries/Plugins/iOS/NativeCallProxy.h')
project_modifier.modify_xcode_project

kylepark-nsuslab avatar Feb 15 '24 07:02 kylepark-nsuslab