Jenkins With AWS 入門

記事タイトルとURLをコピーする

はじめに

こんにちは!サーバワークスの橋本です。
本ブログではローカル環境でJenkinsを構築し、パイプラインでAWS環境にアクセス(S3のリストにファイルをアップロード)までを行います。
なお、S3バケットの作成は省略しています。

Jenkinsについて

Jenkinsは名前だけでも知っている方が多いかもしれません。 それだけ長い歴史を持つ自動化ツールであり、主に継続的インテグレーション(CI)や継続的デリバリー(CD)の分野で活用されています。
豊富なプラグインが、テストの実行やデプロイの自動化など、多岐にわたるタスクを可能にしています。

ただし、Jenkinsの多機能性ゆえに、現場によっては高度な設定を行いすぎてしまい、 特定の担当者(通称「Jenkinsおじさん」)がいないと運用が滞るような状況に陥ることがあります。
このような課題もある一方で、Jenkinsは非常に便利で強力なツールであるため、 公式ドキュメントなどを参考にしながら、ぜひ気軽に触れてほしいです。

当然、豊富なプラグインの中にはAWS用の物もあります。

実行環境について

今回はWSLでDockerを使ってJenkinsを使用します。

WSLの設定

WSLの設定は同ブログのこちらを参考にしてください。

Docker Engineのインストール

WSLのUbuntuにDocker Engineをインストールします。※Docker公式参照

Jenkinsの起動

今回はDockerfileを使ってサクッとJenkinsを構築していきます。
Dockerfileの内容を簡単に説明すると以下を行っています。

  • Jenkinsイメージの最新をDockerHubから取得。
  • AWSCLIをインストール。
  • plugins.txtに記載しているプラグインをインストール。

Dockerfile

FROM jenkins/jenkins:latest

USER root

RUN apt-get update && apt-get install -y \
    curl unzip && \
    curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \
    unzip awscliv2.zip && \
    ./aws/install && \
    rm -rf aws awscliv2.zip && \
    apt-get clean

USER jenkins

COPY plugins.txt /usr/share/jenkins/ref/plugins.txt
RUN jenkins-plugin-cli --plugin-file /usr/share/jenkins/ref/plugins.txt

EXPOSE 8080

plugin.txtの作成

Jenkinsにインストールするプラグインを指定します。

aws-credentials:latest
pipeline-stage-view:latest
slack:latest

Dockerfileの配置場所

通常はホームディリクトリ直下に各ファイルを配置します。

jenkins_demo
├── Dockerfile
└── plugins.txt

Docker Build

以下のコマンドを実行し、ビルドします。

# イメージの作成
docker build -t jenkins_demo .

# 作成されたか確認
docker images

Docker Run

以下のコマンドを実行し、コンテナを起動します。

# コンテナの起動
docker run -p 8080:8080 -v /home/dev-user/example_project/jenkins_demo:/var/jenkins_home -d jenkins_demo:latest

# コンテナ起動確認(プロセスの確認)
docker ps

Jenkinsの初期設定

Jenkinsの初期設定を行っていきます。

Jenkinsへアクセス

コンテナ起動した時点でJenkinsは使用出来る状態なのでhttp://localhost:8080/でアクセスします。

Jenkins Unlock

アクセスしたらUnlock Jenkinsという画面が出るので、secretのinitialAdminPasswordの内容をコピーしてAdministrator passwordに貼り付けます。

補足 secretディリクトリはバインドしたディリクトリの直下に作成されます。

jenkins_demo
├── secret
│      └── initialAdminPassword ← これ
├── ・・・
├── ・・
└── ・

プラグインのインストール

Cutomize Jenkins画面が表示されます。 今回は推奨設定のプラグインを選択します。
すると推奨プラグインが自動でインストールされます。
※plugin.txtに追加したものは事前にインストールされていますので推奨設定の中には含まれていません。

管理ユーザの作成

管理者ユーザを作成します。

Jenkins URLの設定

今回はテストなので変更なしで設定します。

初期設定完了

完了画面が表示されたら初期設定完了です。 「Start using Jenkins」でダッシュボードを開いてみましょう。

AWS Credentialsの設定

aws configureを使って管理することもできるのですが、今回はJenkins Plugin(AWS Credentials)を使って簡単かつセキュアに管理していきます。

ダッシュボードの左サイドメニューからJenkinsの管理>Credentialsを選択します。

今回はAWSアクセスキーなのでglobalを選択します。

補足

System、globalはそれぞれ用途が異なります。 AWSアクセスキーはパイプラインで使用するためglobalを選択します。

  • SystemはJenkin自体で使う認証情報
  • globalはパイプラインやジョブで使う認証情報

AWS Credentialsを登録します。
これで登録した認証情報を使うことが出来ます。

項目 説明
種類 認証の種類(今回はAWS Credentialsを指定)
スコープ パイプラインで使用するのでグローバル
ID パイプラインで指定するID(任意)
説明 この認証キーの説明を記載
Access Key ID AWSのアクセスキーID
Secret Access Key AWSのシークレットアクセスキー
IAM Role Support IAMロールの設定をすることでよりセキュアに管理出来るが今回は無し

Jenkinsパイプラインの作成

ここからはパイプラインを作成していきます。

左サイドメニューから新規ジョブ作成>パイプラインを選択します。

ビルドトリガの設定

今回は、とりあえず実行するだけなのでデフォルトのままです。(需要があれば次回以降やろうと思います。)
※SCMをトリガーにパイプラインを実行する設定が出来ます。

通常は、プロジェクト配下にJenkinsfileを作成して読み込むことでパイプラインを実行しますが、今回はパイプラインの定義をPipeline scriptにしてさくっと作成します。

パイプラインコードについて

パイプラインのコードを簡単に説明します。
Groovyと呼ばれるJavaの派生言語で書きます。
以下の順番で実行しています。

  1. 「Pipeline Test」を出力。
  2. awscliのバージョンを出力。
  3. 登録したAWS Credentialsを使ってS3にtest.txtファイルをアップロード。
  4. 成否を判断し、「Success!」/「Failure!」を出力します。

パイプラインコード

pipeline {
    agent any
    stages {
        stage('Step1') {
            steps {
                sh """
                echo "Pipeline Test"
                """
            }
        }
        stage('Step2') {
            steps {
                sh """
                aws --version
                """
            }
        }
        stage('Step3') {
            steps {
                withCredentials([[
                    $class: 'AmazonWebServicesCredentialsBinding', 
                    credentialsId: 'awskey'
                ]]) {
                    sh '''
                    touch test.txt
                    aws s3 cp test.txt s3://swx-hashi-demo-bucket/test
                    '''
                }
            }
        }
    }
    post {
        success {
            echo 'Success!'
        }
        failure {
            echo 'Failure!'
        }
    }
}

実行結果

左サイドメニューのビルド実行を押下することでパイプラインを実行することが出来ます。
実行すると左から順番にパイプラインが実行されていることが分かります。

S3にもアップロードされています。

今回はサンプルで作成しただけですが、組み合わせ次第でかなり自由に構築することが出来ます。

最後に

以下は単一環境のシンプルなCI/CDパイプラインの構成例となります。

構成例

  1. GitHubからソースコードを取得(チェックアウト)
  2. ビルド
  3. テスト
  4. イメージをECRにプッシュ
  5. ECSにデプロイ
  6. Success/FailureをSlackに通知

以上、Jenkins With AWSでした!
少しでもJenkinsが好きな人が増えるといいなと思います。

はしもと しんご(記事一覧)

アプリケーションサービス部ディベロップメントサービス2課

猫が好きです。