Jenkins&Docker로 깨끗한 Angular6 앱의 빌드 환경을 구축해 보았다.

개요



온프레 환경의 Jenkins에서 클라이언트 앱을 빌드했지만,
Bower나 node.js등의 버전 업에 추종하는 것이 필요했다.
그러나 매번 라이브러리와 관련된 앱을 빌드 할 때 문제가 발생할 수 있습니다.
귀찮다고 생각했다.

그래서 Docker 컨테이너 내에서 빌드하면 Jenkins 서버를 더럽히지 않고
깨끗한 환경에서의 빌드도 할 수 있어, 좋은 일 다 하는 것이 된다
구축해 보았다는 이야기.

어쨌든 DevOps 같은 일을한다면, 지금까지 GUI로 포치 포치 설정 해 온 Jenkins의 설정도
Jenkinsfile로 구성 관리를 시도했다.

전제







OS
Amazon Linux 2(ami-a9d09ed1)

Jenkins
jenkins.noarch-2.121.2-1.1

도커
docker-ce-18.06.0


Jenkins 설치가 완료되었다고 가정합니다.

Amazon Linux2에 Docker 설치



일반적으로 설치를 시도하면 다음 오류가 발생하고 yum install가 실패합니다.
Error: Package: docker-ce-18.06.0.ce-3.el7.x86_64 (docker-ce-stable)
           Requires: container-selinux >= 2.9

실패하는 절차와 해결 방법을 함께 설명합니다.
[ec2-user@ip-xxx-xx-xx-xxx ~]$ sudo yum install -y yum-utils device-mapper-persi stent-data lvm2
[ec2-user@ip-xxx-xx-xx-xxx ~]$ sudo yum-config-manager --add-repo https://downlo ad.docker.com/linux/centos/docker-ce.repo
[ec2-user@ip-xxx-xx-xx-xxx ~]$ sudo yum list docker-ce --showduplicates | sort - r
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
docker-ce.x86_64            18.06.0.ce-3.el7                    docker-ce-stable
docker-ce.x86_64            18.03.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            18.03.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.12.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.12.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.09.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.09.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.06.2.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.06.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.06.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.03.2.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.03.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.03.0.ce-1.el7.centos             docker-ce-stable
Available Packages
[ec2-user@ip-xxx-xx-xx-xxx ~]$ sudo yum install docker-ce
・・・・(中略)
Error: Package: docker-ce-18.06.0.ce-3.el7.x86_64 (docker-ce-stable)
           Requires: container-selinux >= 2.9
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest
★ここでエラーが発生する。★
[ec2-user@ip-xxx-xx-xx-xxx ~]$ sudo yum makecache fast
[ec2-user@ip-xxx-xx-xx-xxx ~]$ sudo yum install -y http://mirror.centos.org/cent os/7/extras/x86_64/Packages/container-selinux-2.42-1.gitad8f0f7.el7.noarch.rpm
[ec2-user@ip-xxx-xx-xx-xxx ~]$ sudo yum -y install docker-ce
[ec2-user@ip-xxx-xx-xx-xxx ~]$ 


Docker를 ec2user가 속한 그룹에 추가


[ec2-user@ip-xxx-xx-xx-xxx ~]$ sudo service docker start
Redirecting to /bin/systemctl start docker.service
[ec2-user@ip-xxx-xx-xx-xxx ~]$ sudo usermod -a -G docker ec2-user
[ec2-user@ip-xxx-xx-xx-xxx ~]$ sudo systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[ec2-user@ip-xxx-xx-xx-xxx ~]$ exit
logout

★一旦ログアウト★

[ec2-user@ip-xxx-xx-xx-xxx ~]$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[ec2-user@ip-xxx-xx-xx-xxx ~]$ docker -v
Docker version 18.06.0-ce, build 0ffa825
[ec2-user@ip-xxx-xx-xx-xxx ~]$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world

9db2ca6ccae0: Pulling fs layer 985B9db2ca6ccae0: Pull complete Digest: sha256:4b8ff392a12ed9ea17784bd3c9a8b1fa3299cac44aca35a85c90c5e3c7afacdc
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

[ec2-user@ip-xxx-xx-xx-xxx ~]$ 

Jenkins 사용자를 Docker 그룹에 추가


[ec2-user@ip-xxx-xx-xx-xxx ~]$ sudo gpasswd -a jenkins docker
Adding user jenkins to group docker
[ec2-user@ip-xxx-xx-xx-xxx ~]$ sudo systemctl restart jenkins

Jenkins 작업에서 Docker 실행



Jenkins 작업 설정에서 HelloWorld가 작동하는지 확인합니다.




설정을 저장하고 Jenkins 작업을 실행하면 성공합니다.
Started by user jenkins
Building in workspace /var/lib/jenkins/workspace/docker-hello-world
[docker-hello-world] $ /bin/sh -xe /tmp/jenkins4477945998331500442.sh
+ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
9db2ca6ccae0: Pulling fs layer
9db2ca6ccae0: Verifying Checksum
9db2ca6ccae0: Download complete
9db2ca6ccae0: Pull complete
Digest: sha256:4b8ff392a12ed9ea17784bd3c9a8b1fa3299cac44aca35a85c90c5e3c7afacdc
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

Finished: SUCCESS

git 설치


[ec2-user@ip-xxx-xx-xx-xxx ~]$ sudo yum -y install curl-devel expat-devel gettex t-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker autoconf gcc cc
[ec2-user@ip-xxx-xx-xx-xxx ~]$ cd /usr/local/src
[ec2-user@ip-xxx-xx-xx-xxx src]$ sudo wget https://www.kernel.org/pub/software/s cm/git/git-2.9.5.tar.gz
[ec2-user@ip-xxx-xx-xx-xxx src]$ sudo tar vfx git-2.9.5.tar.gz > /dev/null
[ec2-user@ip-xxx-xx-xx-xxx src]$ cd git-2.9.5
[ec2-user@ip-xxx-xx-xx-xxx git-2.9.5]$ sudo make configure
[ec2-user@ip-xxx-xx-xx-xxx git-2.9.5]$ sudo ./configure --prefix=/usr/local
[ec2-user@ip-xxx-xx-xx-xxx git-2.9.5]$ sudo make all
[ec2-user@ip-xxx-xx-xx-xxx git-2.9.5]$ sudo make install
[ec2-user@ip-xxx-xx-xx-xxx git-2.9.5]$ git --versonion
git version 2.9.5
[ec2-user@ip-xxx-xx-xx-xxx git-2.9.5]$ 

Angular6 빌드 준비



이제 Jenkins에서 Docker를 움직일 수 있게 되었기 때문에, 드디어 본제의 Angular6 빌드에 넣을 것 같아. . .
Jenkins 사용자의 사용자 ID와 그룹 ID를 먼저 확인합니다.
이것은 Docker 컨테이너 내에서 jenkins를 만들고 호스트 측의 Jenkins 사용자 ID 및 그룹 ID와 같지 않으면 작동하지 않는 엉뚱한 것처럼 설정해야하기 때문입니다.
[ec2-user@ip-xxx-xx-xx-xxx ~]$ id jenkins
uid=997(jenkins) gid=995(jenkins) groups=995(jenkins),993(docker)
[ec2-user@ip-xxx-xx-xx-xxx ~]$

샘플 포크



이번, 빌드 샘플로서 이용시켜 주는 것은 이쪽.
htps : // 기주 b. 코 m / 굉장한 ks r / 앙구 r-rea l rld - 에어 mp ぇ - 어 p

그리고 그것을 포크 한 내용이 여기입니다.
htps : // 기주 b. 코 m / 타츠 아키미 타니 / 앙구 r-rea l rld-a-mp ぇ

Dockerfile



이것은 더 스마트한 방법을 아시는 분은 가르쳐 주셨으면 합니다. . .

Dockerfile.build
FROM centos:7

# Install Python and Node.js
RUN yum install -y https://centos7.iuscommunity.org/ius-release.rpm epel-release
RUN yum install -y wget unzip
RUN curl --silent --location https://rpm.nodesource.com/setup_8.x | bash -
RUN yum -y install nodejs sudo
RUN sed -i -e 's/^#\s%wheel\s*ALL=(ALL)\s*ALL$/%wheel\tALL=(ALL)\tALL/g' /etc/sudoers
RUN sed -i -e 's/^#\s%wheel\s*ALL=(ALL)\s*NOPASSWD: ALL$/jenkins\tALL=(ALL)\tNOPASSWD: ALL/g' /etc/sudoers
RUN groupadd -g 995 jenkins # ★gidを一致させる★
RUN useradd -u 997 -g 995 jenkins # ★uid & gidを一致させる★
RUN usermod -aG wheel jenkins # ★jenkinsユーザにwheelグループ所属させ、パスワードなしでグローバル設定を可能にする。★

USER jenkins # jenkinsユーザに切り替え

ENV EXEC_ENV=TEXT


Jenkinsfile



pipeline {

    environment {
        docker_image_name = "angular6-build"
    }

    agent {
        dockerfile {
            filename 'Dockerfile.build'
            dir '.'
            label env.docker_image_name
        }
    }

    stages {

        stage('Pre-Build') {
            steps {
                script{
                    dir('.'){
                        sh 'npm --version'
                        sh 'sudo npm i -g  @angular/cli' // グローバルインストールが必要
                        sh 'npm install'
                    }
                }
            }
        }

        stage('Build') {
            steps {
                script {
                    dir('.') {
                        sh 'ng build'
                    }
                }
                script {
                    dir('dist') { // ビルド成果物をtar.gzにまとめる
                        sh 'tar -cvzf voting-client.tar.gz *'
                    }
                }
                archiveArtifacts 'dist/voting-client.tar.gz'
            }
        }

    }
}

Jenkins 작업 설정



파이프라인을 선택합니다.


파이프라인 설정에서 [Pipeline script from SCM]⇒[Git]⇒[]를 입력하고 [완료] 버튼을 클릭합니다.



Jenkins 작업 실행



작업 실행이 성공하면 다음과 같이 파이프 라인 결과가 출력됩니다.


앞으로 할 일



클라이언트의 테스트나 정적 해석을 걸고 있지 않기 때문에, 그 결과 출력을 하고 싶다.
그리고 AWS에 자동 배포하는 설정에 대해 쓰고 싶습니다.

끝.

좋은 웹페이지 즐겨찾기