APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

EC2にJenkinsを立てて、ビルドジョブの作成と実行をする

こんにちは。クラウド事業部の菅家です。
EC2にJenkinsをインストールし、ジョブ作成まで実施しましたので手順について紹介します。

やったこと概要

  • EC2(AmazonLinux 2023)に対してJenkinsを立てる
  • Jenkinsジョブにてコンテナをビルドし、ECRに配置
  • ビルドスクリプトとビルド対象のソースコードについてはGitに配置し、これを参照する


手順

AWSリソースの準備

EC2の作成

AWS マネジメントコンソールからEC2へ移動しインスタンスを開始します。
AMIは「AmazonLinux2023」を選択し、EC2に紐づけるセキュリティグループのインバウンドルールに22と8080(Jenkinsのデフォルトポート)を設定します。
8080ポートに関してはJenkinsの設定に応じて変更します。

ECRの作成

AWSマネジメントコンソールからECRに移動し、新規にプライべートリポジトリを作成します。

docs.aws.amazon.com

Jenkinsのインストールと起動

AmazonLinux2023に対してJenkinsをインストールします。
方法に関しては、以下の記事を参考にしました。

qiita.com

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/

また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。

www.ap-com.co.jp