GitHub Actions 入门断奶教程

通过github actions将代码自动部署到阿里云 ECS

github actions 介绍

CI/CD概念

如果你熟悉gitlab runner 亦或是 Jenkins,相信你对持续集成应该不会陌生,这个英文简称为CI(CD为持续部署),对CI/CD不了解的同学,可以看看这篇文章。持续集成可以由很多操作组成,比如抓取代码、运行测试、登录远程服务器,发布到第三方服务(比如阿里云ECS)等等,GitHub 把这些操作就称为 actions。GitHub 做了一个官方市场,可以搜索到他人提交的 actions。另外,还有一个 awesome actions 的仓库,也可以找到不少 action。

GitHub Actions 入门断奶教程_第1张图片

Actions术语

不同于gitlab runner的yml文件(gitlab-ci.yml)的书写和格式,github actions有自己一套的术语,下面我们来看看actions的专有术语.

workflow (工作流程):持续集成一次运行的过程,就是一个 workflow。

一般一个workflow,由一个yml文件构成,一个库可以由多个workflow文件组成.

job (任务):一个 workflow 由一个或多个 jobs 构成,含义是一次持续集成的运行,可以完成多个任务。

这里类似于 gitlab-runner ci yml中的stages,以下这个例子是gitlab-runner ci docker镜像的写法参考

gitlab-runner ci
stages:
  - test
  - build_image
  - deploy_production

test:
  tags:
    - test
  variables:
    GIT_STRATEGY: fetch
  before_script:
    - pip install flake8
  script:
    - flake8 project
****************
github actions ci 并没有gitlab有个stages(流水线阶段,按顺序执行)步骤声明,而是在jobs中声明.

jobs:
  test:
    name: Python Lint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-python@v2
        with:
          python-version: "3.9"
      - name: Run flake8
        uses: julianwachholz/flake8-action@v2
        with:
          checkName: "Python Lint"
          path: path/to/files
          plugins: flake8-spellcheck
          config: path/to/flake8.ini
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
看到这里,你可能还是一头雾水,别担心,下面我们再来介绍.

step(步骤):每个 job 由多个 step 构成,一步步完成。

从上面的代码可知,step类似于 before_script 和 script加在一起,

action (动作):每个 step 可以依次执行一个或多个命令(action)。

这个从字面意义上就很好理解,应该不需要示例.

通过写 workflow文件,来理解github actions

当你在github 仓库点击actions,然后创建新的actions(需要注意创建actions的branch 分支),github会在代码仓库的.github/workflows目录创建yml文件.GitHub 只要发现.github/workflows目录里面有.yml文件,就会自动运行该文件.

1、name
name 字段是workflow的名称
name: github actions test
2 on
on 字段表明触发workflow 的条件
on: push   push的时候触发
on: pull_request pull_request 时触发
-----------------------------------------------
on:
  push:
    branches: [ main ]  在push main 分支的时候触发
3 jobs

GitHub Actions 入门断奶教程_第2张图片
为了方便理解,我用了一个打包的github actions job,读者可以看看actions的打包步骤,和自己的打包步骤有哪些区别,有助于理解jobs的写法.

runs-on字段指定运行所需要的虚拟机环境,它是必填字段.
假如你想实现,gitlab那样的按顺序的流水阶段作业也是可以的,但你需要用到needs字段.
jobs:
  job1:
  job2:
    needs: job1
  job3:
    needs: [job1, job2]
执行顺序是 job1 -> job2 -> job3

GitHub Actions 入门断奶教程_第3张图片

wokflow完整示例

---
name: CI for workflow

on:
  push:
    branches: ["main"]
  pull_request:
    branches: ["main"]
  workflow_dispatch:

jobs:
  tests:
    name: "Python ${{ matrix.python-version }}"
    runs-on: "ubuntu-latest"
    env:
      USING_COVERAGE: '3.6,3.8'

    strategy:
      matrix:
        python-version: ["3.6", "3.7", "3.8", "pypy3"]

    steps:
      - uses: "actions/checkout@v2"
      - uses: "actions/setup-python@v2"
        with:
          python-version: "${{ matrix.python-version }}"
      - name: "Install dependencies"
        run: |
          python -VV
          python -m site
          python -m pip install --upgrade pip setuptools wheel
          python -m pip install --upgrade coverage[toml] virtualenv tox tox-gh-actions          

      - name: "Run tox targets for ${{ matrix.python-version }}"
        run: "python -m tox"

这里我写了一个 Python版本兼容性测试工具tox 的workflow样本,这里是仓库地址,你可以copy到你的账户中,略作修改,提交就能观察github actions的具体流程日志输出.

结语,本来只想写下github actions部署到阿里云的教程,结果变成了介绍文,下篇再写吧.

你可能感兴趣的:(Git,python,ci/cd,github,ci,git,python)