Greetings,
My employer gave me access to an Ionic AppFlow “Starter” plan that includes the add-on for building native app binaries, but I have some difficulty in trying to differentiate between “development” and “production” builds within my app runtime code.
Since my main machine is a Windows PC, I create all the Android builds locally, in which I run ionic cordova build android
for development builds and ionic cordova build android --prod --release
for release builds. However, I don’t have ready access to a new enough Mac to build for anything newer than iOS 12, so I rely on AppFlow Package for this. Is there any way to have the same behaviour in building apps through AppFlow’s builds?
Basically, because I can’t build and run locally to debug on Apple devices, I have certain UI elements which contain debug information that I need to see in-app to allow me to debug and fix app issues. Currently I have to edit the command assigned to the NPM build
script target to either include or exclude the --prod
and --release
flags each time I need a different build. Is this not something that AppFlow Package should (or could) handle through the “development” or “release” build types?
If not, is there something else that I can check in my app runtime code to tell which build I’m currently running?
Edit: Looking through the documentation and browsing the menu in my AppFlow Dashboard, I get the impression that the only way to control this programatically in the build process is with at least a “Growth” level Ionic AppFlow subscription… Is this correct?
I do feel this is something that should be catered for as a core part of the “Ionic Package” system, not as an extra add-on through the automation side… What’s the point in providing the option to create “development” or “release” profiles if you can’t control whether or not the app is built for “development” or “production”?
Either way, I have implemented a workaround using Git branches that seems pretty easy to maintain.
My project now has both a dev
and prod
environment configuration file, along with the relevant entries in angular.json
to use them with both the ng
and ionic
CLI tools.
I also make use of Ionic Deploy, so the default plugin configuration is set to do manual updates, while the dev
environment (specifically for distributing test builds) automatically updates from the “Development” channel and the prod
environment automatically updates from the “Production” channel.
Now I maintain the following Git branches:
-
master
as the main branch in source control (GitLab, in my case)
-
stable
as the “production” branch, pushed only to Ionic AppFlow
-
develop
as the “development” branch, pushed only to Ionic AppFlow
The AppFlow-only branches each contain a single commit to update the npm build
command, where:
-
stable
now runs ng build --prod
- this command appears to automatically pick the production environment config anyway…
-
develop
now runs ng build --configuration=dev
To create a testing build at any point to distribute, I simply rebase my develop
branch on the HEAD
of whatever I’m working on, force push to AppFlow and create a web build.
Similarly, to update the released production app, I rebase my stable
branch to the HEAD
of master
(after going through the typical pre-release workflow) and force push to AppFlow before creating a web build.
It it kinda hacky and it makes me feel real dirty inside, but I guess this will just have to do until something more “official” comes along. ![:confused: :confused:](https://emoji.discourse-cdn.com/twitter/confused.png?v=9)
2 Likes
Ok, so here’s a weird one… After reading through the AppFlow Environments documentation recently, I noticed that the CI environment sets a few variables, including CI_GIT_REF_TYPE
and CI_GIT_REF
.
Then from one of my existing apps, I tried pushing a tag to my ionic
remote and it worked fine:
![image](https://global.discourse-cdn.com/ionicframework/original/3X/4/8/48d35e6833a73bb1620ba7f2832a6d21eb7b5b9e.png)
At this point I thought I might get around this issue by adding a Bash script to my repo and changing the NPM build
script command to run that instead, allowing me to run conditional commands based on the value of these environment variables.
So, I duly created a new project for testing, linked it to a new app in Ionic AppFlow, ran npm version
to nump the version and set a tag, then I tried to push that tag to my ionic
remote, exactly as I had done with my existing project. But this resulted in the following error:
remote: Error: only pushes are allowed.
remote: error: hook declined to update refs/tags/v1.0.0
To git.ionicjs.com:nortechdev/ionic-appflow-tester.git
! [remote rejected] v1.0.0 -> v1.0.0 (hook declined)
error: failed to push some refs to 'git@git.ionicjs.com:nortechdev/ionic-appflow-tester.git'
At first I thought this might be because there were no branches in my ionic
remote yet, so I moved the HEAD
of master
to the previous commit, pushed that to ionic
(which worked fine), moved master
forward again to the point I had my tag and tried again, only to get the exact same error.
–
So what am I missing here, can we actually push tags to the Git repository in Ionic AppFlow or not?
1 Like
I think we have this fixed without breaking development build and without upgrading the subscription.
The CI build injects some environment variables to every build, even if you don’t pay to have custom environments. So we just check for the existence of one of those variables, CI_APP_ID, and build for production.
We changed our package.json “build” command to:
"build": "if [ $CI_APP_ID ]; then echo \"Building production release\" && ng build --prod; else ng build; fi",
Then in the AppFlow build output you can see “Building production release” and verify it is in fact building using environment.prod.ts but in development CI_APP_AP is not present so it does a normal development build.
I agree that it’s odd, when I select “release” as the build type I expected it to build with the production flag without any changes on my part. This should definitely be reflected in documentation somewhere with an official fix, but this seems to have worked for us.
1 Like
That’s an interesting idea… It doesn’t necessarily solve the initial problem, but it could very well be helpful in working around it.
Lately I’ve been making use of Apple TestFlight and Google Beta Tracks, each of which (I believe) require a build signed with a production certificate anyway. So suffice to say, I haven’t needed to use my previous workaround for this one for a while now.