feat: staging + production approval gate
This commit is contained in:
parent
2ad141354f
commit
342280707e
58
Jenkinsfile
vendored
58
Jenkinsfile
vendored
@ -168,7 +168,7 @@ assert r['version'] == '${IMAGE_TAG}', 'version galat!'
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
stage('Deploy to VM') {
|
stage('Deploy to STAGING') {
|
||||||
steps {
|
steps {
|
||||||
sh '''
|
sh '''
|
||||||
set +x
|
set +x
|
||||||
@ -177,19 +177,61 @@ assert r['version'] == '${IMAGE_TAG}', 'version galat!'
|
|||||||
export ANSIBLE_HOST_KEY_CHECKING=False
|
export ANSIBLE_HOST_KEY_CHECKING=False
|
||||||
export IMAGE_TAG=${IMAGE_TAG}
|
export IMAGE_TAG=${IMAGE_TAG}
|
||||||
ansible-galaxy collection install community.docker --force -q || true
|
ansible-galaxy collection install community.docker --force -q || true
|
||||||
ansible-playbook -i deploy/inventory.ini deploy/deploy.yml
|
ansible-playbook -i deploy/inventory.ini deploy/deploy.yml -e target=staging
|
||||||
'''
|
'''
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
stage('Post-deploy verify') {
|
stage('Verify STAGING') {
|
||||||
steps {
|
steps {
|
||||||
sh '''
|
sh '''
|
||||||
APPVM=$(awk -F= "/ansible_host/{print \\$2}" deploy/inventory.ini | tr -d " ")
|
SVM=$(grep "^staging-vm" deploy/inventory.ini | sed "s/.*ansible_host=//" | tr -d " ")
|
||||||
GOT=$(curl -sf --max-time 10 http://${APPVM}:8000/version | python3 -c "import sys,json;print(json.load(sys.stdin)['version'])")
|
GOT=$(curl -sf --max-time 10 http://${SVM}:8000/version | python3 -c "import sys,json;print(json.load(sys.stdin)[\'version\'])")
|
||||||
echo " expected: ${IMAGE_TAG} | live app: ${GOT}"
|
echo " staging expected: ${IMAGE_TAG} | live: ${GOT}"
|
||||||
[ "$GOT" = "${IMAGE_TAG}" ] || { echo "VERSION MISMATCH - deploy fail"; exit 1; }
|
[ "$GOT" = "${IMAGE_TAG}" ] || { echo "STAGING MISMATCH"; exit 1; }
|
||||||
echo " DEPLOY VERIFIED"
|
echo " STAGING VERIFIED"
|
||||||
|
'''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Production approval') {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
// Enterprise gate: insaan ki manzoori ke bina production par kuch nahi.
|
||||||
|
// 15 min me jawab na aaye to build abort - production safe rehta hai.
|
||||||
|
timeout(time: 15, unit: 'MINUTES') {
|
||||||
|
env.APPROVED = input(
|
||||||
|
message: "Staging theek hai. Production par ${env.IMAGE_TAG} deploy karein?",
|
||||||
|
ok: 'Deploy to Production',
|
||||||
|
parameters: [choice(name: 'DECISION', choices: ['Deploy', 'Abort'], description: '')]
|
||||||
|
)
|
||||||
|
}
|
||||||
|
if (env.APPROVED != 'Deploy') { error('Production deploy user ne rok diya') }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Deploy to PRODUCTION') {
|
||||||
|
steps {
|
||||||
|
sh '''
|
||||||
|
set +x
|
||||||
|
. ./.vault-registry.env
|
||||||
|
export REG_USER REG_PASS
|
||||||
|
export ANSIBLE_HOST_KEY_CHECKING=False
|
||||||
|
export IMAGE_TAG=${IMAGE_TAG}
|
||||||
|
ansible-playbook -i deploy/inventory.ini deploy/deploy.yml -e target=production
|
||||||
|
'''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Verify PRODUCTION') {
|
||||||
|
steps {
|
||||||
|
sh '''
|
||||||
|
PVM=$(grep "^app-vm" deploy/inventory.ini | sed "s/.*ansible_host=//" | tr -d " ")
|
||||||
|
GOT=$(curl -sf --max-time 10 http://${PVM}:8000/version | python3 -c "import sys,json;print(json.load(sys.stdin)[\'version\'])")
|
||||||
|
echo " production expected: ${IMAGE_TAG} | live: ${GOT}"
|
||||||
|
[ "$GOT" = "${IMAGE_TAG}" ] || { echo "PROD MISMATCH"; exit 1; }
|
||||||
|
echo " PRODUCTION VERIFIED"
|
||||||
'''
|
'''
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user