이번에는 1편에 이어 깃허브 액션의 구성에 대해서 써보도록 하겠다.
2편에서는 1편의 gradle build가 끝났다는 전제로 깃허브 액션의 파이프라인을 만드는 법에 대해서 써보려고 한다.
Gradle 빌드도 그랬지만 깃허브액션도 Spring Framework에 관한 정보가 전혀 없었다.
boot에서는 jar파일로 처음부터 gradle빌드가 되어서 생성되기 때문에 도커로 배포한다고 해도 도커에 빌드하여 바로
배포가 가능하다.
하지만 이것은 불가능하기 때문에 생각한 것이 나 같은 경우 개인서버의 도커에 DockerFile로 미리 우분투 20.04 설치, jdk8을 설치, 환경변수로 지정하여 빌드를 한 다음 그렇게 만든 이미지를 미리 만들어 놓은 다음 우분투 컨테이너에 톰캣을 설치하여 scp로 파일전송을 하는 방식으로 하였다.
# Ubuntu 20.04 기반 이미지 사용
FROM ubuntu:20.04
# 환경 변수로 JDK 8 설치 경로를 지정합니다.
ENV JDK_HOME /usr/lib/jvm/java-8-openjdk-amd64
# JDK 8 설치 및 UTF-8 설정
RUN apt-get update && \
apt-get install -y openjdk-8-jdk && \
apt-get clean && \
apt-get install -y locales && \
locale-gen ko_KR.UTF-8
# 환경 변수로 JAVA_HOME을 설정하고 PATH에 추가합니다.
ENV JAVA_HOME $JDK_HOME
ENV PATH $JAVA_HOME/bin:$PATH
# 환경 변수로 로케일(LC_ALL)을 설정하여 한국어와 UTF-8을 사용합니다.
ENV LC_ALL ko_KR.UTF-8
ENV LANG ko_KR.UTF-8
- DockerFile 스크립트 참고-
이제 1편에서 완성된 프로젝트 파일을 업로드해야한다
원래라면 git bash로 git add도 가능하지만 이번에 사용해 보니 코드누락이 많아서 이클릭스로 커밋하는 것이
가장 안전하다는 걸 느꼈다.
이클립스에서 Git Staging을 누르고 변경된 모든 파일을 추가하여 커밋을 해준다.
그리고
git push origin main/master
이렇게 push를 해서 파일을 깃허브 레포지토리에 올려준다.
깔끔하게 올라갔다면
레포지토리의. github/workflows/gradle.yml 파일을 들어간다.
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle
name: Java CI with Gradle
on:
push:
branches: [ "main" ]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 8
uses: actions/setup-java@v3
with:
java-version: '8'
distribution: 'temurin'
# 파일권한
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build with Gradle
run: ./gradlew build
# 스프링 프로젝트를 컴파일후 war파일로 build해서 아키텍트에 업로드
- run: mvn --batch-mode --update-snapshots verify
- run: mkdir webapps && cp target/GoCamping-1.0.0-BUILD-SNAPSHOT.war webapps/ROOT.war
- uses: actions/upload-artifact@v3
with:
name: Package
path: webapps
- name: Deploy ROOT.war to Server
uses: appleboy/scp-action@master
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USERNAME }}
password: ${{ secrets.SERVER_PASSWORD }}
port: ${{ secrets.SERVER_PORT }}
source: webapps/ROOT.war
target: /volume1/docker/LastProject/Hosting
코드구성은 이렇게 된다. !!!!!!!!!!! 아래에 수정된 스크립트로 사용 !!!!!!!!!!!!!!!!!!
여기서 차례대로 설명하자면 runs-on은 깃허브 액션은 runner이라는 깃허브에서 제공하는 빌드 가상머신으로 작동되는데
그 OS를 ubuntu로 하겠다는 것이다(변경불가)
JDK버전은 본인의 자바버전으로 지정하고
gradlew를 실행하기 위해서는 Grant execute permission for gradlew에서 build폴더의 실행권한만 부여한다.
이제 mvn --batch-mode --update-snapshots verify 여기서부터 큰 문제가 있었다.
깃허브 액션을 처음 공부할 때 빌드를 하는 방법을 몰라서 아무리 찾아봤지만 maven으로 빌드를 하는 방법을 몰라서
계속 찾다가 결국 국비학원 강사님의 힌트로 maven 빌드에 해답이 있다는 걸 알게 되어 이렇게 만들 수 있었다.
mvn --batch-mode --update-snapshots verify 여기에서는 maven빌드를 하는데 빌드를 하고 그 파일을 webapps라는 폴더를 만들어서 WAR파일로 넣는다.(이유는 나중에 설명)
문제는 여기서 이렇게만 한다고 바로 파일이 들어가는 것이 아니라
actions/upload-artifact@v3 여기처럼 아티팩트라는 것을 지정해서 넣어줘야 한다는 점이 있다.
Deploy ROOT.war to Server 이제 아티팩트로 전송을 해줘야 한다.
서버주소, 서버로그인 정보를 입력하여
source는 아티팩트의 webapps/ROOT.war로 지정을 해줘야
서버의 target주소로 보내진다.
여기서 ${} 이것은 서버주소를 공개해 놓을 수 없으니 따로 암호화를 시켜놓는 것이다.
Setting > Secrets and Variables > Actions 여기서 비밀키를 만들어서 위와 같이 사용할 수 있다.
이제부터 중요한 점이 있는데 scp로 webapps/ROOT.war파일을 전송하면 webapps폴더까지 같이 보내진다.
그렇기에 webapps폴더가 보내질 때마다 덮어씌워지게 webapps폴더의 하위폴더로 target을 지정한다.
이렇게 잘 보내졌다면 서버에 배포가 될 것이다.
이렇게 덮어서 배포를 할 때는 이미지폴더는 프로젝트폴더의 외부로 지정해 둬야 사진이 유지될 것이다.
이번에는 깃허브액션의 간단한 동작원리와 스프링 프레임워크의 배포방법에 대해서 써보았다.
나 자신이 이것을 찾을 때는 정보가 없어서 하나하나 찾아가면서 만들었지만 부디 다른 국비교육생이 이 글을 본다면
나와 같은 고생은 하지 않길 바라는 마음에서 정리해 보았다.
최종프로젝트가 끝나고 현재 정보처리기사 실기를 준비하고 있다. 학원이 끝나니 3주밖에 남지 않아 합격이 가능할지는 모르겠지만 일단 최선을 다해보고 끝나는 동시에 개인프로젝트를 스프링 부트로 준비해 보려고 한다.
요즘 취업시장이 난리라 힘들긴 하겠지만 12월까지는 취업에 성공하여 당당하게 개발공부를 하는 날이 오길 바라며
다음글로는 최종에서 자료조사를 할 때 스프링 프레임워크 4 버전에서 Spring Security에 관한 정보가
손에 꼽을 정도로 적었기 때문에 다음에는 스프링 프레임워크 4에 맞는 Spring Security 코드와 구조에 대해서 적어보도록 하겠다.
그럼 이걸로 글을 마치겠다.
------------------------------------------------------------------------- 2023-11-01 추가 ----------------------------------------------------------------
설명을 보면 gradle 빌드를 수정으로 해야한다고 적어놨는데 이건 나의 무지였다.
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle
name: Java CI with Gradle
on:
push:
branches: [ "main" ]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 8
uses: actions/setup-java@v3
with:
java-version: '8'
distribution: 'temurin'
# 파일권한
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build with Gradle
run: ./gradlew build
# 스프링 프로젝트를 컴파일후 war파일로 build해서 아키텍트에 업로드
- run: mvn --batch-mode --update-snapshots verify
- run: mkdir webapps && cp target/GoCamping-1.0.0-BUILD-SNAPSHOT.war webapps/ROOT.war
- uses: actions/upload-artifact@v3
with:
name: Package
path: webapps
- name: Deploy ROOT.war to Server
uses: appleboy/scp-action@master
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USERNAME }}
password: ${{ secrets.SERVER_PASSWORD }}
port: ${{ secrets.SERVER_PORT }}
source: webapps/ROOT.war
target: /volume1/docker/LastProject/Hosting
- 수정전 -
여기를 보면 gradle빌드를 하고 maven빌드를 또 하고있다.
이건 정말 뭘 위한 스크립트인지 모르겠다.....
그리고 몰랐던 사실이지만 maven빌드를 여러번에 겹쳐서 하게되면 캐시가 생겨 깃허브 레포에 변화를 인식하지 못하는
상황까지 왔었다.
그렇기에 우선 gradle빌드를 없애버리고 maven빌드를 하기전에 maven빌드경로를 삭제해주는걸로 수정하였다.
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle
name: Java CI with Gradle
on:
push:
branches: [ "main" ]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 8
uses: actions/setup-java@v3
with:
java-version: '8'
distribution: 'temurin'
# Maven캐시정리
- name: Clean Maven target directory
run: mvn clean
# 스프링 프로젝트를 컴파일후 war파일로 build
- run: mvn --batch-mode --update-snapshots verify
- run: mkdir webapps && cp target/GoCamping-1.0.0-BUILD-SNAPSHOT.war webapps/ROOT.war
# 바로 서버로 ROOT.war 파일 전송
- name: Deploy ROOT.war to Server
uses: appleboy/scp-action@master
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USERNAME }}
password: ${{ secrets.SERVER_PASSWORD }}
port: ${{ secrets.SERVER_PORT }}
source: webapps/ROOT.war
target: /volume1/docker/LastProject/Hosting
- 수정후 -
이렇게 하면 변경코드를 인식하지 못하는 문제를 해결할수 있다.
캐시가 어떠한 부분에서는 필요없는 액션을 패스할수 있어서 좋지만 이럴때는 신경을 써줘야할것 같다.
'개인 서버(도커등)' 카테고리의 다른 글
우분투20.04 개인키 인증 (putty 인증) (0) | 2023.11.23 |
---|---|
우분투 전체용량, 잔여용량, 사용가능용량 출력 (0) | 2023.10.24 |
국비교육생 추천!! 스프링 프레임워크 + 깃허브액션 CI/CD 파이프라인 배포 (1) (공부일지, gradle빌드) (2) | 2023.10.03 |
톰캣서버 오라클db jdbc로 연동 (JSP) (0) | 2023.05.23 |
시놀로지 도커 Tomcat8.5 서버구축 (0) | 2023.05.07 |