본문 바로가기
Server System/CICD

AWS Lambda에 Jenkins + Bitbucket 연동해서 코드 배포하기

by 알파해커 2022. 11. 8.
반응형

Jenkins와 Bitbucket을 이용하여 AWS Lambda에 코드 배포하는 전과정을 경험 해보자.

 

먼저 Jenkins를 설치하고, 플러그인을 설치한 후, Bitbucket과 AWS에 연결하기 위한 Credential을 설정한다.

 

그 후 연동된 Bitbucket에서 가져온 Jenkinsfile을 이용해서 배포 파이프라인을 구성하여 최종적으로 Serverless Framework을 통해 AWS Lambda에 코드가 배포되는 과정을 확인해 볼 것이다.

 


Jenkins 설치

Jenkins 설치는 간단하다. brew를 이용해서 아래와 같은 명령어를 입력하면 된다.

$ brew install jenkins

 

설치가 완료되었다면, 아래의 명령어로 Jenkins를 시작/종료/재시작 할 수 있다.

$ brew services start jenkins     // Jenkins 시작
$ brew services stop jenkins      // Jenkins 종료
$ brew services restart jenkins   // Jenkins 재시작

 


Jenkins 실행

Jenkins를 실행 시켰다면, 브라우저를 열어서 Jenkins에 접속해보자. 로컬 컴퓨터라면 http://localhost:8080 혹은 http://127.0.0.1:8080을 통해서 접속할 수 있다.

 

위 빨간색으로 나타나있는 경로(/Users/xxx/.jenkins/secrets/initialAdminPassword)로 들어가서 초기 패스워드를 확인한다.

 

그 다음 화면에서 계정명/암호/이름/이메일 등의 관리자 정보를 입력한다.

이때 입력하는 암호는 잘 기억해두자. 만약에 암호를 분실하게 되면 Jenkins를 재설치 해야한다.

 

해당 작업이 끝나고 나면 Jenkins 초기화면을 다음과 같이 만날 수 있다.

 

 


외부에서 접근 가능하도록 만들기

Jenkins를 설치한 호스트를 외부에서도 접근할 수 있도록 하기 위해서는 설정을 수정해야한다.

나는 Jenkins를 Mac에 설치했고 homebrew.mxcl.jenkins.plist를 열어 "--httpListenAddress"값을 "0.0.0.0"으로 수정했다.

<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>homebrew.mxcl.jenkins</string>
    <key>ProgramArguments</key>
    <array>
      <string>/usr/libexec/java_home</string>
      <string>-v</string>
      <string>1.8</string>
      <string>--exec</string>
      <string>java</string>
      <string>-Dmail.smtp.starttls.enable=true</string>
      <string>-jar</string>
      <string>/usr/local/opt/jenkins/libexec/jenkins.war</string>
      <string>--httpListenAddress=0.0.0.0</string> 
      <string>--httpPort=8080</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
  </dict>
</plist>

 

"homebrew.mxcl.jenkins.plist"의 경로는 사용자마다 조금씩 다를 수 있는데, 나의 경우에는 "/Users/my-home/Library/LaunchAgents/homebrew.mxcl.jenkins.plist"에 있었다.

 

 


플러그인 설치

 

"Jenkins 관리 > Plugin Manager"로 가서 일단 Jenkins에서 디폴트로 추천하는 플러그인은 모두 설치했다.

그리고 Bitbucket, Docker, Pipeline, AWS를 사용할 것이기 때문에 다음과 같은 플러그인을 추가로 설치했다.

  • Bitbucket Plugin
  • Docker plugin
  • Docker Pipeline
  • Pipeline
  • Pipeline: AWS Steps

 

 


Credential 입력

Bitbucket, AWS와 같은 외부서비스와 연동하기 위해서는 Jenkins가 Bitbucket에 접속할 수 있도록 Credential을 입력해야한다. 일종의 아이디/패스워드 같은 것을 입력하는 것이다. (Jenkins 파이프라인 스크립트에 그런 Credential을 직접 작성해서 넣을 수도 있겠지만, 그렇게 되면 아이디/패스워드를 노출하는 셈이기 때문에 보통은 Jenkins가 제공하는 Credential 기능을 이용한다)

 

먼저 Jenkins 좌측 메뉴 중 "Jenkins 관리"로 들어간다.

 

그 후  "Security > Manage Credentials"로 들어간다.

그런 다음, Credential들의 그룹이라고 할 수 있는 Domain을 하나 생성한다.

 

만약에 "temp domain"이라는 Domain을 하나 생성했다면 다음과 같이 나올 것이다.

해당 도메인에서 내가 사용할 Credential을 저장하면 된다. 아래 이미지의 "Add Credentials"를 클릭하자.

 

그럼 다음과 같은 화면이 나온다.

Username은 "Manage Credentials"에서 내가 해당 Credential을 식별할 수 있는 이름으로 작성하면되고,

ID는 실제로 Jenkins 파이프라인에서 Credential을 참조하기 위한 값이다. 즉, 저 ID를 통해서 Credential을 이용할 수 있다.

 

일단 나는 Username과 ID모두 "bitbucket_credential"이라고 입력한다.

 

그 다음 패스워드를 입력해야 한다.

 

Bitbucket에 가면 개발자가 Bitbucket에 로그인 할 때 사용하는 아이디/비번 말고, 이렇게 3rd party에서 접속할 수 있도록 Credential을 제공한다. 그것을 가져와서 입력하면 된다.

 

우선 Bitbucket에 접속해서 로그인을 하면, 우측 상단에 아래와 같이 자신의 프로파일에 대한 메뉴를 확인할 수 있다. 거기서 "Personal settings"를 클릭한다.

 

그 다음, 좌측 메뉴 중 "App passwords"를 클릭하고, "Create app password"를 클릭해서, 필요한 권한을 체크한 후에 생성한다.

 

다시 Jenkins로 돌아와서, 방금 생성한 Bitbucket app password를 "Password" 칸에 입력한다.

이렇게 하면 Jenkins에서 사용할 수 있는 Bitbucket Credential이 만들어진 것이다.

 

비슷한 방법으로 AWS Credential도 생성하면 된다. 우선 AWS Credential의 경우 특정 IAM User에 대한 Profile을 만들어서 ACCESS ID와 ACCESS KEY를 받아야한다. 이때 해당 IAM User는 내가 Jenkins를 통해서 하고자하는 권한(ex. Lambda 배포 권한)을 가지고 있는 상태여야 한다.

 

그리고 각각을 Bitbucket의 Credential을 생성할 때와 마찬가지로 진행하면, 다음과 같이 만들어질 것이다.

 

이렇게 하면 Credential은 모두 준비가 된 것이다.

 

 


배포 파이프라인 

이제 배포 파이프라인을 생성해보자.

Jenkins 첫 화면으로 돌아가서 "새로운 Item"을 클릭한다.

 

 

그리고, 해당 item에 대한 이름을 입력하고, "Pipeline"을 클릭한다.

 

그러고 나면 다음 화면에서 해당 Item에 대한 이런 저런 설정할 수 있는 것들이 나오고, 아래로 좀 더 내려가면 "Pipeline" 항목이 나온다. Pipeline 항목의 definition을 클릭하면, Pipeline script와 Pipeline script from SCM이 나오는데, Pipeline script는 스크립트를 아래의 칸에 직접 입력하는 것을 의미하고, Pipeline script from SCM는 저장소에 저장되어 있는 스크립트를 가져와서 적용한다는 의미이다.

 

취향 차이일수도 있겠지만, 나는 배포 파이프라인 코드도 배포하고자 하는 코드와 함께 관리하는 것을 선호한다.

이력 관리가 함께 되어야 한다고 생각하기 때문이다.

 

그래서 Pipeline script from SCM을 선택한 후, SCM은 Git을 선택한다.

그러면 다음과 같은 입력 칸들이 나타난다.

 

 

Repository URL은 파이프라인 스크립트가 저장되어 있는 저장소 주소를 입력하고, Credential에서는 아까 생성한 Bitbucket Credential을 선택하면 된다. 그 외에 해당 git의 어떤 Branch에서 내용을 가져올 것인지 입력하고, 파이프라인에 적용하고자하는 jenkinsfile의 이름 및 경로(나는 ci.jenkinsfile이라는 이름의 파일을 이용했다)를 입력하고 저장한다.

 

이렇게 하면 파이프라인이 생성된 것이다.

 

 


Jenkinsfile

jenkinsfile은 다음과 같이 심플하게 구성했다. 먼저 빌드 및 배포가 이루어지는 환경은 docker를 이용해서 Serverless framework가 잘 동작할 수 있는 컨테이너인 "amaysim/serverless:2.43.0"을 사용했다.

 

환경 변수로 아까 생성했던 AWS Credential(Access ID, Access Key)를 입력한다.

그 후 Serverless 명령어를 이용해서 배포를 실행한 후, 배포 결과를 콘솔에 찍는다.

 

이렇게 하면 배포가 완료된다.

 

여기서 원하는 응용하면 된다. 배포 단계 별로 Slack 메세지를 발송시키고 싶다면 그것을 추가하면 되고, 테스트도 추가하고 싶으면 스크립트를 작성해서 이곳에 추가하면 된다.

pipeline {
    agent {
        docker {
            image 'amaysim/serverless:2.43.0'
        }
    }
    environment {
        HOME = '.'
        SLS_DEBUG = '*'
        AWS_ACCESS_KEY_ID = credentials('aws_access_id')
        AWS_SECRET_ACCESS_KEY = credentials('aws_access_key')
        AWS_DEFAULT_REGION = 'ap-northeast-2'
    }
    stages {
        stage('Build') {
            steps {
                sh("yarn")
            }
        }
        stage('Deploy') {
            steps {
                sh("""
                    sls config credentials --provider aws --key ${env.AWS_ACCESS_KEY_ID} --secret ${env.AWS_SECRET_ACCESS_KEY}
                    sls deploy
                """)
            }
        }
    }
    post {
        success {
            echo 'Deploy Success'
        }
        failure {
            echo 'Deploy Failed'
        }
    }
    }
}

 

 

 


"Docker: command not found" 문제

https://stackoverflow.com/questions/50916740/docker-command-not-found-in-local-jenkins-multi-branch-pipeline

 

Docker command not found in local Jenkins multi branch pipeline

I have BookStore Spring Boot project that needs to be deployed through Jenkins. Docker installed in my local machine (macOS) and Jenkinsfile created as follows pipeline { agent { ...

stackoverflow.com

 

만약에 내가 Jenkins를 Mac에 설치해서 사용하고 있고, 파이프라인에서 Docker를 이용했는데, "Docker command not found" 에러가 난다면, Jenkins에서 호스트 머신인 Mac의 Docker 명령어를 못찾고 있는 것이기 때문에 경로를 추가해주면 된다.

 

"homebrew.mxcl.jenkins.plist"파일을 찾아서 아래의 내용을 추가해주면 된다.

<key>EnvironmentVariables</key>
  <dict>
    <key>PATH</key>
<string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/Docker.app/Contents/Resources/bin/:/Users/admin/Library/Group\ Containers/group.com.docker</string>
  </dict>

 

나의 경우에는 해당 파일이 "/Users/my-home/Library/LaunchAgents/homebrew.mxcl.jenkins.plist"에 있었는데, 사용자마다 조금씩 다를 수 있으니 자신의 환경에 맞는 경로로 찾아 들어가자.

 

 

반응형

댓글