Github WorkFlow
是2020年GitHub的重大更新之一,项目开发中往往有大量的时间被浪费在等待,等待构建、等待测试、等待 Review ……而这一切,都可以依靠 GitHub flow 来进行改善。
0. 传统工作流程
假如你熟悉Docker,你可能觉得自己在容器化方面的基础,可以非常快的操刀各种项目而无需担心项目开发环境问题,但如果你不熟悉,则大部分时间浪费在本地开发环境调配。
因此,我们通常会使用python或CMD编写一些本地自动化脚本,来实现一些重复操作。达到这个地步,说明你已经很厉害了,可以忽略线上的自动化构建。
1. GitHub Workflow的优势
海量社区市场,基本上你现在所能想到的基础功能都已实现。比如自动化构建镜像、推送到官方镜像库或任意其他仓库;比如代码安全审查;比如本篇要讲的服务器远程控制等等。
开始一个workflow是非常简答的事情,一次设置即可,让开发者从重复过程中解脱出来,更专注与学习和思考业务逻辑。
2. GitHub workflow远程控制实战
以个人项目为例:https://github.com/Baiyuetribe/kamiFaka
name: 自动化构建Docker镜像
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
push_to_registry:
name: Push Docker image to Docker Hub
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2.3.2
name: Check out code
- uses: mr-smithers-excellent/docker-build-push@v4
name: Build & push Docker image
with:
image: baiyuetribe/kamifaka
tag: latest
registry: docker.io
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: SSH Remote deploy
uses: appleboy/ssh-action@master
with:
host: 107.148.243.178
username: ${{ secrets.REMOTE_USERNAME }}
password: ${{ secrets.REMOTE_PASSWORD }}
port: ${{ secrets.REMOTE_PORT }}
script: |
docker rm -f kamifaka
rm -rf /opt/kamifaka
docker pull baiyuetribe/kamifaka
docker run -d --name=kamifaka -p 8000:8000 -v /opt/kamifaka:/usr/src/app/public baiyuetribe/kamifaka
push_to_aliyun:
name: Push Docker image to Aliyun Hub
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2.3.2
name: Check out code
- uses: mr-smithers-excellent/docker-build-push@v4
name: Build & push Docker image
with:
image: baiyuetribe/kamifaka
tag: latest
registry: registry.cn-hangzhou.aliyuncs.com
username: ${{ secrets.ALIYUN_USERNAME }}
password: ${{ secrets.ALIYUN_PASSWORD }}
文件格式为yaml格式(非常先进的一种格式),这里面开头的是workflow的名称,支持中文。接下来的on
代表触发条件,我设置为每次提交代码或者被人提交pull_request的时候就自动执行,然后是jobs
,这个里面的任务是同时执行的,因此构建镜像并发送到Docker和构建镜像发送到阿里云镜像是同时执行的。
uses
就是整个自动化的核心,这里面指定的运行的特殊环境方法,更多资源可以参考https://github.com/marketplace
,一般都有基础演示。我使用mr-smithers-excellent/docker-build-push@v4
这个Action
,就可以构建镜像并把成功构建的结果推送到Docker官方或阿里云仓库,配置里的${{ secrets.DOCKER_USERNAME }}
大写字母,就是存储在该项目下的一些密码等信息,对外不可见。
打开项目设置,就可以看到Secrets
,右上角可以添加这类环境变量。
类似的,完成Docker镜像打包及推送后,接着我们的目的是控制服务器,使个人服务器立马更新这个镜像。手动操作的话就是ssh登录该服务器,然后删除该容器及数据卷,然后更新镜像并重新启动一个容器。而自动化就非常方便,appleboy/ssh-action@master
这个Action
可以实现上述过程,并且实际体验比人工速度还要快。感觉就是我写完代码后本地提交一下,然后再去看GitHub或自己的服务器,内容就已经生效了。
3. 更多说明
实际上借助GitHub workflow可以自动化执行很多事情,有人借助这个做爬虫,也有人用这个做一些b站定时签到点赞等功能。就看谁会不会用,怎么用了。总感觉2020年随着开源项目的发展,传统的php、java类程序在线上部署的优势消失殆尽,不论谷歌、微软,还是国内的阿里云、腾讯云,都在极力推荐微服务、云函数等。今年阿里双十一也足够证明云服务器在当下的现实意义。对一般人而言,传统的vps仍然很香,可是一旦越来越多的开源项目都支持云函数了,那么现有的vps就会逐渐退出大众视野。