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 +4 -4
- data/README.md +18 -15
- data/lib/fastlane/plugin/appcircle_enterprise_app_store/actions/appcircle_enterprise_app_store_action.rb +6 -6
- data/lib/fastlane/plugin/appcircle_enterprise_app_store/helper/upload_service.rb +33 -6
- data/lib/fastlane/plugin/appcircle_enterprise_app_store/version.rb +1 -1
- metadata +6 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e581103d91753a0d1571b02b3b45cffd5fdb4fa250a2d7bb344d29f820ff2f43
|
|
4
|
+
data.tar.gz: fdb711c47083e69ba73a93921fdf80c2b70a87780d5b66b1c1af468de1a880ec
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
[](https://rubygems.org/gems/fastlane-plugin-
|
|
3
|
+
[](https://rubygems.org/gems/fastlane-plugin-appcircle_enterprise_app_store)
|
|
4
4
|
|
|
5
|
-
Appcircle Enterprise
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-

|
|
46
49
|
|
|
47
50
|
### Generating/Managing the Personal API Tokens
|
|
48
51
|
|
|
49
52
|
To generate a Personal API Token:
|
|
50
53
|
|
|
51
|
-
1.
|
|
52
|
-
2.
|
|
53
|
-
3. Press
|
|
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
|
-

|
|
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
|
|
80
|
-
- `appPath`: Indicates the file path to the application that will be uploaded to Appcircle
|
|
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
|
|
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 =
|
|
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 =
|
|
111
|
-
appVersions =
|
|
112
|
-
appVersionId =
|
|
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 =
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
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.
|
|
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-
|
|
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:
|
|
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:
|
|
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: []
|