Skip to content

Commit b64d4c1

Browse files
author
Milind Mevada
authored
Merge pull request solutelabs#2 from smit-sonani-stl/master
Adding support for Codemagic CI/CD
2 parents 6ab852a + a4ae2f4 commit b64d4c1

File tree

2 files changed

+141
-1
lines changed

2 files changed

+141
-1
lines changed

README.md

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,27 @@ Coroutines based Start Activity For Result and Permission manager implementation
5050
- Jetpack Room
5151
- Jetpack Paging
5252
- Android KTX
53-
- Material Themes
53+
- Material Themes
54+
55+
### CI / CD
56+
57+
#### Codemagic
58+
59+
Codemagic.yaml file has been added at the root of source code. It contains sample pipelines for different build environments.
60+
61+
###### How to build?
62+
63+
1. Connect the project repository to codemagic using [this guide](https://docs.codemagic.io/getting-started/adding-apps-from-custom-sources/). Codemagic will auto-detect the yaml file which has sample workflow added.
64+
2. Select workflow and the branch from which buid to be generated. Start Build and it should generate the build.
65+
66+
###### What to be configured?
67+
- Except `production-store` workflow, all the workflows are configured to use Debug keystore generated on the fly from Codemagic's build machine.
68+
- For `production-store` workflow, the keystore related environment variables must be replaced with the project specific keystore info.
69+
70+
###### How to distribute?
71+
Once codemagic generates the artifacts, we can distribute the apps in various ways.
72+
73+
1. Using Firebase App Distribution. [More info](https://firebase.google.com/docs/app-distribution).
74+
One can automate the firebase distribution as mentioned [here](https://docs.codemagic.io/publishing-yaml/distribution/#publishing-an-app-to-firebase-app-distribution).
75+
2. Using platforms like [Diawi](https://www.diawi.com/)
76+
3. Sharing raw apk to user.

codemagic.yaml

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
workflows:
2+
development:
3+
name: Development
4+
scripts:
5+
- |
6+
# set up debug keystore
7+
rm -f ~/.android/debug.keystore
8+
keytool -genkeypair \
9+
-alias androiddebugkey \
10+
-keypass android \
11+
-keystore ~/.android/debug.keystore \
12+
-storepass android \
13+
-dname 'CN=Android Debug,O=Android,C=US' \
14+
-keyalg 'RSA' \
15+
-keysize 2048 \
16+
-validity 10000
17+
- name: Set up local properties
18+
script: echo "sdk.dir=$HOME/programs/android-sdk-macosx" > "$FCI_BUILD_DIR/local.properties"
19+
- name: Build Android app
20+
script: ./gradlew assembleDevelopmentRelease
21+
artifacts:
22+
- build/**/outputs/**/*.apk
23+
- build/**/outputs/**/*.aab
24+
- build/**/outputs/**/mapping.txt
25+
- flutter_drive.log
26+
publishing:
27+
email:
28+
recipients:
29+
- smit.sonani@solutelabs.com
30+
staging:
31+
name: Staging
32+
scripts:
33+
- |
34+
# set up debug keystore
35+
rm -f ~/.android/debug.keystore
36+
keytool -genkeypair \
37+
-alias androiddebugkey \
38+
-keypass android \
39+
-keystore ~/.android/debug.keystore \
40+
-storepass android \
41+
-dname 'CN=Android Debug,O=Android,C=US' \
42+
-keyalg 'RSA' \
43+
-keysize 2048 \
44+
-validity 10000
45+
- name: Set up local properties
46+
script: echo "sdk.dir=$HOME/programs/android-sdk-macosx" > "$FCI_BUILD_DIR/local.properties"
47+
- name: Build Android app
48+
script: ./gradlew assembleStagingRelease
49+
artifacts:
50+
- build/**/outputs/**/*.apk
51+
- build/**/outputs/**/*.aab
52+
- build/**/outputs/**/mapping.txt
53+
- flutter_drive.log
54+
publishing:
55+
email:
56+
recipients:
57+
- smit.sonani@solutelabs.com
58+
production-adhoc:
59+
name: Production - Local Distribution
60+
scripts:
61+
- |
62+
# set up debug keystore
63+
rm -f ~/.android/debug.keystore
64+
keytool -genkeypair \
65+
-alias androiddebugkey \
66+
-keypass android \
67+
-keystore ~/.android/debug.keystore \
68+
-storepass android \
69+
-dname 'CN=Android Debug,O=Android,C=US' \
70+
-keyalg 'RSA' \
71+
-keysize 2048 \
72+
-validity 10000
73+
- name: Set up local properties
74+
script: echo "sdk.dir=$HOME/programs/android-sdk-macosx" > "$FCI_BUILD_DIR/local.properties"
75+
- name: Build Android app
76+
script: ./gradlew assembleProductionRelease
77+
artifacts:
78+
- build/**/outputs/**/*.apk
79+
- build/**/outputs/**/*.aab
80+
- build/**/outputs/**/mapping.txt
81+
- flutter_drive.log
82+
publishing:
83+
email:
84+
recipients:
85+
- smit.sonani@solutelabs.com
86+
production-store:
87+
name: Production - Store Distribution
88+
environment:
89+
vars:
90+
FCI_KEYSTORE_PATH: /tmp/keystore.keystore
91+
FCI_KEYSTORE: Encrypted(Z0FBQUFBQmdZQjZwZkxFT2s3Y3NTN0lUME8xdUpUc1pMS2V1Rm45bUlxX3ZmNTZlTlN5b0RJZXpiUnJoSEp3SDZDSUk2dEREbDhMZ2ZYTWxEUllMY2VfMm5HU3JtMEtJcHVfQi1Vc0xVS3NIUUFhQXF3LUVnYWVSVDdmWEJ5MjNMNUs0VzNmUVJ2UlJ4YUxzYzY0VDJMOWE1bEh4TG5zUDdMQTd1WEtGWmp5Mk5RckdyODVNdFJNTkxORHY4TkNqcVNlV1AxWUc1Mmx0N2hnSDIyUGJKYVg4aGFIR25taDROOUdGX2RYVVM1Uy1uVXFlZnZIT3N2YUpJTzNqNzhRRFZYRUlxYkdKb2wzSUgtWEg3ajBFd1dZSW16YnVkQXN2Z2xSNFYzcXd4aTJUdmdQV0VJTFJxM0lVMGRIS0pfRFlzR1E3NEpGQUtSTG9yWEhic1V6WlNTVXl5QTlCekx1eThva21pcUtqTldNaTA0QVFSV1pfc0FFbkRKclFsdTd0a0kyN2k4QXhmcjVsaVNpYk9aZHItdGFDbzR0a1hKblY5bk9YYUNnM2ZqMUlUakpVN1l1bFhJWDYxVnNwVm5kekdqOWQzN1piWWJLbzBXemFWOEZQVHNUcUZUc0lXVFV2UjFZajZFWi1MdE04OFAwTGhJVTE2aUU0SU5jUjRMTkgxRi1kb3RnRkgzZWVSRFZUYnBaUzFCYVpPaEFWbDhqblo5bElUYktwbEE3MkR2dXlTd3hxMkVZZEJyLS03NWUyY3l4cDBHZm1NVG1vTzZIaTN3SEt6UTYzZ3VHVUtKd3RFNVEwdExpT01NNGtCaEJMaVZ3RVRSbmZoc194cHdaVWZIVG5KMjNHbDFTb1l5V0dNUDVBbkFXMjJnRS1oU0lrVy11eGYwVGxvVUxCUUtlLTQ2X3lGT1AtOEJPSmZuRXc5QVZoekRxandIdzlMcFZ3Wl9uQUtjN2pweW5Ld3U0ZENoVm1idlM2OGJHWW5VZ3c5clVhMUI1aXRXRzNWSEstRkxPeG9leUNTcWQ4ZU1PMmFaLVA3MTF3cXRWRVROVC1wMW4wRjJSM0VsMElFWEJrc3VtSXY5SjBOR0hEeDMyeEdxX1pqRHhSSUQxcTQxeG84RjhpWkZYMWk0Z3RXeldrQXpBMnFPRUMxQ3IzU0w1VTlqcmxjV0Q0c1VDVTlzRW9NdHVyeVoyeDgxZmRseEtmbTVpMWgwMVZrUlBCN2RNaHhjZVc0ajU1Z3JaVTZqVUpHRjdRS19nMVVqY1l6WHZxS2FXSXItOTZITTllY0ZhZDF4a1NlMVcyUHJxdFZkUFdFUUdJUnF2UlE3cnUtdmp2cDdIX19fNkN2S0lndHlldkZTZXFLNjNXOTBsNnJ4QjdlQTBFU05PR19LUUV3R2JQYTZET2Q3dHdnN3MwdFM4Vi03a1NrWkwzRVRRU1RnMkxQenpTVjNZNkFoZVVsc3VGOTItaHRVNkgwanlYUVhXRHB4TnVhZkphRk5HNnh3ZlZvMXJjUThicTFfTzQ3RndlVE05ck4tTERZUDlpRDI1QTF3S1RjNWJXRTR3VjhSNWlSaFBBdExlRTZmYXRDYU1tU2IwODgyZzBYOVNzeFEzTkpuakNzWFVnak5mbXI3b0NaMWRpM1R2UENnTENKVXo5M2xQRGxtWURHR1FvSEh2ME5FTV8yMmRhN3lxbVpVVk04MFprZVZBcEtpMDhwRndoczdrMjdTQWd5VU1YMHBzQi1CWWdaWFA3YWoyeGRmd01mLWZ3QWE2UmI4TTBPRWdCYlIzN1pIY19QdmZSSE10Ri1xQTFDOTlBOWhobWZsdUZlMDFqd0RrN0lOZlhyUXFlSWs5bVVPWDRjUWdiYnZkelpuZkpabHFnWkhTb1g4VUliVGpoa3ZFZkVxa1pFTzRlUk9qa2FiWFluUFZGNFpQT1JlSGdZUUdfaTFfOTF5NnF2bDVWaUt0UHNjS3hPSF9ZR282LVo5bC1iRmpJVXpSSnRFNWhPbnJyRzVtZTVaN1Q3aC1kT0N0bmxGQXFQLTQyZ1NwT3N3NFBweEE0ejVnS1JSUXR0Y1Q3VFhrWm1vaUpZc1hGTUZqcFRHeGRUQmV4akU3ZWZqQWFxX0VZRlhkOGlRTl9taFZSVDlnckZ3MW5oNTdaclhPM0ZaNjBBd1A1NHdlMXRGcGFVbjQyXzNmNUNLZ1k3eXoxNVVSN3BuWXI4T1paZ1JBQjVVNDJOdjlBdVZUWk1TM0ptOTlMbzlsTjBsV0p3REtnbDRaMzlPdERTVU5sVllIT2FTUllxSVkxMGVGNDl0V1B5c1NmQ01USi01c2RUeThXMnVWbGtGT3BselZMYVlJMHZMUWlQZmgxanY0LVc3ZGQ1TE15emJDeVZyVzZ6LWQ5Mjd4UkVKRTNIaFdGMWlUb2hfb2IzTnBVdHpXNmVJN25CUTR3NjZGckVxRlhGdjZndVRycTFZcHFpa1dqcG01aWx1d3RwcVp6SnFCVGFwVktIRWx4UlVMQkdRRVVwWktzU09EUVRwYUJ2d1UxaUJaeWFxVHpxS3c1eDF2ZUtXc1A2WFVMbUVIcERZQ0dLVzRzYW9YSmlhVkJQdWx5NjFPUXZQRmlZeDI0bEEyN202ZTBVUVpoVTlTOWQzMTlEbzhhWWQwSVdoOHZCVkZTM1Y4LVRESzY0NE11RENCZlZfZDJIM2NQNUd3VV9JOFdtd09WaF92bjdjcHpOUFFQUE1FY1RzbTM2VHNkWWlfaTFqTjUyRGVvSTBXT0tNNVY5VUJqdmNBMGhKeHZMbV9fZVBjd2ZZajNrUFQzODhnamx3Sy1faENlSHdUbUMzVXc0dnhNUmZFYTIxeEdLSXc1LVdwSXppLVhpSGl0UWhaUy1FRXdRVE1FZnFoNjAwdElxVUN6WmhrMllBSjNRcXEyNHozSHJFUmZxNERPNTR6M1J6V1E2TENVS2Y1QWMwM2pPYnFPeDI1eVdPV2N0RkF0SmhBZHFXWlpfYm0tb1FGV0JxOW9VZWtwMzRfVWktTWpUaWpJeW9oLWJLZmxNbnhBYTR6LW1TejNuRkxJejdHYzJPSVE0SnZqZkxlUGVRSVhZVE5OZjhuUmxhWm1WNmVHY2h4a1FmdkhMU0ZWMENyczE1MTdFZ1o3MWhicU56cEZnX0dPMVI1WHkzdUtmaGZLY2o0MUU1OTFkVHZwZTE4OC1XVmNNWjlrb093UlV6akZsUjlsQVVJbVpBRWdYamFrUi1oNDZSVDBPdWJuOEI0LUFoeGxPenpFTFhoSTA0c1lOZFBZWHR0RmU3MXhRVDY5NXRqQzh6WlN5VG13dlVqd2lMNFRjV1RXblJjWGM0dHhSY3lObFZyWmhtTVdIaTlodnJzVFhYZjhqa2lJaVBhbUpEYkxUQ2tuNk9CVFVOUXlJZ0psYURJQmRxNU4xNXlJbEJYTlR2RzdkLUduUDdNb2ljZkN4QXh3WnhfN0wzTmtSTGh1QUNlNTh5bXljSi1xSk96V1o5XzgxT3RzRVc2OThXb2lkRjhfOVlCNzdlX1hGalVIOUpXcUlFQVpQS1RDVVo3dEU2dnA4cDRXa0VvZlVaN2VXa2Z4cEJuZ2VaLUMyRVlGRDdEUDl0b0hGcDNucWtKLTJ0azRhNGlKS2diVHJqYnpqOTRXSGU5QXRUUktCWjhJdW5VSDJyV1hHUFFOR0lOb3FKVTlpSkFlSlphZ18wSnJ5WEtTeHBXbHB0UjVQZ05kb3UzUnc0Rm42dlFVMHotNk5mcWlqZlZyS1lINzhBYkp4cUZZUVFhZkFXZE1kNkVPZXRqMHlmU3RnUEFVS2N6UjBsSlg0MDJBZGJlZUh6cmw2RXRqNXU3QmktMGxuNUlCSVNsWVkzRGwtQl93eGlndVBUZWtsUDd0QUhFZ25YMlB6YjlhNzVndXVRN183UjZZdmQ3dFVCbnBHSVZuVVk4QUhYd0E2cWozbEU1dzU3cFFJWkRNV2N1dEU2RE1yc0JPbzVnUXRERl9sRUx6WTdZQjBkbzI1WWhnejNlbTdHbERJbnNqNmxwc1UwcVp0MFpkZnMxTHNZYWxUYUlmeWhkeE5vbXFGQTRXSlF2bkhLTXQtZWNzRnlTQ2tNRmVKeFJvcncyOW9iSGdnRTdENzBKU2trMzlVcEhXV2k5TmVzNWVOT28yN041Mk03OEF3dEdsbkd5c1VkTVFaeGN1SmQ4aVVUb1Z4WHZDdGFGOENMT3lGWEFHNGxTWVZxbkVLNXd3dnV1QzdOSE9vbmExUTJ5Y2VZVEF4VDZxMU04OFJ4WjZrREM4eGJ6dVRQVVJRZDhjRTdOV3FsSERlR29rd201OXYwT1ViU0RhTk9aWC1hbkFrbTdHMXZXTTYtZklyelVCOXFMRU90MkJvd3d5endJem1ob0pnUVRxdlZpWWY3NHpYTC04ay10UFJZaHZYS3NEQ0dPb1hpT2NUNDkwelBPNkplV1g0NkpUVkc5TlpNdl9vTnE2b0dTaWp4c1RYWnpSOEw3RUlLcHFNS0JhT3pwaGFvZThPLTk0eG8yZGUtWVN4Sm5BdDdSU2ZFRU1BRThjbkJVVUxuQlhsOGdZS3FuS0t5ZXl5eWdfNjZnUDNZQnVhc0RzLTFwV0J4VmR4blFaNVJxWVptNTBWR2M3cFlvYms2Ylh2QjhJaGFjdGRRN092QlVBTFZQdWlmcjdfZzFLWXgxS25iNGgzVG1JaWYtMlluTmM1SjJkbmdiUVBTQ0g5b285bUtpdWdNeUpfUzY0N3NZek00Q0Z2dGV1NlFMdUNsTzVtMWo0ajVMalVZLVBWQmxoeUhPUHRRLWlmMVcxUFBsa21JYUVuakVmZ2VpTDlmekdzaWhSUlJQWnh2cVdnRy1MZnFsMjQ4RVhIWXh0MUd1VXlVdFpoY3hCLXVXenZPblFtWU9MZV9Vd1BuZ1E2R053ZExXWGdqTEJ3eXRGd2RGMGhvbVJwRUZPR0hWLU1jdklra0pCNUNjU20xdDlVdjdwaFdtQXQxUHZnUmtSSVo2RnlJWTVNM3hCdDB3S2stOGRObEJ4N2NwWC1sRzF6TTdjSzRJTVJWSU1RcnQwbHNlZ2VudXN0SmpULTFXUE1PSHp0UE82dXV0THhmRlBtRE00V2l0eWtZb3NxX0I1c3R3Mm9YVEdwTi00bXJMV2J2X1ZuUEdhYXRMNl92OExJMW95YjVqcUJEMzFmczhTVDczbldncENjYnFhMGw2TTBGZE56MWFqMkxxUi0yRjR5aWJrejZxWlBTRVRETkxWdzZmNVpzNmgtSFhPTmxjNzhGVWVBYWhlczYwODBIWXZGYTJBYkNrVm01WGF1ZlAzUnNILVpaSUVhU3ZQUU5aX1lzczl3R3ZoNzA1Z1U5SUNTWlZCbHpMNjlDYThwTlo3SDZPQTRJZ25VQT09)
92+
FCI_KEYSTORE_PASSWORD: Encrypted(Z0FBQUFBQmdZQjZwX2lucmJ3a2VfRnpERDdjRWxBTGFURjV2akhiT3FNSW9XZ0hsTW9fZW5wemZJSy1pbDcxbFpMcldsSXJvWnFOQ1dzNzN3RUNrOU82aDVzbEFEc0dKeG1UaVY1Q2dkVlZua1ZqNnN3TDFLOVk9)
93+
FCI_KEY_PASSWORD: Encrypted(Z0FBQUFBQmdZQjZwSHYtV0duMTBJSXlHZG5mQnlTVmJyVGI4TGkzUGlMRWhlZm9Bb1pPZVNDME55NGxTdTlIdnM0VE00Z1RBX3pJSHdOcjdDZTltLWtkYkJzTVh6TXR6TnhmRXVnU0phaTh4bXduZWtDc3VVdEk9)
94+
FCI_KEY_ALIAS: Encrypted(Z0FBQUFBQmdZQjZwSXhaOGpEVlN0NmtmQUNvckNLejhIQzQzSldhTWtYVzJhZUZCRVhET3JjaUlYbVlpb3lKNWxqUXdqUzFGekNGN0dSODBsYjBuOHFqVU9RR2x5eVRpVHc9PQ==)
95+
scripts:
96+
- name: Set up local properties
97+
script: echo "sdk.dir=$HOME/programs/android-sdk-macosx" > "$FCI_BUILD_DIR/local.properties"
98+
- name: Set up key.properties file for code signing
99+
script: |
100+
echo $FCI_KEYSTORE | base64 --decode > $FCI_KEYSTORE_PATH
101+
cat >> "$FCI_BUILD_DIR/key.properties" <<EOF
102+
storePassword=$FCI_KEYSTORE_PASSWORD
103+
keyPassword=$FCI_KEY_PASSWORD
104+
keyAlias=$FCI_KEY_ALIAS
105+
storeFile=$FCI_KEYSTORE_PATH
106+
EOF
107+
- name: Build Android app
108+
script: ./gradlew bundleProductionRelease
109+
artifacts:
110+
- build/**/outputs/**/*.apk
111+
- build/**/outputs/**/*.aab
112+
- build/**/outputs/**/mapping.txt
113+
- flutter_drive.log
114+
publishing:
115+
email:
116+
recipients:
117+
- smit.sonani@solutelabs.com

0 commit comments

Comments
 (0)