CMDB-Server/ec2-user/deploy/userXX/step3/Jenkinsfile

159 lines
5.5 KiB
Groovy

pipeline {
agent any
environment {
AWS_ACCESS_KEY_ID = credentials('aws-access-key-id') // JenkinsのCredentialで設定したキー
AWS_SECRET_ACCESS_KEY = credentials('aws-secret-access-key') // 同じくCredentialで設定したシークレットキー
PUBLIC_IP = '' //WebサーバーのパブリックIP
PRIVATE_IP = '' //WebサーバーのプライベートIP
EC2_ID = '' //WebサーバーのEC2インスタンスID
ANSIBLE_HOST_KEY_CHECKING = false
RECIPIENT_SUCCESS = 'keduka@cm.jip.co.jp' // 成功時の通知先
RECIPIENT_FAILURE = 'Jenkins_sendmail@zohomail.jp' // 失敗時の通知先
}
options {
skipDefaultCheckout(true)
}
stages{
stage("checkout") {
steps {
// Iacコードを取得
checkout scm
}
}
stage("terraform init") {
steps {
// 初期化
dir('step3/terraform'){
sh "terraform init"
}
}
}
stage("terraform plan") {
steps {
// 実行計画
dir('step3/terraform'){
sh "terraform plan -out=plan.out"
}
}
}
stage("terraform apply") {
steps {
// 実行
dir('step3/terraform'){
sh "terraform apply plan.out"
}
}
}
stage('Get Terraform Output') {
steps {
// ファイル出力
script {
dir('step3/terraform'){
PUBLIC_IP = sh(returnStdout: true, script: 'terraform output -raw instance_public_ip').trim()
PRIVATE_IP = sh(returnStdout: true, script: 'terraform output -raw instance_private_ip').trim()
EC2_ID = sh(returnStdout: true, script: 'terraform output -raw instance_ec2_id').trim()
}
dir("${env.WORKSPACE}/step3/ansible"){
def data1 = "[web]\n" + PRIVATE_IP + "\n"
def var1 = "ansible_port=22\n"
def var2 = "ansible_user=ec2-user\n"
def var3 = "ansible_ssh_private_key_file=~/.ssh_key\n"
def data2 = "[web:vars]\n" + var1 + var2 + var3
def data = data1 + "\n" + data2
writeFile(file: 'host', text: data)
}
}
}
}
stage('Initialize') {
steps {
script {
// インスタンスのステータスOKまで待機
sh("aws ec2 wait instance-status-ok --instance-ids ${EC2_ID}")
}
}
}
stage('Syntax Check') {
steps {
script {
// Ansible Playbookの文法チェック
dir('step3/ansible'){
ansiblePlaybook(
playbook: 'playbook.yml',
inventory: 'host',
extras: '--syntax-check'
)
}
}
}
}
stage('Dry Run (Check Mode)') {
steps {
script {
// Ansible Playbookの仮実行 (チェックモード)
dir('step3/ansible'){
ansiblePlaybook(
playbook: 'playbook.yml',
inventory: 'host',
extras: '--check'
)
}
}
}
}
stage('Apply (Real Execution)') {
steps {
script {
// Ansible Playbookの本実行
dir('step3/ansible'){
ansiblePlaybook(
playbook: 'playbook.yml',
inventory: 'host'
)
}
}
}
}
stage('Check Web Application Status') {
steps {
script {
def status = '0'
try {
// Webサイトのステータスをチェックする
def url = "http://${PUBLIC_IP}/"
status = sh(script: "curl -o /dev/null -s -w '%{http_code}' ${url}", returnStdout: true).trim()
} catch (Exception e) {
// エラー発生時でもジョブを失敗させない
echo "Error while checking the website: ${e.getMessage()}"
}
if (status != '200') {
echo "Website is not accessible. Status code: ${status}"
} else {
echo "Website is running successfully. Status code: ${status}"
}
}
}
}
}
post {
success {
// 正常終了時にメール通知
mail to: "${RECIPIENT_SUCCESS}",
from: 'jenkins_sendmail@zohomail.jp',
subject: "SUCCESS: Web Application Deployed Successfully: ${currentBuild.fullDisplayName}",
body: "The web application was deployed successfully and is accessible at http://${PUBLIC_IP}/"
}
failure {
// エラー発生時にエラーメール通知
mail to: "${RECIPIENT_FAILURE}",
from: 'jenkins_sendmail@zohomail.jp',
subject: "FAILURE: Web Application Deployment Failed: ${currentBuild.fullDisplayName}",
body: "The web application deployment failed. Please check the Jenkins job for more details.\n${env.BUILD_URL}"
}
}
}