fastlane-plugin-appcircle_enterprise_app_store 0.1.0 → 0.1.1.beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9a76511e9ec2a811056f62b51061d620f68cd739059037d693299e7ec3a40c01
4
- data.tar.gz: 8229f2aae80782a535e6187c87ac645265bdcae007e0d4aafb2eb900237ab780
3
+ metadata.gz: e581103d91753a0d1571b02b3b45cffd5fdb4fa250a2d7bb344d29f820ff2f43
4
+ data.tar.gz: fdb711c47083e69ba73a93921fdf80c2b70a87780d5b66b1c1af468de1a880ec
5
5
  SHA512:
6
- metadata.gz: fcf0c23f607e09562ca0d582eb00a895baf086e2cad4d0c7f8716a1cb20ad27d5d03b7238ea2145ba81d550f2cdd6c24e2b7b5f2b3652376ba7d5dfad4e4d4db
7
- data.tar.gz: b1c61e907277b7d2f330991988741f618c13383afd78cc99d0244c352bc98d209e1396b189de9f5838e930a1d6d368bbc077dd5de62b66367e9be94689cc81b5
6
+ metadata.gz: f8b3a0ecf725060ceb617d337663c1383c6bf5f50d82a1854c7a07176b5c9009db6b61a181c8cbc841abd0bf4847679b7ac608faa4ebbff3e332a409c4bfbddc
7
+ data.tar.gz: 29541e740bc7789764dbab2b625302fbbdf9f1db51f5137d41d17b615a8a8b095c202e0ff7d45f89ee11bdae0a1ca496af2bbef539b39601b476ffd62e3fc8ab
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  ## Appcircle Enterprise App Store
2
2
 
3
- [![fastlane Plugin Badge](https://rawcdn.githack.com/fastlane/fastlane/master/fastlane/assets/plugin-badge.svg)](https://rubygems.org/gems/fastlane-plugin-appcircle_enterprise_store)
3
+ [![fastlane Plugin Badge](https://rawcdn.githack.com/fastlane/fastlane/master/fastlane/assets/plugin-badge.svg)](https://rubygems.org/gems/fastlane-plugin-appcircle_enterprise_app_store)
4
4
 
5
- Appcircle Enterprise Mobile App Store is your own mobile app store for providing access to in-house apps with a customizable mobile storefront.
5
+ Appcircle Enterprise App Store is your own mobile app store for providing access to in-house apps with a customizable mobile storefront.
6
6
 
7
7
  - **Customizable Storefront:** Distribute your in-house apps with a fully customizable mobile storefront.
8
8
  - **Secure Distribution:** Everything you need for secure, streamlined distribution of your in-house apps.
@@ -10,14 +10,15 @@ Appcircle Enterprise Mobile App Store is your own mobile app store for providing
10
10
 
11
11
  Learn more about [Appcircle Enterprise App Store](https://appcircle.io/enterprise-app-store?utm_source=fastlane&utm_medium=plugin&utm_campaign=enterprise_app_store).
12
12
 
13
- ## What Sets Apart Appcircle Enterprise Mobile App Store
13
+ ## What Sets Apart Appcircle Enterprise App Store
14
14
 
15
15
  1. **Direct File Sharing:**
16
16
  - **Skip Traditional Stores:** Share .IPA, APK, or AAB files directly, avoiding the need to wait for Apple App Store or Google Play approvals.
17
17
  2. **Flexible Sharing Options:**
18
- - **Beta and Live Modes:** Share your app in ‘beta’ mode for testing new features or identifying bugs, or in ‘live’ mode for stable versions. This flexibility helps maintain the development lifecycle without interruptions.
18
+ - **Beta and Live Channels:** Share your app on the Beta channel for testing new features or identifying bugs, or on the Live channel for stable versions.
19
+ - **Unlisted Publishing:** Publish an app version as unlisted to make it accessible only through a direct link, without appearing in the store's app list.
19
20
  3. **Enhanced Security:**
20
- - **Secure Authentication:** Access the Enterprise Mobile App Store with extra secure authentication using Enterprise Authentication Methods.
21
+ - **Secure Authentication:** Access the Enterprise App Store with extra secure authentication using Enterprise Authentication Methods.
21
22
  - **Controlled Access:** Ensure that only authorized users can access the app store and its contents.
22
23
  4. **Customizable Mobile Storefront:**
23
24
  - **Tailored Experience:** Provide a customizable mobile storefront for your in-house apps, ensuring a tailored experience that aligns with your brand and user needs.
@@ -26,8 +27,10 @@ Learn more about [Appcircle Enterprise App Store](https://appcircle.io/enterpris
26
27
  6. **Streamlined Workflow:**
27
28
  - **Seamless Integration:** Integrates smoothly with your existing workflow, making it easy to manage and distribute apps within your organization.
28
29
  - **Efficient Management:** Track and manage applications, versions, testers, and teams effectively, ensuring a smooth distribution process.
30
+ 7. **Re-Sign and Auto-Resign:**
31
+ - **Update Without Rebuilding:** Re-sign iOS and Android binaries with updated signing identities, manually or automatically, and keep distributing without a new build.
29
32
 
30
- These features make the Appcircle Enterprise Mobile App Store a powerful tool for securely and efficiently distributing in-house applications, offering flexibility, enhanced security, and a streamlined workflow.
33
+ These features make the Appcircle Enterprise App Store a powerful tool for securely and efficiently distributing in-house applications, offering flexibility, enhanced security, and a streamlined workflow.
31
34
 
32
35
  ## System Requirements
33
36
 
@@ -42,17 +45,17 @@ These features make the Appcircle Enterprise Mobile App Store a powerful tool fo
42
45
 
43
46
  Note: We currently support **Appcircle Cloud**, with **self-hosted** support planned in our roadmap.
44
47
 
45
- ![Enterprise App Store Dashboard](https://cdn.appcircle.io/docs/assets/entstore-profilelist.png)
48
+ ![Enterprise App Store Dashboard](https://raw.githubusercontent.com/appcircleio/fastlane-plugin-appcircle_enterprise_app_store/main/images/ent_app_store.png)
46
49
 
47
50
  ### Generating/Managing the Personal API Tokens
48
51
 
49
52
  To generate a Personal API Token:
50
53
 
51
- 1. Go to the My Organization screen (second option at the bottom left).
52
- 2. Find the Personal API Token section in the top right corner.
53
- 3. Press the "Generate Token" button to generate your first token.
54
+ 1. Open the **My Organization** screen from your profile avatar at the bottom left.
55
+ 2. Go to the **Security** section and find the **Personal Access Key** card.
56
+ 3. Press **Generate Key** to generate your token.
54
57
 
55
- ![Token Generation](<https://cdn.appcircle.io/docs/assets/image%20(164).png>)
58
+ ![Token Generation](https://raw.githubusercontent.com/appcircleio/fastlane-plugin-appcircle_enterprise_app_store/main/images/PAT.png)
56
59
 
57
60
  ### Getting Started
58
61
 
@@ -76,8 +79,8 @@ After adding the plugin to your project, configure your Fastfile as follows:
76
79
  end
77
80
  ```
78
81
 
79
- - `personalAPIToken`: The Appcircle Personal API token is utilized to authenticate and secure access to Appcircle services, ensuring that only authorized users can perform actions within the platform.
80
- - `appPath`: Indicates the file path to the application that will be uploaded to Appcircle Testing Distribution Profile.
82
+ - `personalAPIToken` / `personalAccessKey`: Provide exactly one to authenticate with Appcircle services. Providing both, or neither, fails with a descriptive error.
83
+ - `appPath`: Indicates the file path to the application that will be uploaded to the Appcircle Enterprise App Store.
81
84
  - `releaseNote`: Contains the details of changes, updates, and improvements made in the current version of the app being published.
82
85
  - `Summary`: Used to provide a brief overview of the version of the app that is about to be published.
83
86
  - `publishType`: Specifies the publishing status as either none, beta, or live, and must be assigned the values "0", "1", or "2" accordingly.
@@ -105,7 +108,7 @@ If you run a self-hosted Appcircle installation, point the action to your own en
105
108
 
106
109
  **If two workflows start simultaneously, the last workflow to reach the publish step will be the up-to-date version on the Enterprise App Store. If these workflows building the same package version, the first publish will be successful, while later deployments with the same version will fail.**
107
110
 
108
- > **Self-signed or private CA certificates:** If your self-hosted Appcircle server uses a self-signed certificate (or one issued by a private/internal CA), requests will fail certificate validation. The plugin does not disable TLS verification. Trust the server's CA on the machine running Fastlane add it to the system certificate store, or point the `SSL_CERT_FILE` environment variable at a PEM bundle that includes it.
111
+ > **Self-signed or private CA certificates:** If your self-hosted Appcircle server uses a self-signed certificate (or one issued by a private/internal CA), requests will fail certificate validation. The plugin does not disable TLS verification. Trust the server's CA on the machine running Fastlane: add it to the system certificate store, or point the `SSL_CERT_FILE` environment variable at a PEM bundle that includes it.
109
112
 
110
113
  ### Leveraging Environment Variables
111
114
 
@@ -123,4 +126,4 @@ If you have trouble using plugins, check out the [Plugins Troubleshooting](https
123
126
 
124
127
  ### Reference
125
128
 
126
- For more detailed instructions and support, visit the [Appcircle Enterprise App Store documentation](https://appcircle.io/enterprise-app-store).
129
+ For more detailed instructions and support, visit the [Appcircle Enterprise App Store documentation](https://docs.appcircle.io/marketplace/fastlane/enterprise-app-store).
@@ -103,13 +103,13 @@ module Fastlane
103
103
  end
104
104
 
105
105
  def self.uploadToProfile(appPath, summary, releaseNotes, publishType)
106
- response = UploadService.upload_artifact(token: @@apiToken, app: appPath, api_endpoint: @@apiEndpoint)
106
+ response = EnterpriseAppStoreUploadService.upload_artifact(token: @@apiToken, app: appPath, api_endpoint: @@apiEndpoint)
107
107
  result = self.checkTaskStatus(response["taskId"])
108
108
 
109
109
  if result
110
- profileId = UploadService.getProfileId(authToken: @@apiToken, api_endpoint: @@apiEndpoint)
111
- appVersions = UploadService.getAppVersions(auth_token: @@apiToken, entProfileId: profileId, api_endpoint: @@apiEndpoint)
112
- appVersionId = UploadService.getVersionId(versionList: appVersions)
110
+ profileId = EnterpriseAppStoreUploadService.getProfileId(authToken: @@apiToken, api_endpoint: @@apiEndpoint)
111
+ appVersions = EnterpriseAppStoreUploadService.getAppVersions(auth_token: @@apiToken, entProfileId: profileId, api_endpoint: @@apiEndpoint)
112
+ appVersionId = EnterpriseAppStoreUploadService.getVersionId(versionList: appVersions)
113
113
  if publishType != "0"
114
114
  self.publishToStore(profileId, appVersionId, summary, releaseNotes, publishType)
115
115
  end
@@ -127,7 +127,7 @@ module Fastlane
127
127
  publish_type: publishType,
128
128
  api_endpoint: @@apiEndpoint
129
129
  }
130
- response = UploadService.publishVersion(options)
130
+ response = EnterpriseAppStoreUploadService.publishVersion(options)
131
131
  rescue StandardError => e
132
132
  UI.error("App could not publish at Enterprise App Store. #{e&.response}")
133
133
  raise e
@@ -155,7 +155,7 @@ module Fastlane
155
155
 
156
156
  def self.details
157
157
  # Optional:
158
- "Appcircle Enterprise Mobile App Store is your own mobile app store for providing access to in-house apps with a customizable mobile storefront"
158
+ "Appcircle Enterprise App Store is your own mobile app store for providing access to in-house apps with a customizable mobile storefront"
159
159
  end
160
160
 
161
161
  def self.available_options
@@ -3,9 +3,10 @@ require 'uri'
3
3
  require 'json'
4
4
  require 'rest-client'
5
5
 
6
- BASE_URL = "https://api.appcircle.io"
6
+ module EnterpriseAppStoreUploadService
7
+ UI = FastlaneCore::UI
8
+ BASE_URL = "https://api.appcircle.io"
7
9
 
8
- module UploadService
9
10
  def self.put_with_retry(url, body, headers, max_retries: 5)
10
11
  attempt = 0
11
12
  delay = 1.0
@@ -39,20 +40,37 @@ module UploadService
39
40
  begin
40
41
  info_uri = URI("#{api_endpoint}/store/v1/profiles/app-versions")
41
42
  info_uri.query = URI.encode_www_form({ action: 'uploadInformation', fileName: file_name, fileSize: file_size })
42
- upload_info = JSON.parse(RestClient.get(info_uri.to_s, auth_header).body)
43
+
44
+ UI.message("Getting file upload information...")
45
+ info_response = RestClient.get(info_uri.to_s, auth_header)
46
+ if info_response.code.between?(200, 299)
47
+ UI.success("File upload information retrieved successfully with status code: #{info_response.code}")
48
+ else
49
+ UI.error("Failed to retrieve file upload information with status code: #{info_response.code}")
50
+ raise "Failed to retrieve file upload information."
51
+ end
52
+ upload_info = JSON.parse(info_response.body)
43
53
  file_id = upload_info['fileId']
44
54
  upload_url = upload_info['uploadUrl']
45
55
  configuration = upload_info['configuration']
46
56
  http_method = (configuration && configuration['httpMethod']) ? configuration['httpMethod'].to_s.upcase : 'PUT'
47
57
 
58
+ UI.message("Uploading file to Appcircle...")
48
59
  if http_method == 'POST'
49
60
  sign_parameters = configuration['signParameters'] || {}
50
61
  payload = {}
51
62
  sign_parameters.each { |key, value| payload[key] = value }
52
63
  payload['file'] = File.new(file_path, 'rb') # the 'file' field MUST be last
53
- RestClient.post(upload_url, payload)
64
+ upload_response = RestClient.post(upload_url, payload)
54
65
  else
55
- put_with_retry(upload_url, File.binread(file_path), { content_type: 'application/octet-stream' })
66
+ upload_response = put_with_retry(upload_url, File.binread(file_path), { content_type: 'application/octet-stream' })
67
+ end
68
+
69
+ if upload_response.code.between?(200, 299)
70
+ UI.success("File upload finished successfully with status code: #{upload_response.code}")
71
+ else
72
+ UI.error("File upload failed with status code: #{upload_response.code}")
73
+ raise "File upload failed."
56
74
  end
57
75
 
58
76
  commit_uri = URI("#{api_endpoint}/store/v1/profiles/app-versions")
@@ -60,7 +78,16 @@ module UploadService
60
78
 
61
79
  commit_payload = { fileId: file_id, fileName: file_name }.to_json
62
80
  commit_headers = { Authorization: "Bearer #{token}", content_type: :json, accept: 'application/json' }
63
- JSON.parse(RestClient.post(commit_uri.to_s, commit_payload, commit_headers).body)
81
+
82
+ UI.message("Committing file upload...")
83
+ commit_response = RestClient.post(commit_uri.to_s, commit_payload, commit_headers)
84
+ if commit_response.code.between?(200, 299)
85
+ UI.success("Commit successful with status code: #{commit_response.code}")
86
+ else
87
+ UI.error("Commit failed with status code: #{commit_response.code}")
88
+ raise "Commit failed with status code: #{commit_response.code}"
89
+ end
90
+ JSON.parse(commit_response.body)
64
91
  rescue RestClient::ExceptionWithResponse => e
65
92
  raise e
66
93
  rescue StandardError => e
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
2
  module AppcircleEnterpriseAppStore
3
- VERSION = "0.1.0"
3
+ VERSION = "0.1.1.beta.1"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane-plugin-appcircle_enterprise_app_store
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1.beta.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - appcircleio
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-06-30 00:00:00.000000000 Z
11
+ date: 2026-07-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client
@@ -54,12 +54,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
54
54
  version: '2.6'
55
55
  required_rubygems_version: !ruby/object:Gem::Requirement
56
56
  requirements:
57
- - - ">="
57
+ - - ">"
58
58
  - !ruby/object:Gem::Version
59
- version: '0'
59
+ version: 1.3.1
60
60
  requirements: []
61
61
  rubygems_version: 3.3.27
62
62
  signing_key:
63
63
  specification_version: 4
64
- summary: Efficiently publish your apps to Appcircle Enterprise Store
64
+ summary: Appcircle Enterprise App Store is your own mobile app store for providing
65
+ access to in-house apps with a customizable mobile storefront.
65
66
  test_files: []