game-ci / unity-builder

Build Unity projects for different platforms
https://github.com/marketplace/actions/unity-builder
MIT License
852 stars 250 forks source link

Support multiple licensing products #661

Open ejnarvala opened 3 months ago

ejnarvala commented 3 months ago

Changes

This change enables supporting unity floating license servers with multiple products configured, more info here.

Related PRs

Related Issues

Successful Workflow Run Link

PRs don't have access to secrets so you will need to provide a link to a successful run of the workflows from your own repo.

Checklist

Summary by CodeRabbit

Release Notes

github-actions[bot] commented 3 months ago

Cat Gif

webbertakken commented 1 month ago

I don't have any knowledge about the floating license server or multiple configured products. Would it be possible to link relevant documentation or howtos from Unity?

Could someone verify that this change doesn't affect other use cases?

coderabbitai[bot] commented 1 month ago

[!IMPORTANT]

Review skipped

Review was skipped due to path filters

:no_entry: Files ignored due to path filters (2) * `dist/index.js` is excluded by `!**/dist/**` * `dist/index.js.map` is excluded by `!**/dist/**`, `!**/*.map`

CodeRabbit blocks several paths by default. You can override this behavior by explicitly including those paths in the path filters. For example, including **/dist/** will override the default block on the dist directory, by removing the pattern from both the lists.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

📝 Walkthrough
📝 Walkthrough ## Walkthrough The changes introduce a new optional input parameter, `unityLicensingProductIds`, to the `action.yml` file for the Unity Builder action. This parameter allows for the specification of Unity license product identifiers. Corresponding updates are made in the `BuildParameters` class to handle this new input, including a new property and test cases. Additionally, the `ImageEnvironmentFactory` and `PlatformSetup` classes are modified to incorporate the new environment variable `UNITY_LICENSING_PRODUCT_IDS`, ensuring proper integration into the existing configuration and setup processes. ## Changes | File Path | Change Summary | |---------------------------------------|-----------------------------------------------------------------------------------------------------------------| | action.yml | Added optional input parameter `unityLicensingProductIds` with a default value; corrected indentation for `dockerWorkspacePath`. | | src/model/build-parameters.test.ts | Added test case for `unityLicensingProductIds`; modified existing test to clean up environment variable. | | src/model/build-parameters.ts | Introduced new public property `unityLicensingProductIds` in `BuildParameters` class. | | src/model/image-environment-factory.ts| Added handling for new environment variable `UNITY_LICENSING_PRODUCT_IDS` in `getEnvironmentVariables` method. | | src/model/input.ts | Added static getter method `unityLicensingProductIds` to retrieve input value. | | src/model/platform-setup.ts | Modified `SetupShared` method to replace `%LICENSE_PRODUCT_IDS%` with `buildParameters.unityLicensingProductIds`. | | src/model/platform-setup/setup-mac.ts | Added `UNITY_LICENSING_PRODUCT_IDS` to `setEnvironmentVariables` method in `SetupMac` class. | ## Sequence Diagram(s) ```mermaid sequenceDiagram participant User participant Action participant BuildParameters participant ImageEnvironmentFactory participant PlatformSetup User->>Action: Trigger Action with unityLicensingProductIds Action->>BuildParameters: Create instance with unityLicensingProductIds BuildParameters-->>Action: Return instance with product IDs Action->>ImageEnvironmentFactory: Get environment variables ImageEnvironmentFactory-->>Action: Return environment variables including UNITY_LICENSING_PRODUCT_IDS Action->>PlatformSetup: Setup platform with new variables PlatformSetup-->>Action: Complete setup ``` > 🐰 In the meadow, where rabbits play, > New IDs for licenses come our way. > With hops and bounds, we cheer with glee, > For Unity's magic, as bright as can be! > So let’s configure, let’s set the stage, > In our burrows, we’ll write the next page! 🌼

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share - [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai) - [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai) - [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai) - [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)
🪧 Tips ### Chat There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai): - Review comments: Directly reply to a review comment made by CodeRabbit. Example: - `I pushed a fix in commit , please review it.` - `Generate unit testing code for this file.` - `Open a follow-up GitHub issue for this discussion.` - Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples: - `@coderabbitai generate unit testing code for this file.` - `@coderabbitai modularize this function.` - PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples: - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.` - `@coderabbitai read src/utils.ts and generate unit testing code.` - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.` - `@coderabbitai help me debug CodeRabbit configuration file.` Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. ### CodeRabbit Commands (Invoked using PR comments) - `@coderabbitai pause` to pause the reviews on a PR. - `@coderabbitai resume` to resume the paused reviews. - `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository. - `@coderabbitai full review` to do a full review from scratch and review all the files again. - `@coderabbitai summary` to regenerate the summary of the PR. - `@coderabbitai resolve` resolve all the CodeRabbit review comments. - `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository. - `@coderabbitai help` to get help. ### Other keywords and placeholders - Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed. - Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description. - Add `@coderabbitai` anywhere in the PR title to generate the title automatically. ### CodeRabbit Configuration File (`.coderabbit.yaml`) - You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository. - Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information. - If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json` ### Documentation and Community - Visit our [Documentation](https://coderabbit.ai/docs) for detailed information on how to use CodeRabbit. - Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback. - Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.
ejnarvala commented 3 weeks ago

@webbertakken

I don't have any knowledge about the floating license server or multiple configured products. Would it be possible to link relevant documentation or howtos from Unity?

Yeah so here's Unity's docs on floating licensing servers: https://docs.unity.com/licensing/en-us/manual

I had linked this page which explains how to a floating licensing server can be configured to have multiple 'products' AKA 'toolsets' (I like to think of these as license pools).

This is also a good one to explain the configuration options for the client services-config.json: https://docs.unity.com/licensing/en-us/manual/ClientConfig

I think the relevant things to know here are that you can self-host a floating licensing server and that server can house multiple products which each have certain number of licenses/seats.

Clients can lease a license from the server as long as they have the services-config.json file which mainly defines the address of the licensing server so it knows where to make that request. The server is configured with a default product that it chooses the license from when no toolset is specified in the config file (or when the value is empty). This is what happens in unity-builder and unity-test-runner currently. In order to request license from multiple products/pools, the services-config.json needs to specify all the products (as a csv) it wants to consider getting licenses from.

Could someone verify that this change doesn't affect other use cases?

This is just an anecdote, but I've tested that having the toolset field as empty will result in using the default toolset, which is the same as the default behavior

GabLeRoux commented 3 weeks ago

@coderabbitai draw a flow chart for these changes

coderabbitai[bot] commented 3 weeks ago

[!TIP] For best results, initiate chat on the files or code changes.

@GabLeRoux, here's a flowchart illustrating the changes introduced in this PR:

flowchart TD
    subgraph Action Input
        A[Add 'unityLicensingProductIds' to action.yml]
        A --> B[Create Input getter 'unityLicensingProductIds' in input.ts]
    end
    B --> C[Update BuildParameters with 'unityLicensingProductIds' property]
    C --> D[Modify ImageEnvironmentFactory to include 'UNITY_LICENSING_PRODUCT_IDS' env variable]
    D --> E[Update PlatformSetup to replace '%LICENSE_PRODUCT_IDS%' in services-config.json]
    E --> F[Update SetupMac to set 'UNITY_LICENSING_PRODUCT_IDS' environment variable]
    F --> G[Unity Builder now supports multiple licensing products]

Let me know if you have any questions!

GabLeRoux commented 3 weeks ago

I've fixed the merge conflicts by simply merging origin/main into main and running npm run build again. Conflict was with dist folder.