159 lines
5.5 KiB
Groovy
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}"
|
|
}
|
|
}
|
|
}
|