Build the mental model
Every mobile app follows roughly the same pipeline on its way to a user's device, no matter which framework wrote the source.
- Source Code and Dependencies
- Compile / Bundle
- Platform Build
- Sign
- Package
- Test
- Distribute
A development build keeps debugging tools attached, reloads quickly, and is meant only for the people building the app. A release build strips that out, applies optimizations, gets signed properly, and is what actually ships to real users. The exact terminology varies by framework, but the underlying split is universal.
Signing is what turns a release build into something a platform will trust. Conceptually, an app build combines with a signing credential to produce a signed app, and the platform verifies that signature to confirm identity and that nothing was tampered with.
Never commit signing credentials
Never commit keystores, certificates, or private keys to Git -- once pushed, they can remain in history forever even after deletion. Store them outside the repository and back them up somewhere durable and access-controlled.
Versioning gives users and stores two numbers: a human-facing version like 1.4.0, and an internal build or version code, like build 27, that can increment even between releases with the same visible version. The exact fields depend on the platform.
- App Signing
- The process of applying a cryptographic signature to a compiled app build so a platform can verify who published it and that it has not been altered since signing.
- Signing Credential
- The private key, certificate, or keystore file used to produce an app's signature -- it must be protected like a password and never committed to source control.
MOBILE BUILD PIPELINE
---------------------
MOBILE BUILD PIPELINE
-----------------------
Source Code
|
v
Dependencies
|
v
Compile / Bundle
|
v
Platform Build (Android / iOS toolchain)
|
v
Sign (App Build + Signing Credential -> Signed App)
|
v
Package
|
v
Test
|
v
DistributeConnect it to a real scenario
Set up signing discipline before you need it, not after a scare. Generate your signing credential once, then treat the resulting file the way you would a password.
- Store the credential file outside your Git repository and add its filename pattern to .gitignore immediately.
- Never paste its passphrase into a chat, ticket, or commit message.
- Back up a copy somewhere durable and access-controlled, like a password manager or a secrets vault.
Keep development and release builds clearly separated in your project configuration so nobody accidentally ships a debug-signed build to real users.
Confirm the credential
Check which credential actually signed this build.
Bump the visible version
Confirm the user-facing version number changed sensibly.
Bump the build number
Bump the internal build number so platforms and crash tools can tell builds apart.
Never commit signing credentials to Git
Never commit keystores, certificates, or private keys to source control -- back them up outside the repository, in a password manager or secrets vault, and restrict access to them.
Try the working example
function auditSigningSetup(setup) {
const risks = [];
if (!setup.keystoreInGitignore) {
risks.push("Signing files are not gitignored -- they could end up committed to source control.");
}
if (!setup.signingCredentialsBackedUp) {
risks.push("No backup of signing credentials -- losing them can block future updates to this app.");
}
if (setup.usingDebugSigningForRelease) {
risks.push("Release build is signed with a debug key -- not acceptable for distribution.");
}
return { riskCount: risks.length, risks, verdict: risks.length === 0 ? "safe" : "needs-attention" };
}
const riskySetup = {
keystoreInGitignore: false,
signingCredentialsBackedUp: false,
usingDebugSigningForRelease: true
};
const safeSetup = {
keystoreInGitignore: true,
signingCredentialsBackedUp: true,
usingDebugSigningForRelease: false
};
console.log("Risky setup:", auditSigningSetup(riskySetup));
console.log("Safe setup:", auditSigningSetup(safeSetup));The risky setup reports riskCount: 3 with all three risk messages (ungitignored keystore, no backup, debug signing for release) and verdict: 'needs-attention'. The safe setup reports riskCount: 0, an empty risks array, and verdict: 'safe'.5-minute try-it
Take an imaginary project setup and run it through the auditSigningSetup-style checker in this lesson with all three flags false. List every risk it reports, then flip each flag to true one at a time and note how the risk list shrinks.
One important caution
Committing a keystore or certificate to Git, even temporarily -- it can linger in history even after being deleted.
Accidentally signing a release build with a debug key, or losing a signing credential with no backup, blocking future updates.
Code signing - Wikipedia — How Mobile Apps Work