こんにちは。クラウド事業部の菅家です。
EC2にJenkinsをインストールし、ジョブ作成まで実施しましたので手順について紹介します。
やったこと概要
- EC2(AmazonLinux 2023)に対してJenkinsを立てる
- Jenkinsジョブにてコンテナをビルドし、ECRに配置
- ビルドスクリプトとビルド対象のソースコードについてはGitに配置し、これを参照する
手順
AWSリソースの準備
EC2の作成
AWS マネジメントコンソールからEC2へ移動しインスタンスを開始します。
AMIは「AmazonLinux2023」を選択し、EC2に紐づけるセキュリティグループのインバウンドルールに22と8080(Jenkinsのデフォルトポート)を設定します。
8080ポートに関してはJenkinsの設定に応じて変更します。
ECRの作成
AWSマネジメントコンソールからECRに移動し、新規にプライべートリポジトリを作成します。
Jenkinsのインストールと起動
AmazonLinux2023に対してJenkinsをインストールします。
方法に関しては、以下の記事を参考にしました。
SSH経由でEC2にアクセスし、記事を参考にコマンドを叩いてインストールをしていきます。
具体的には、
- Java、Mavenのインストール
- Jenkinsのインストールと初期セットアップ
を行います。
ジョブ実行準備
Jenkinsジョブスクリプトの実行にあたり、権限などが必要となるため、ジョブの実行環境に対して各設定を行います。
slaveを作成し別環境でビルドすることもありますが、今回は、JenkinsをインストールしたEC2をそのままジョブ実行用のノードとして使用するため、すべてJenkinsをインストールしたEC2に対して設定を行います。
Gitのインストール
EC2にGitをインストールします。SSHでEC2にログインし、コンソールにて以下のコマンドを実行します。
$ sudo yum update -y $ sudo yum install git -y $ git version
JenkinsFileにてsudoコマンドが使用できるよう設定する
Jenkinsジョブでは「jenkins」ユーザーが使用されます。 jenkinsユーザーにはsudoコマンドを実行できる権限がないため、SSHでEC2にログインし、コンソールにて以下のコマンドを実行して許可します。
$ sudo visudo
以下を追加。
Defaults visiblepw jenkins ALL=(ALL) NOPASSWD:ALL
IAMロールの作成とEC2の紐づけ
JenkinsのジョブスクリプトからECRに対してプッシュできるよう設定を行います。
EC2からECRにアクセスできるようIAMロールをEC2に紐づけしていきます。
AWSマネジメントコンソールより、IAMに移動します。
左のメニューから、「ロール>ロールの作成」をクリック。
ロールの作成にて、
- 信頼されたエンティティの種類:「AWSサービス」
- ユースケース:「EC2」
を選択します。
ポリシーとして「EC2InstanceProfileForImageBuilder」を選択します。
公式リファレンス: EC2InstanceProfileForImageBuilder - AWS 管理ポリシー
EC2インスタンスを右クリックし、メニューから「セキュリティ>IAMロールを変更」をクリック。
IAMロールを変更画面から、プルダウンで先ほど作成したIAMロール選択し、「IAMロールの更新」ボタンをクリックしてアタッチします。
参考記事
qiita.com
ジョブの作成
Jenkinsジョブの作成・設定
ブラウザよりJenkinsにアクセスします。
ポートやURLの変更がなければ「EC2のIPアドレス:8080」でアクセスできます。
ダッシュボード左のメニューより、「+新規ジョブ作成」をクリック。
適当なジョブ名を付け、「パイプライン」を選択して「OK」ボタンをクリック。
ジョブの設定画面に遷移します。
ジョブの設定画面にて「パイプライン」の項目に移動します。
今回ビルドスクリプト(Jenkinsfile)はGitから取得するため、以下の設定を行います。
- 定義:Pipline script from SCM
- SCM:Git
- リポジトリ:スクリプトのおいてあるリポジトリのURL.git
認証情報:「+追加>Jenkins」として追加・選択します。
Domain:グローバルドメイン
種類:ユーザー名とパスワード
スコープ:グローバル
ユーザー名:Gitのユーザー名
パスワード:Gitのパスワード
ID:任意の値(のちに「Jenkinsに設定したGitのクレデンシャル変数名」として、build.groovy内で使用します。)Script Path:リポジトリ直下を現在のディレクトリとした開始ビルドスクリプトのパスを設定します。
ビルドスクリプト(Jenkinsfile)の作成
Gitディレクトリ構造
・jenkins
・build.groovy
・build.sh
・src
・Dockerfile
・index.html
build.groovy(Jenkinsfile)
pipeline { agent any environment { // AWS環境 AWS_REGION = 'ap-northeast-1' ECR_URI = 'XXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/' ECR_REPOSITORY_NAME = 'test_name' ECR_REPOSITORY_URI = 'XXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/test_name' GITLAB_REPOSITORY_URL = 'gitのURL.git' } stages { stage('Setup') { steps { // Git資材チェックアウト checkout scm } } stage('Checkout') { steps { // ワークスペースクリア deleteDir() // ビルドスクリプト、ソースコードの取得 checkout([$class: 'GitSCM', branches: [[name: '*/main']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '<Jenkinsに設定したGitのクレデンシャル変数名>', url: GITLAB_REPOSITORY_URL]] ]) } } stage('Build') { steps { script { // ビルドの実行 sh """ pwd ls -a chmod 755 ./jenkins/build.sh ./jenkins/build.sh """ } } } stage('Upload ECR') { steps { // AWSコンテナレジストリへアップロード sh """ aws ecr get-login-password --region ${AWS_REGION} | sudo docker login --username AWS --password-stdin ${ECR_URI} sudo docker images sudo docker tag <dockerイメージID> ${ECR_REPOSITORY_URI}:latest sudo docker push ${ECR_REPOSITORY_URI} """ } } } post { success { echo '成功' } failure { echo '失敗' } always { cleanWs() // ワークスペースのクリーンアップ } } }
build.sh
sudo docker build -t my-nginx-site ./src
Dockerfile
FROM 'nginx:latest' COPY index.html /usr/share/nginx/html/index.html RUN service nginx start
index.html
任意のHTMLを書いて保存
実行してみる
ビルドが成功し、ECR上にビルドしたコンテナがプッシュされました。
Jenkins
ECR
おわりに
今回はEC2に直接Jenkinsをインストールしたため、Jenkinsのインストールはもちろん、後からGitのインストールなど手間がかかりました。
今度はコンテナとしてJenkins環境を作成できるよう対応していきたいです。
また、今回はsrcフォルダ内にDockerfileを入れたのでsrcの外に移動しようとも思います。
お知らせ
APCはAWS Advanced Tier Services(アドバンストティアサービスパートナー)認定を受けております。
その中で私達クラウド事業部はAWSなどのクラウド技術を活用したSI/SESのご支援をしております。
www.ap-com.co.jp
https://www.ap-com.co.jp/service/utilize-aws/
また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。