본문 바로가기
기술/토스 Slash

토스ㅣSLASH 23 - 유연하고 안전하게 배포 Pipeline 운영하기 - 7 (간단한 프로젝트 빌드 & 배포)

by MiewONE 2023. 7. 20.

이제 GoCD의 서버와 에이전트들이 구성이 되었고 pipeline도 간단히 구상을 했으니 CI/CD를 진행해보겠습니다.

CI/CD를 진행하기 위해서는 빌드할 프로젝트가 필요한데 저는 gocd에서 파이프라인을 생성할때 material에 pipeline 공부용 Git Repogistory를 등록하였습니다.

https://github.com/miewone/myfirstgocd

 

GitHub - miewone/myfirstgocd

Contribute to miewone/myfirstgocd development by creating an account on GitHub.

github.com

해당 프로젝트는

프로그래밍 언어 Java 17
빌드 도구 Maven
프레임워크 Spring Boot 3.1.1

도구에서는 Spring Web을 사용하여 루트로 들어오는 Rest Controller를 구성했습니다. 해당 이미지를 띄워서 접근하면 페이지에 test 라는 글자만 나옵니다.

자, 이제 GoCD로 빌드를 시작하기 위해서는 전글에 포스팅 yaml 내용에서 task들을 재구성 해줘야합니다.

- Build:
    fetch_materials: true
    keep_artifacts: false
    clean_workspace: false
    approval:
      type: success
      allow_only_on_success: false
    environment_variables:
      BUILD_VERSION: 0.0.1
    jobs:
      BuildProject:
        timeout: 0
        tasks:
        - exec:
            arguments:
            - versions:set
            - -DnewVersion=${BUILD_VERSION}
            command: mvn
            run_if: passed
        - exec:
            arguments:
            - clean
            - install
            command: mvn
            run_if: passed
        - exec:
            arguments:
            - -jar
            - target/pipeline-${BUILD_VERSION}-SNAPSHOT.jar
            command: java
            run_if: passed

현재 파이프 라인의 구성은 Build라는 Stage 아래에 BuildProject라는 Job이 존재하고 Job아래에 task 3개가 존재합니다.

참 위 파이프라인을 시작하기 전에 빌드가 되는 서버에 빌드를 위한 도구와 배포할 환경이 세팅 되어야 합니다

저는 빌드를 위한 mvn, 배포를 위한 java가 이미 설치 되어있어서 바로 시작을 하도록 하겠습니다

 

오류 1

.

이런, 메이븐으로 빌드하던 중 에러가 났습니다. 에러 내용을 보아하니 /var/go/.m2/repository 디렉토리가 없어서 에러가 난것 같습니다. 확인 해보니 해당 디렉토리가 존재하지 않아 새로 생성해줬으며 해당 디렉토리에 go가 접근가능 하도록 했습니다.

sudo mkdir -p /var/go/.m2/repository
sudo chown -R go:go /var/go/.m2/repository

다시 한번 build를 실행해보겠습니다.

 

오류 2

해당 오류는 maven은 최신버전이 설치 되었지만 centos에서 최신 버전 maven 설치 방식이 wget으로 tar를 받아서 tar 압축해제 후 maven 디렉토리를 환경변수로 등록해야했습니다. 이렇게 등록을 진행해도 여전히 같은 에러가 나왔는데 go-agent에도 환경변수를 따로 입력해줘야 했습니다.

 

[Unit]
Description=go-agent
After=syslog.target

[Service]
Type=forking
ExecStart=/usr/share/go-agent/bin/go-agent start sysd
ExecStop=/usr/share/go-agent/bin/go-agent stop sysd
User=go
KillMode=control-group
Environment=SYSTEMD_KILLMODE_WARNING=true
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/maven/bin" <-- 추가


[Install]
WantedBy=multi-user.target

그 후 데몬을 `systemctl daemon-reload` 을 하고 go-agent 서비스를 재시작해야했습니다.

 

오류 3

Job, Task 에 환경변수 등록(아래사진)을 진행했는데 템플릿에서 해당 변수를 가져오지 못하는것으로 에러가 발생했습니다.

 

        - exec:
            arguments:
            - versions:set
            - -DnewVersion=${BUILD_VERSION}
            command: mvn
            run_if: passed

               ...

 

 

 

알고보니 이 변수는 에이전트 환경변수로 입력이 되어 템플릿에서는 사용하지 못하는 것이였습니다. server에서 지정한 환경 변수를 사용하기 위해서는 task 의 명령을 아래와 같이 바꿨습니다.

 

tasks:
    - exec:
        arguments:
        - -c
        - mvn versions:set -DnewVersion=${BUILD_VERSION}
        command: bash
        run_if: passed
    - exec:
        arguments:
        - clean
        - install
        command: mvn
        run_if: passed
    - exec:
        arguments:
        - -c
        - java -jar target/pipeline-${BUILD_VERSION}.jar
        command: bash
        run_if: passed

 

성공

여러번의 시도 오류와 시도 끝에 심플한 빌드와 배포가 성공했습니다. 다음 포스팅에는 심플 파이프 라인말고 좀 더 빌드, 테스트, 배포가 이뤄진 파이프 라인을 구성해보겠습니다.