Github Actions 实践
Github Actions 是 Github 的持续集成服务,通过在 repo 发生特定的行为时执行指定的命令实现自动测试、自动部署等功能。
基本术语
- workflow:一次持续集成运行的过程
- job:一个workflow由一个或多个job构成
- step:一个job由一个或多个step构成,分步完成一个任务
- action:一个step可以依次执行一个或多个action
workflow 文件
启用 Github Actions 需要在代码仓库中的 .github/workflows 目录中创建 workflow 文件。workflow 文件的格式是 .yml,只要在该目录下存在 .yml 文件,Github 就会尝试根据此文件执行相应的命令。
workflow 文件的配置字段比较复杂,囿于篇幅,可参考官方文档进行学习与配置。
Django 实践
对于基于 Django 的服务器后端,使用 Github Actions 可以减少用于测试与部署的时间。
基于 Docker 的示例如下
# workflow 名字为 Django CI
name: Django CI
# 当 push 或 pull request 行为发生时触发该 workflow
on: [push, pull_request]
jobs:
build:
# 基于容器 ubuntu-latest 进行构建
runs-on: ubuntu-latest
strategy:
max-parallel: 4
matrix:
# 使用的环境,此处是 python 3.7
python-version: [3.7]
services:
# 使用的其他容器,此处使用了 Postgresql
postgres:
image: postgres:10
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: github_actions
ports:
- 5432:5432
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
steps:
# 检出代码
- uses: actions/checkout@v2
# 安装相应 python 版本
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v1
with:
python-version: ${{ matrix.python-version }}
# 安装 psycopg2 依赖
- name: Psycopg2 Prerequisites
run: sudo apt-get install python-dev libpq-dev
# 安装 python 依赖
- name: Install Dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
# Django 的 migrate 操作
- name: Migrations
run: |
python manage.py makemigrations
python manage.py migrate
# 执行测试
- name: Run Tests
run: |
python manage.py test --with-coverage --cover-package=myapp
# 上传到 Docker Registry
- name: Publish to Registry
uses: elgohr/Publish-Docker-Github-Action@master
with:
name: user/myapp
usename: user
# 使用 repo 中的 secrets 项
password: ${{ secrets.docker_password }}
dockerfile: Dockerfile
- name: Docker-Compose Action
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
password: ${{ secrets.PASSWORD }}
port: ${{ secrets.PORT }}
script: |
cd myapp && docker-compose pull && docker-compose up -d
如果服务器访问 Docker Registry 缓慢,可以尝试使用 rsync 进行文件复制,并在本地构建 Docker 镜像。
- name: Rsync to Server
uses: AEnterprise/rsync-deploy@master
env:
DEPLOY_KEY: ${{ secrets.SERVER_SSH_KEY }}
ARGS: "-e -c -r --delete"
SERVER_PORT: ${{ secrets.PORT }}
FOLDER: "./"
SERVER_IP: ${{ secrets.IP }}
USERNAME: ${{ secrets.USERNAME }}
SERVER_DESTINATION: ${{ secrets.SERVER_DESTINATION }}
- name: Docker-Compose Action
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
password: ${{ secrets.PASSWORD }}
port: ${{ secrets.PORT }}
script: |
cd myapp && docker-compose build && docker-compose up -d
查看 Github Actions 运行情况
在 Github 仓库主页面中,有一项 Actions,里面即 Github Actions 所有的运行情况,包含着每个 workflow 的每次运行记录,可以及时追溯过去的问题。