GitHub Actions
์ฝ๋๋ฅผ ํธ์คํ
ํ๊ณ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ํ ๋ ์ฌ์ฉํ ์ ์๋ ์๋ํ ๋ฐ CI/CD(Continuous Integration/Continuous Deployment) ๋๊ตฌ
Workflow (์ํฌํ๋ก์ฐ)
GitHub Actions์์ ์ํ๋๋ ์๋ํ ํ๋ก์ธ์ค๋ฅผ ์ ์ํ๋ ์์์
๋๋ค.
โข
.github/workflows ๋๋ ํ ๋ฆฌ์ YAML ํ์์ ์ํฌํ๋ก์ฐ ํ์ผ์ ์์ฑํ์ฌ ์ ์ํฉ๋๋ค.
โข
์ํฌํ๋ก์ฐ๋ ์ด๋ฒคํธ(์: ํธ์, ํ ๋ฆฌํ์คํธ ๋ฑ)๊ฐ ๋ฐ์ํ ๋ ์์๋๋ฉฐ, ์ผ๋ จ์ ์์
๋จ๊ณ๋ฅผ ์ ์ํ์ฌ ์คํ๋ฉ๋๋ค.
Workflow ์ ๊ตฌ์ฑ์์
GitHub Actions๋ ์๋์ ์์๋ค์ ์กฐํฉํ์ฌ ์ฝ๋ ๋น๋, ํ
์คํธ, ๋ฆด๋ฆฌ์ค, ๋ฐฐํฌ ๋ฑ์ ์์
์ ์๋์ผ๋ก ์ํํ ์ ์์ต๋๋ค.
Workflow
โข
Job (์ก)
โฆ
Step (์คํ
)
โช
Actions (์ก์
)
Job (์ก)
workflow(์ํฌํ๋ก์ฐ) ๋ด์์ ์คํ๋๋ ๋
๋ฆฝ์ ์ธ ์์
๋จ์
โข
๊ฐ Job(์ก)์ ๋ณ๋์ ์คํ ์ปจํ
์คํธ๋ฅผ ๊ฐ์ง๋ฉฐ, ๋ณ๋ ฌ ๋๋ ์์ฐจ์ ์ผ๋ก ์คํ๋ ์ ์์ต๋๋ค.
โข
๊ฐ Job(์ก)์ ์ฌ๋ฌ ์คํ
์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ, ํ๋์ ์ก์ด ์คํจํ๋ฉด ๋ค์ ์ก์ด ์คํ๋์ง ์์ต๋๋ค.
Step (์คํ )
Job(์ก) ๋ด์์ ์ํ๋๋ ๊ฐ๋ณ์ ์ธ ์์
๋จ๊ณ
โข
๊ฐ ์คํ
์ ๋
๋ฆฝ์ ์ผ๋ก ์คํ๋๋ฉฐ, ์์ ์คํ
์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋์ด์ผ ๋ค์ ์คํ
์ด ์คํ๋ฉ๋๋ค.
โข
์ํ๋ ์์
์ ์ธ๋ถํํ์ฌ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
Actions (์ก์ )
Step(์คํ
) ๋ด์์ ์คํด์ค๋๋ ์ฌ์ฌ์ฉ๊ฐ๋ฅํ ๋น๋ ๋ธ๋ก
์ก์
์ ์ํฌํ๋ก์ฐ์์ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
โข
GitHub Marketplace ๋ฐ ์ปค๋ฎค๋ํฐ์์ ๋ค์ํ ์ก์
์ ์ฐพ๊ณ ์ฌ์ฉํ ์ ์์ต๋๋ค.
โข
์ํฌํ๋ก์ฐ ํ์ผ์์ ์ก์
์ ํธ์ถํ์ฌ ์ฝ๋ ๋น๋, ํ
์คํธ, ๋ฐฐํฌ ๋ฑ์ ์์
์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
WorkFlow ์ค์ ํ์ผ
./gitbub/workflows/main.yml
./gitbub/workflows/main.yml ์ workflow ์ ์ค์ ํ์ผ์
๋๋ค.
์ฌ๊ธฐ์, Job, Step, Actions ์ ์ ์ํฉ๋๋ค.
workflow ์ค์ ํ์ผ ์์
โข
main.yml
name: CI/CD Pipeline # ์ํฌํ๋ก์ฐ์ ์ด๋ฆ
on:
push: # ํธ์ ์ด๋ฒคํธ๋ฅผ ๊ฐ์ง
branches:
- main # main ๋ธ๋์น์ ํธ์ ์ด๋ฒคํธ ๋ฐ์ ์ ์ํฌํ๋ก์ฐ ์คํ
jobs:
build:
runs-on: ubuntu-latest # ๋ฌ๋ ํ๊ฒฝ์ ubuntu-latest ์ง์ ,
# runs-on: self-hosted # ์์ ์ ์๋ฒ์์ ์ง์ ํธ์คํ
ํ๋ ๊ฒฝ์ฐ
steps:
- name: Checkout Repository
uses: actions/checkout@v2 # GitHub์์ ์ ๊ณตํ๋ Checkout ์ก์
์ ์ฌ์ฉํ์ฌ ๋ฆฌํฌ์งํ ๋ฆฌ ์ฒดํฌ์์
- name: Setup Java
uses: actions/setup-java@v2 # Java ํ๊ฒฝ ์ค์ ์ก์
์ฌ์ฉ
with:
distribution: 'adopt' # AdoptOpenJDK๋ฅผ ์ฌ์ฉ
java-version: '11' # Java 11 ๋ฒ์ ์ฌ์ฉ
- name: Build with Gradle
run: ./gradlew clean build # Gradle ๋น๋ ๋ช
๋ น ์คํ
- name: Archive Artifacts
uses: actions/upload-artifact@v2 # GitHub์์ ์ ๊ณตํ๋ ์ํฐํฉํธ ์
๋ก๋ ์ก์
์ฌ์ฉ
with:
name: app-artifacts # ์
๋ก๋ํ ์ํฐํฉํธ์ ์ด๋ฆ
path: build/libs # ์
๋ก๋ํ ๋๋ ํ ๋ฆฌ ์ง์
deploy:
needs: build # deploy ์ก์ build ์ก์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋์ด์ผ ํจ
runs-on: ubuntu-latest # ๋ฐฐํฌ ์ก์ด ์คํ๋ ๋ฌ๋ ํ๊ฒฝ์ ubuntu-latest๋ก ์ง์
steps:
- name: Checkout Repository
uses: actions/checkout@v2 # GitHub์์ ์ ๊ณตํ๋ Checkout ์ก์
์ ์ฌ์ฉํ์ฌ ๋ฆฌํฌ์งํ ๋ฆฌ ์ฒดํฌ์์
- name: Download Artifacts
uses: actions/download-artifact@v2 # GitHub์์ ์ ๊ณตํ๋ ์ํฐํฉํธ ๋ค์ด๋ก๋ ์ก์
์ฌ์ฉ
with:
name: app-artifacts # ๋ค์ด๋ก๋ํ ์ํฐํฉํธ์ ์ด๋ฆ
- name: Deploy to Server
run: |
# ์ฌ๊ธฐ์ ์๋ฒ ๋ฐฐํฌ ์คํฌ๋ฆฝํธ ๋๋ ๋ช
๋ น์ด ์์ฑ
# ๋ค์ด๋ก๋ํ ์ํฐํฉํธ(build/libs ๋๋ ํ ๋ฆฌ)๋ฅผ ํ์ฉํ ๋ฐฐํฌ ์์
์ํ
Bash
๋ณต์ฌ
Runner (๋ฌ๋)
Github Actions(Workflows) ์์
์ ์คํํ๋ ํ๊ฒฝ
์ข ๋ฅ
โข
Github Hosted Runner
โข
Self-Hosted Runner
Github Hosted Runner
Github ์ ํธ์คํ
๋์ด ์๋ Gtihub Actions ์คํํ๊ฒฝ์
๋๋ค.
Github Actions ์ ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๊ณ , main.yml ์ ๋ฏธ๋ฆฌ ์ ์ํ ํ๋ก์ธ์ค๋ฅผ ์คํํฉ๋๋ค.
์์ฑํ๊ธฐ
1.
Settings
2.
Actions
3.
Runners
a.
[New Runner]
Self-Hosted Runner
์ฌ์ฉ์๊ฐ ์ง์ ํธ์คํ
ํ๊ณ ๊ด๋ฆฌํ๋ Github Actions ์คํ ํ๊ฒฝ์
๋๋ค.
โข
์ฌ์ฉ์๋ ์์ฒด ํ๋์จ์ด ๋๋ ํด๋ผ์ฐ๋์์ ๋ฌ๋๋ฅผ ์ค์ ํ๊ณ GitHub์ ๋ฑ๋กํฉ๋๋ค.
โข
ํ์ฌ ๋ด๋ถ ๋คํธ์ํฌ์ ์๋ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์์ผ๋ฏ๋ก ๋ฏผ๊ฐํ ๋ฐ์ดํฐ ๋๋ ํ๊ฒฝ์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
โข
GitHub์ด ์ ๊ณตํ๋ ๋ค์ํ ์คํ ํ๊ฒฝ๋ฟ๋ง ์๋๋ผ ์ฌ์ฉ์ ์ ์ ํ๊ฒฝ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์์ฑํ๊ธฐ
1.
Settings
2.
Actions
3.
Runners
a.
[New Runner]
b.
[Create Self-hosted Runner]
i.
์ด์์ฒด์ ์ง์
ii.
์ํคํ
์ฒ ์ง์
iii.
Download, Configure ๋ช
๋ น์ด ์์๋๋ก ์คํ
(LINUX ๊ธฐ์ค)
Download
# Create a folder
$ mkdir actions-runner && cd actions-runner# Download the latest runner package
$ curl -o actions-runner-linux-x64-2.311.0.tar.gz -L https://github.com/actions/runner/releases/download/v2.311.0/actions-runner-linux-x64-2.311.0.tar.gz# Optional: Validate the hash
$ echo "??????????????????????????? actions-runner-linux-x64-2.311.0.tar.gz" | shasum -a 256 -c# Extract the installer
$ tar xzf ./actions-runner-linux-x64-2.311.0.tar.gz
Bash
๋ณต์ฌ
Configure
# Create the runner and start the configuration experience
$ ./config.sh --url https://github.com/ALOHA-CLASS --token ???????????????????????? Last step, run it!
Bash
๋ณต์ฌ
Run (์คํ)
./run.sh
๋ฑ๋ก ํ์ธ
1.
My Git Repository
2.
Settings
3.
Actions
4.
Runners
Artifact (์ํฐํฉํธ)
์ํฌํ๋ก์ฐ์์ ์์ฑ๋ ํ์ผ ๋๋ ๋น๋ ๊ฒฐ๊ณผ๋ฌผ์ ์ ์ฅํ๊ณ ๋ค๋ฅธ ์ก์์ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ์์
์ํฌํ๋ก์ฐ์ ์ฌ๋ฌ ๋จ๊ณ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์ค์ต
1.
.gitbub/workflows/main.yml ํ์ผ ์์ฑ
2.
์ํฌ ํ๋ก์ฐ ์ ์ํ๊ธฐ
3.
start.sh ๋ฐฐํฌ ์คํฌ๋ฆฝํธ ์์ฑ
4.
๋ฆฌ๋
์ค ์๋ฒ์ self-hosted runner ์ค์น ๋ฐ ์คํ
5.
์๋ฒ์ git clone ํ๊ธฐ
6.
๊ฐ๋ฐ PC ์ git clone ํ๊ธฐ
7.
๊ฐ๋ฐ PC ์์ ์์ ํ ์ฝ๋ git push ํ๊ธฐ
8.
์๋ฒ์์ ์๋ ๋น๋ ๋ฐ ๋ฐฐํฌ ํ์ธํ๊ธฐ
.gitbub/workflows/main.yml ํ์ผ ์์ฑ
1.
Repository
2.
Actions
3.
New workflow
4.
set up a workflow yourself
์ํฌ ํ๋ก์ฐ ์ ์ํ๊ธฐ
โข
main.yml ๋ง์ผ๋ก ๋์ํ๋ ๋ฒ์
โข
main.yml (build & deploy)
name: CI/CD Pipeline
on:
push:
branches:
- main
jobs:
build:
runs-on: self-hosted
steps:
- name: Checkout Repository
uses: actions/checkout@v2
- name: permission check
run: chmod -R 777 .
- name: Build with Gradle
run: ./gradlew clean build
deploy:
needs: build
runs-on: self-hosted
steps:
- name: Checkout Repository
uses: actions/checkout@v2
- name: Deploy to Server
run: |
echo "> ์๋ก์ด ์ ํ๋ฆฌ์ผ์ด์
๋ฐฐํฌ"
# cd $GITHUB_WORKSPACE/build/libs
cd /home/joeun/workspace/HelloSpringBoot/build/libs
# ์๋ฒ ์คํ
echo "> ์๋ฒ ์คํ"
nohup java -jar "hello-application.war" &
Bash
๋ณต์ฌ
main.yml (with start.sh)
name: CI/CD Pipeline
on:
push:
branches:
- main
jobs:
build:
runs-on: self-hosted
steps:
- name: Checkout Repository
uses: actions/checkout@v2
# - name: deploy to server
- name: deploy to server
run: |
sudo ./start.sh
sleep 5
Bash
๋ณต์ฌ
start.sh ๋ฐฐํฌ ์คํฌ๋ฆฝํธ ์์ฑ
start.sh
#!/bin/bash
# ๋ณ์ ์ ์ธ (=) ์๋ค๋ก ๊ณต๋ฐฑโ
PROJECT_NAME=hello-application
WORKSPACE=/home/joeun/workspace
REPOSITORY=/home/joeun/workspace/HelloSpringBoot
DEPLOY_PATH=/home/joeun/workspace/HelloSpringBoot/build/libs
# ํ๋ก์ ํธ ๊ฒฝ๋ก๋ก ์ด๋
echo "> ${REPOSITORY} ๋ก ์ด๋"
cd $REPOSITORY
# GIT PULL ์งํ
echo "> GIT PULL"
if git pull; then
echo "> git pull ์ฑ๊ณต"
else
echo "> git pull ์คํจ"
exit 1
fi
# ๋น๋ ์์
echo "> gradle clean build"
./gradlew clean build
# ํ์ฌ ์คํ ์ค์ธ ์๋ฒ pid(ํ๋ก์ธ์ค ์์ด๋) ํ์ธ
CURRENT_PID=$(pgrep -f "${PROJECT_NAME}.war")
echo "> ํ์ฌ ์คํ ์ค์ธ ์๋ฒ pid : ${CURRENT_PID}"
# ์คํ ์ค์ธ ์๋ฒ ์๋์ง ํ์ธ
if [ -z "$CURRENT_PID" ]; then
echo "> ํ์ฌ ์คํ ์ค์ธ ์๋ฒ ์์"
else
echo "> ํ์ฌ ์คํ ์ค์ธ ์๋ฒ ์ข
๋ฃ"
kill -15 $CURRENT_PID
sleep 5
fi
# ์ ํ๋ฆฌ์ผ์ด์
์ฌ๋ฐฐํฌ
echo "> ์๋ก์ด ์ ํ๋ฆฌ์ผ์ด์
๋ฐฐํฌ"
cd $DEPLOY_PATH
nohup java -jar "${PROJECT_NAME}.war" &
Bash
๋ณต์ฌ
๋ฆฌ๋ ์ค ์๋ฒ์ self-hosted runner ์ค์น ๋ฐ ์คํ
runner ์ค์น
1.
Settings
2.
Actions
3.
Runners
a.
[New Runner]
b.
[Create Self-hosted Runner]
i.
์ด์์ฒด์ ์ง์
ii.
์ํคํ
์ฒ ์ง์
iii.
Download, Configure ๋ช
๋ น์ด ์์๋๋ก ์คํ
(LINUX ๊ธฐ์ค)
Download
# Create a folder
$ mkdir actions-runner && cd actions-runner# Download the latest runner package
$ curl -o actions-runner-linux-x64-2.311.0.tar.gz -L https://github.com/actions/runner/releases/download/v2.311.0/actions-runner-linux-x64-2.311.0.tar.gz# Optional: Validate the hash
$ echo "??????????????????????????? actions-runner-linux-x64-2.311.0.tar.gz" | shasum -a 256 -c# Extract the installer
$ tar xzf ./actions-runner-linux-x64-2.311.0.tar.gz
Bash
๋ณต์ฌ
Configure
# Create the runner and start the configuration experience
$ ./config.sh --url https://github.com/ALOHA-CLASS --token ???????????????????????? Last step, run it!
Bash
๋ณต์ฌ
runner ์คํ
cd ~/workspace/actions-runner
Bash
๋ณต์ฌ
./start.sh
Bash
๋ณต์ฌ
์๋ฒ์ git clone ํ๊ธฐ
cd ~/workspace
Bash
๋ณต์ฌ
git clone https://github.com/ALOHA-CLASS/HelloSpringBoot.git
Bash
๋ณต์ฌ
๊ฐ๋ฐ PC ์ git clone ํ๊ธฐ
git clone https://github.com/ALOHA-CLASS/HelloSpringBoot.git
Bash
๋ณต์ฌ
๊ฐ๋ฐ PC ์์ ์์ ํ ์ฝ๋ git push ํ๊ธฐ
์ฝ๋ ์์ ๋ฐ ํธ์
git add .
Bash
๋ณต์ฌ
git commit -m '์ปค๋ฐ'
Bash
๋ณต์ฌ
git push
Bash
๋ณต์ฌ
์๋ฒ์์ ์๋ ๋น๋ ๋ฐ ๋ฐฐํฌ ํ์ธํ๊ธฐ
๊ฐ๋ฐPC ์์ PUSH
GitHub Actions Runner ์์ ์ด๋ฒคํธ ๊ฐ์ง
build
deploy