まずはじめにJenkinsとGithubを連携する方法について記載します。

Github連携(サブディレクトリの指定)

(手順)
  • 新規ジョブ作成

  • ソースコードの管理を選択

  • Gitを選択

  • repository URLに利用するGithubのURLを記入

  • Branch Specifierにブランチを記入

aws-devops-fig

Jenkinsのworkspaceを変更

次にJenkinsのデフォルトのworkspaceを変更します
  • 下記の図のように記載してパスを変更
aws-devops-fig

Instanceを作成する

JenkinsのビルドをトリガーにAWSのインスタンスを生成してみます。
  1. Jenkinsビルド
  2. githubからgit cloneしてソースコードを取得
  3. AWS-CLIをキック
  4. Instanceが生成される
  • ビルド(シェルの実行)の設定
aws-devops-fig
# create-instance.shの中身

#!/bin/bash

RETRY_LIMIT=10
RETRY_COUNT=0
RETRY_SLEEP=2

function msg(){
  msg_=$1
  case $msg_ in
    success)
       echo "success!"
       ;;
    failed)
       echo "failed!"
       ;;
  esac
}

while :
  do
       aws ec2 run-instances --image-id ami-374db956 --count 1 --region ap-northeast-1 --instance-type t2.nano
       echo \n
    if [ $? -eq 0 ]; then
         msg success
         break

    elif [ ${RETRY_COUNT} -lt ${RETRY_LIMIT} ]; then
          RETRY_COUNT=`expr ${RETRY_COUNT} + 1`
          echo ${RETRY_LIMIT}
          echo ${RETRY_COUNT}
          sleep ${RETRY_SLEEP};
    else
          msg failed
          break
    fi
  done

パラメータビルドでinstance-idを指定して停止させる

  1. Jenkinsビルド
  2. githubからgit cloneしてソースコードを取得
  3. AWS-CLIをキック(Instance_idを指定)
  4. Instance停止
Jenkinsビルドパラメータの設定方法 aws-devops-fig
  1. Generalのタブを選択
  2. ビルドのパラメータ化にチェック
  3. パラメータの追加から文字列を選択
  4. 名前:INSTANCEIDと記入。※ ビルドのシェル実行時に使う名前にする
  5. デフォルト値:対象のInstance-idを入力する
  • ビルド(シェルの実行)の設定
aws-devops-fig
  • 実行するシェルスクリプト(stop-instance.sh)の中身
EC2_ID="$2"
aws ec2 stop-instances --region ap-northeast-1 --instance-ids ${EC2_ID}
  • (参考)Jenkins(コンソール出力結果)
Started by user yajima
Building in workspace /var/lib/jenkins/workspace/Stop-Instance
 > git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
 > git config remote.origin.url https://github.com/xxxxx/AWS # timeout=10
Fetching upstream changes from https://github.com/xxxxx/AWS
 > git --version # timeout=10
 > git fetch --tags --progress https://github.com/xxxxx/AWS +refs/heads/*:refs/remotes/origin/*
 > git rev-parse refs/remotes/origin/master^{commit} # timeout=10
 > git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10
Checking out Revision 7f6096eb86870ae5aed3f2dc4d838f6d5a477ec6 (refs/remotes/origin/master)
 > git config core.sparsecheckout # timeout=10
 > git checkout -f 7f6096eb86870ae5aed3f2dc4d838f6d5a477ec6
 > git rev-list 8f36634d3158537c3030fed258c6a82775dd6c59 # timeout=10
[Stop-Instance] $ /bin/sh -xe /tmp/hudson2899307456381419966.sh
+ export WORKSPACE
+ sudo sh -x /var/lib/jenkins/workspace/Stop-Instance/Script-For-Jenkins/stop-instance.sh --instance-ids i-xxxxxxx
+ EC2_ID=i-xxxxxxx
+ aws ec2 stop-instances --region ap-northeast-1 --instance-ids i-xxxxxxx
{
    "StoppingInstances": [
        {
            "InstanceId": "i-xxxxxxx",
            "CurrentState": {
                "Code": 64,
                "Name": "stopping"
            },
            "PreviousState": {
                "Code": 16,
                "Name": "running"
            }
        }
    ]
}
Finished: SUCCESS

パラメータビルドでinstance-idを指定して開始させる

  1. Jenkinsビルド
  2. githubからgit cloneしソースコードを取得
  3. AWS-CLIをキック(Instance_id指定)
  4. Instanceが起動する
  • ビルドパラメータの設定
aws-devops-fig
  • ビルド(シェルの実行)の設定
aws-devops-fig
  • start-instance.sh
EC2_ID="$2"
aws ec2 start-instances --region ap-northeast-1 --instance-ids ${EC2_ID}
  • (参考)Jenkins(コンソール出力結果)
Started by user yajima
Building in workspace /var/lib/jenkins/workspace/Start-Instance
 > git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
 > git config remote.origin.url https://github.com/xxxxx/AWS # timeout=10
Fetching upstream changes from https://github.com/xxxxx/AWS
 > git --version # timeout=10
 > git fetch --tags --progress https://github.com/xxxxx/AWS +refs/heads/*:refs/remotes/origin/*
 > git rev-parse refs/remotes/origin/master^{commit} # timeout=10
 > git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10
Checking out Revision 1b5fc91d1ea6f4a4c42ecbd0bef9564bbca2057b (refs/remotes/origin/master)
 > git config core.sparsecheckout # timeout=10
 > git checkout -f 1b5fc91d1ea6f4a4c42ecbd0bef9564bbca2057b
 > git rev-list 1b5fc91d1ea6f4a4c42ecbd0bef9564bbca2057b # timeout=10
[Start-Instance] $ /bin/sh -xe /tmp/hudson2908850958915652826.sh
+ export WORKSPACE
+ sudo sh -x /var/lib/jenkins/workspace/Start-Instance/Script-For-Jenkins/start-instance.sh --instance-ids i-xxxxxxx
+ EC2_ID=i-xxxxxxx
+ aws ec2 start-instances --region ap-northeast-1 --instance-ids i-xxxxxxx
{
    "StartingInstances": [
        {
            "InstanceId": "i-xxxxxxx",
            "CurrentState": {
                "Code": 0,
                "Name": "pending"
            },
            "PreviousState": {
                "Code": 80,
                "Name": "stopped"
            }
        }
    ]
}
Finished: SUCCESS

パラメータビルドでinstance-idを指定して削除させる

※ 設定は他と同じ
  1. Jenkinsビルド
  2. githubからgit cloneしソースコードを取得
  3. AWS-CLIをキック(Instance_id指定)
  4. InstanceがTerminate
  • (参考)Jenkins(コンソール出力結果)
Started by user yajima
Building in workspace /var/lib/jenkins/workspace/Terminate-Instance
Cloning the remote Git repository
Cloning repository https://github.com/xxxxx/AWS
 > git init /var/lib/jenkins/workspace/Terminate-Instance # timeout=10
Fetching upstream changes from https://github.com/xxxxx/AWS
 > git --version # timeout=10
 > git fetch --tags --progress https://github.com/xxxxx/AWS +refs/heads/*:refs/remotes/origin/*
 > git config remote.origin.url https://github.com/xxxxx/AWS # timeout=10
 > git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/* # timeout=10
 > git config remote.origin.url https://github.com/xxxxx/AWS # timeout=10
Fetching upstream changes from https://github.com/xxxxx/AWS
 > git fetch --tags --progress https://github.com/xxxxx/AWS +refs/heads/*:refs/remotes/origin/*
 > git rev-parse refs/remotes/origin/master^{commit} # timeout=10
 > git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10
Checking out Revision 1db0c95da337847e6ce9b65cec20476c0bce75d3 (refs/remotes/origin/master)
 > git config core.sparsecheckout # timeout=10
 > git checkout -f 1db0c95da337847e6ce9b65cec20476c0bce75d3
First time build. Skipping changelog.
[Terminate-Instance] $ /bin/sh -xe /tmp/hudson7271717192559596842.sh
+ export WORKSPACE
+ sudo sh -x /var/lib/jenkins/workspace/Terminate-Instance/Script-For-Jenkins/terminate-instance.sh --instance-ids i-d7534248
+ EC2_ID=i-d7534248
+ aws ec2 terminate-instances --region ap-northeast-1 --instance-ids i-d7534248
{
    "TerminatingInstances": [
        {
            "InstanceId": "i-d7534248",
            "CurrentState": {
                "Code": 32,
                "Name": "shutting-down"
            },
            "PreviousState": {
                "Code": 16,
                "Name": "running"
            }
        }
    ]
}
Finished: SUCCESS

JenkinsのAPIを外部から叩く

JenkinsのAPIでビルド実行をすれば、WebブラウザからJenkinsをGUIで実行する手間がいらなくなるのでやってみた
  • ユーザのトークン発行
    • [top] --> [開発者] --> [開発者を選択] --> [config] --> [APIトークン] --> [APIトークンの表示]
aws-devops-fig
  • ?depth=1でdepthを渡すと情報量を変更することができる。※ 数字が大きければ情報量が増す。
$ curl --user <username>:<token> http://jenkins_url/api/json?pretty=true | jq 'jobs'
[
  {
    "_class": "org.jenkinsci.plugins.workflow.job.WorkflowJob",
    "name": "AWS-Instance-AutoDev",
    "url": "http://<jenkins_url>/job/AWS-Instance-AutoDev/",
    "color": "notbuilt"
  },
  {
    "_class": "hudson.model.FreeStyleProject",
    "name": "Create-Instance",
    "url": "http://<jenkins_url>/job/Create-Instance/",
    "color": "blue"
  },
  {
    "_class": "hudson.model.FreeStyleProject",
    "name": "Create-Instance-Nogithub",
    "url": "http://<jenkins_url>/job/Create-Instance-Nogithub/",
    "color": "blue"
  },
  {
    "_class": "hudson.model.FreeStyleProject",
    "name": "knife-ec2",
    "url": "http://<jenkins_url>/job/knife-ec2/",
    "color": "red"
  },
  {
    "_class": "hudson.model.FreeStyleProject",
    "name": "Start-Instance",
    "url": "http://<jenkins_url>/job/Start-Instance/",
    "color": "blue"
  },
  {
    "_class": "hudson.model.FreeStyleProject",
    "name": "Stop-Instance",
    "url": "http://<jenkins_url>/job/Stop-Instance/",
    "color": "blue"
  },
  {
    "_class": "hudson.model.FreeStyleProject",
    "name": "Terminate-Instance",
    "url": "http://<jenkins_url>/job/Terminate-Instance/",
    "color": "blue"
  }
]

Jenkins APIを外部からコールする(ビルド実行、パラメータ付きビルド)

  • ビルド
$ curl -X POST --user <アカウント>:<トークン> http://<jenkins-url>/job/<job-name>/build
  • パラメータ付きビルド
$ curl -X POST --user <アカウント>:<トークン> http://<jenkins-url>/job/<job-name>/buildWithParameters?<parameter_name>=<instance_id>