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}" } } }