CI & CD
CI\CD 其实说的是三件事情:「持续集成(Continuous Integration)」、「持续交付(Continuous Delivery)」、「持续部署(Continuous Deployment)」。
因为「持续交付」和「持续部署」的英文缩写是一样的,所以这三件事情缩写成了 CI\CD 。
Github Action
Github Action 是 Github 推出的一个 CI/CD 服务,由上至下设计成 workflow > job > step > action.
Github Action 使用 YAML 语法来定义 workflow,每个 workflow 都需要定义在代码库中的 .github/workflow
目录中。
下面便是一个 Hello World
的例子;
yaml
name: Hello World
on:
push:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Hello World
- run: echo 'Hello World'
Github Marketplace 提供了大量可直接使用的 Action,避免重复造轮子,例如 checkout、github-pages-action
部署 Vue
yaml
name: CI & CD
on:
push:
branches: [ "master" ]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
environment: production
# 设置变量
strategy:
matrix:
node-version: [16.x]
steps:
# 检出代码
- uses: actions/checkout@v3
with:
fetch-depth: 0
# 安装 Node 环境
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
- run: npm install -g vite
- run: npm install
- run: npm run build
# 通过 ssh-deploy 部署至 Nginx
- name: Deploy to server
uses: easingthemes/ssh-deploy@v4.1.8
with:
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
SOURCE: "dist/"
REMOTE_HOST: ${{ secrets.REMOTE_HOST }}
REMOTE_PORT: ${{ secrets.REMOTE_PORT }}
REMOTE_USER: ${{ secrets.REMOTE_USER }}
TARGET: ${{ secrets.REMOTE_TARGET }}
部署 Spring Boot
yaml
name: CI & CD
on:
push:
branches: [ "master" ]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
environment: production
steps:
# 检出代码
- uses: actions/checkout@v3
with:
fetch-depth: 0
# 安装 Java 环境
- name: Set up JDK 8
uses: actions/setup-java@v3
with:
java-version: '8'
distribution: 'adopt'
cache: 'gradle'
# 通过 Gradle 构建
- name: Build with Gradle
uses: gradle/gradle-build-action@v2.4.0
with:
arguments: bootJar
# 通过 ssh-deploy 部署至 Linux
- name: Deploy to server
uses: easingthemes/ssh-deploy@v4.1.8
with:
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
SOURCE: "build/libs/"
REMOTE_HOST: ${{ secrets.REMOTE_HOST }}
REMOTE_PORT: ${{ secrets.REMOTE_PORT }}
REMOTE_USER: ${{ secrets.REMOTE_USER }}
TARGET: ${{ secrets.REMOTE_TARGET }}
SCRIPT_AFTER: |
./service.sh restart
定时执行 Python
yaml
on:
schedule:
- cron: '0 0,4,10 * * *'
jobs:
my-job:
name: My job
runs-on: ubuntu-latest
steps:
- name: "拉取工程代码"
uses: actions/checkout@v3
- name: "初始化 python 环境"
uses: actions/setup-python@v1
with:
python-version: 3.7
- name: "自动完成京东果园任务"
run: |
pip install requests
pip install beautifulsoup4
pip install urllib3
python jd_farm.py