Notice
Recent Posts
Recent Comments
Link
반응형
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- swapmemory
- EC2
- 스왑메모리
- gitActions
- TaskExecutor
- mysql
- github
- JPA
- GCS
- 파일업로드
- 백준
- 백업스크립트
- mono
- Infra
- webflux
- GoogleCloudStorage
- SUbmodule
- Java
- 프로그래머스
- Algorithm
- CompletableFuture
- 비동기
- AWS
- actions
- 알고리즘
- @async
- R2DBC
- programmers
- ci/cd
- 백업
Archives
- Today
- Total
쿵야지식떨이
GitHub Actions 적용 (2) - GitHub Actions CI/CD 스크립트 본문
반응형
GitHub Actions 가 정상적으로 작동하게 스크립트를 작성해야 한다.
CI/CD 스크립트 작성 과정
1. 프로젝트에 yml 파일 생성
- 프로젝트 root 경로에 ./github/workflows 디렉토리를 만들고 cicd.yml 파일을 생성한다.
- 파일 이름은 cicd.yml은 예시일 뿐 이름은 상관없다!
2. yml 파일 안에 스크립트 작성
#github repo Actions 이름
name: CI/CD
on:
push:
branches: ["develop"]
pull_request:
branches: ["develop"]
permissions: write-all
jobs:
build-and-deploy:
# ubuntu 최신버전에서 실행
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
token: ${{ secrets.CHECKOUT_TOKEN }}
submodules: true
# 자바 버전설정
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
cache: 'gradle'
- name: Add permission for gradlew
run: chmod +x gradlew
- name: Build with Gradle
uses: gradle/gradle-build-action@v2
with:
arguments: build -x test
- name: Docker build & push to docker repo
run: |
docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
docker build -f Dockerfile -t ${{ secrets.DOCKER_REPO }}/directors-dev .
docker push ${{ secrets.DOCKER_REPO }}/directors-dev
- name: Deploy to server
uses: appleboy/ssh-action@master
id: deploy
with:
host: ${{ secrets.EC2_HOST }}
username: ubuntu
key: ${{ secrets.EC2_PEMKEY }}
envs: GITHUB_SHA
script: |
sudo docker stop spring-server-container
sudo docker rm spring-server-container
sudo docker pull ${{ secrets.DOCKER_REPO }}/directors-dev
sudo docker run --name spring-server-container -d -p 8081:8081 gummymurderer/directors-dev
sudo docker image prune -f
1. name
name: CI/CD
- github repository의 actions 탭에 노출되는 workflow의 이름
2. on
on:
push:
branches: ["develop"]
pull_request:
branches: ["develop"]
- workflow 파일을 자동으로 트리거하는 이벤트를 명시한다.
- push 이벤트를 명시하면 main 브랜치에 push가 일어나면 해당 event가 실행된다.
- 특정한 브랜치나 tag, path에서만 실행되도록 할 수도 있다.
- branches : 에 특정 브랜치를 입력하면 된다.
- path로 특정 패턴을 설정하여 해당 패턴에 일치하는 파일이 변경되었을 때 workflow가 실행되도록 설정할 수도 있다.
- !paths나 paths-ignore를 사용하여 무시할 패턴을 설정할 수도 있다.
3. jobs
jobs:
build-and-deploy:
# ubuntu 최신버전에서 실행
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
token: ${{ secrets.CHECKOUT_TOKEN }}
submodules: true
# 자바 버전설정
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
cache: 'gradle'
- name: Add permission for gradlew
run: chmod +x gradlew
- name: Build with Gradle
uses: gradle/gradle-build-action@v2
with:
arguments: build -x test
- name: Docker build & push to docker repo
run: |
docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
docker build -f Dockerfile -t ${{ secrets.DOCKER_REPO }}/directors-dev .
docker push ${{ secrets.DOCKER_REPO }}/directors-dev
- name: Deploy to server
uses: appleboy/ssh-action@master
id: deploy
with:
host: ${{ secrets.EC2_HOST }}
username: ubuntu
key: ${{ secrets.EC2_PEMKEY }}
envs: GITHUB_SHA
script: |
sudo docker stop spring-server-container
sudo docker rm spring-server-container
sudo docker pull ${{ secrets.DOCKER_REPO }}/directors-dev
sudo docker run --name spring-server-container -d -p 8081:8081 gummymurderer/directors-dev
sudo docker image prune -f
- workflow는 다양한 job으로 구성되며 job은 steps로 구성된다.
- job에서는 수행할 작업을 작성하면 된다.
- job에 들어갈 수 있는 정보
- runs-on : 해당 job을 어떤 OS에서 실행할 것인지 명시
- steps : job이 가질 수 있는 동작의 나열. 각각의 step은 독립적인 프로세스를 가진다.
- uses : 해당 step에서 사용할 액션. GitHub 마켓 플레이스에 올라온 action들을 사용할 수도 있다.
- name : step의 이름
- run : job에 할당된 컴퓨팅 자원의 shell을 이용하여 커맨드 라인을 실행한다. node.js 프로젝트의 경우, 이 과정에서 npm package의 scripts를 구동할 수 있다.
- env : 해당 job에서 사용할 환경 변수를 key-value 형태로 설정한다.
- strategy : 여러 환경에서의 테스트/배포를 위해 빌드 matrix를 구성한다.
- with : 해당 action에 의해 정의되는 input 파라미터. key-value 페어로 되어 있다. input 파라미터는 환경 변수로 설정되고 'INPUT_' 이라는 prefix가 붙는다.
- token : repo를 가져오는 데 사용될 액세스 토큰
- submodules : true : 하위 모듈을 체크하겠다는 의미
4. Github Actions에서 사용될 JDK 세팅
# 자바 버전설정
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
cache: 'gradle'
- name: Add permission for gradlew
run: chmod +x gradlew
- 위 코드에서는 JDK 17을 사용 중
- distribution으로 temurin을 사용
- distribution: 'temurin'는 자바 배포판을 지정하는 부분이다.
- temurin은 AdoptOpenJDK 프로젝트가 Eclipse Foundation에 합류하여 변경된 이름이다.
- 이 프로젝트는 커뮤니티 기반으로 운영되는 OpenJDK 빌드를 제공한다.
- OpenJDK는 자바 플랫폼의 오픈소스 구현체를 말하며, Adoptium(Temurin)은 이 OpenJDK를 빌드하여 제공하는 프로젝트 중 하나이다.
- JDK 배포판을 temurin로 지정
- cache : 'gradle' : Gradle 빌드 캐시를 사용하도록 설정
5. Docker build 및 push
- name: Docker build & push to docker repo
run: |
docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
docker build -f Dockerfile -t ${{ secrets.DOCKER_REPO }}/directors-dev .
docker push ${{ secrets.DOCKER_REPO }}/directors-dev
주의 사항❗❗
1. GitHub Actions 작업이 잘 되지 않을 때
- gradle build 시 springBoot 2.5 버전 이후로는 jar 파일이 2개가 생겨 Github Actions 작업이 제대로 작동하지 않는다.
- 따라서 build.gradle에 아래와 같이 추가해야 한다.
jar {
enabled = false
}
2. 환경 변수 처리
- 스크립트를 보면 jobs 중간중간에 '$' 처리되어 있는 환경 변수들이 있다.
- 해당 변수들의 실제 값은 GitHub Main 프로젝트의 settings → Secrets and variables → Actions → New repository secret 에 넣어두면 된다.
💡 한 번 작성해서 넣고 수정하기 위해 누르면 이전에 작성했던 값들이 전혀 보이지 않게 된다. 즉, 기존에 작성했던 부분 중 특정 부분만 드래그 해서 변경하거나 기존 내용을 복사 할 수 없으니 처음부터 다시 입력하거나 아예 삭제하고 다시 만들어야 한다 |
- CHECKOUT_TOKEN : 액세스 토큰
- DOCKER_USER : Docker Hub ID
- DOCKER_PASSWORD : Docker Hub Password
- EC2_HOST : 퍼블릭 IPv4 DNS 주소
- EC2_KEY : EC2 pem 파일에 있는 내용 전부
- Access Token 확인 방법
- GitHub 페이지 우측 상단 프로필 사진 → Settings → Developer Settings → Personal access tokens → Tokens
- 신규 발급이라면?
- Generate new token → Generat new token(classic)
- Note에는 토큰 이름, 설명을 적어주면 된다.
- Expiration은 만료 기간인데 보안을 위해서는 지정하는 게 좋지만 expiration(만료되지 않음)으로 해도 괜찮다.(custom으로 지정하는 것도 가능)
- Select scopes는 해당 토큰으로 접근할 수 있는 것을 체크해 주면 된다.
- 완료 후에는 Generate token을 누르면 된다.
- github Actions를 진행하기 위해서는 Select scopes에서 workflow는 무조건 체크해줘야 한다!
(repo는 체크되어 있다는 전제. 만약 repo가 체크 안 되어 있다면 이것도 체크 필수!!)
💡 생성된 토큰은 페이지를 벗어나는 순간 다시는 확인 할 수 없기 때문에 무조건 바로 복사해서 저장해두어야 한다. 생각보다 토큰을 쓰는 곳이 많기 때문에 잊어버렸다면 슬프지만 다시 만들어야 한다.. |
반응형
'Infra' 카테고리의 다른 글
[Infra] GCS 적용 (3) - GCS 프로젝트에 적용 (0) | 2024.04.22 |
---|---|
[Infra] GCS 적용 (2) - GCS 기본 생성 (0) | 2024.04.09 |
[Infra] GCS 적용 (1) - GCS(Google Cloud Storage)란? (0) | 2024.04.06 |
GitHub Actions 적용 (3) - Git submodule (0) | 2024.02.22 |
GitHub Actions 적용 (1) - GitHub Actions란? (0) | 2024.02.03 |