はじめに
こんにちは!サーバワークスの橋本です。
本ブログではローカル環境で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の派生言語で書きます。
以下の順番で実行しています。
- 「Pipeline Test」を出力。
- awscliのバージョンを出力。
- 登録したAWS Credentialsを使ってS3にtest.txtファイルをアップロード。
- 成否を判断し、「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パイプラインの構成例となります。
構成例
- GitHubからソースコードを取得(チェックアウト)
- ビルド
- テスト
- イメージをECRにプッシュ
- ECSにデプロイ
- Success/FailureをSlackに通知
以上、Jenkins With AWSでした!
少しでもJenkinsが好きな人が増えるといいなと思います。