github-actions自动构建go应用
目录
创建SSH KEY
cd ~/.ssh
ssh-keygen -t rsa -C "username@email.com"
取名github20211003得到私钥和公钥:
github20211003 github20211003.pub
将公钥放入authorized_keys:
cat github_action.pub >> authorized_keys
配置Secrets
打开github项目,settings->左侧栏Secrets->New Repository secret
添加我们再actions工作流中会用到的一些敏感的数据,比如用户密码、路径等
比如我们下的workflow中使用到的:BLOG_DEPLOY_HOST,BLOG_DEPLOY_KEY…
根据workflow需要任意添加需要的数据。
创建Workflow
完整构建工作流:
name: microblog-go
on:
push:
branches: [ master ] #push master的时候触发
paths-ignore: # 下列文件的变更不触发部署,可以自行添加
- 'LICENSE'
- '.gitignore'
- 'README.md'
pull_request:
branches: [ master ] #pull request 到master的时候触发
paths-ignore: # 下列文件的变更不触发部署,可以自行添加
- 'LICENSE'
- '.gitignore'
- 'README.md'
jobs:
build:
runs-on: ubuntu-latest #使用最新的ubuntu虚拟环境
steps:
- uses: actions/checkout@v2 #使用这个action,checkout到虚拟环境
- name: Set up Go
uses: actions/setup-go@v2 # 虚拟环境搭建go环境
with:
go-version: 1.16 #指定1.16版本
- name: Build
run: go build -o microblog #在虚拟环境编译microblog应用
# - name: Test
# run: go test -v ./... #测试
# 将编译出的二进制文件 scp 到我们的服务器
- name: SCP Files
uses: appleboy/scp-action@master
with:
host: ${{ secrets.BLOG_DEPLOY_HOST }} # Secrets中的配置:IP地址
username: ${{ secrets.BLOG_DEPLOY_USER }} # Secrets中的配置:登录用户名
port: ${{ secrets.BLOG_DEPLOY_PORT }} # Secrets中的配置:端口
key: ${{ secrets.BLOG_DEPLOY_KEY }} # Secrets中的配置:我们服务器上创建的ssh key的私钥内容
source: 'microblog' # 编译出的二进制文件名
target: ${{ secrets.BLOG_DEPLOY_PATH }} # Secrets中的配置:scp 到我们服务器上的的目录
# 通过ssh远程执行命令重启vps上的服务
- name: SSH Remote Commands
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.BLOG_DEPLOY_HOST }} # Secrets中的配置:IP地址
username: ${{ secrets.BLOG_DEPLOY_USER }} # Secrets中的配置:登录用户名
port: ${{ secrets.BLOG_DEPLOY_PORT }} # Secrets中的配置:端口
key: ${{ secrets.BLOG_DEPLOY_KEY }} # Secrets中的配置:我们服务器上创建的ssh key的私钥内容
script: /bin/sh /home/tsingchan/shell/microblog.sh # Secrets中的配置:scp二进制文件到我们服务器上后需要执行的相关shell命令重启服务,
#比如:killall -9 microblog && nohup .../microblog/microblog & 或是shell脚本
由于github actions从2021.09.20开始不再提供ubuntu16.04的虚拟环境,所以如果目标系统还是16.04时,有时在ubuntu-latest环境编译后的执行文件,在16.04下执行会报错,
所以就有了不得已粗暴工作流,直接ssh到目标机器pull代码并编译构建:
name: microblog-go
on:
push:
branches: [ master ]
paths-ignore: # 下列文件的变更不触发部署,可以自行添加
- 'LICENSE'
- '.gitignore'
- 'README.md'
pull_request:
branches: [ master ]
paths-ignore: # 下列文件的变更不触发部署,可以自行添加
- 'LICENSE'
- '.gitignore'
- 'README.md'
jobs:
build:
runs-on: ubuntu-latest
steps:
# 通过ssh远程执行命令重启vps上的服务
- name: SSH Remote Commands
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.BLOG_DEPLOY_HOST }} # Secrets中的配置:IP地址
username: ${{ secrets.BLOG_DEPLOY_USER }} # Secrets中的配置:登录用户名
port: ${{ secrets.BLOG_DEPLOY_PORT }} # Secrets中的配置:端口
key: ${{ secrets.BLOG_DEPLOY_KEY }} # Secrets中的配置:我们服务器上创建的ssh key的私钥内容
script: /bin/sh /home/tsingchan/shell/microblog.sh # Secrets中的配置:scp二进制文件到vps服务器上后需要执行的相关shell命令重启服务,
microblog.sh具体内容
#!/bin/bash
cd /xxx/microblog-new/
/usr/bin/git pull origin master && /usr/local/go/bin/go build && chmod 755 ./microblog && killall -9 microblog
nohup ./microblog > microblog.log 2>&1 &
exit 0
可以考虑使用系统 systemctl 管理服务的方式,触发重启服务。详见:githubactions持续集成构建部署go站点服务
如何编写workflow
如何定义workflow自动触发
-
设置push到main或release/*分支时触发
on: push: branches: - main - release/\*
-
设置pull request到main时触发
on: pull_request: branches: - main
-
设置每周一到周五的2点触发
on: schedule: - cron: "0 2 * * 1-5"
更多详见:Events that trigger workflows
如何手动运行workflow
如果要手动运行workflow,需要配置workflow_dispatch
,会在Actions面板展示"Run workflow"的按钮。
on:
workflow_dispatch:
更多详见:Manually running a workflow
如何在不同的操作系统上执行我们的jobs
GitHub Actions提供了Linux、Windows、macOS的托管运行器(虚拟环境)。
我们可以通过runs-on
指定job运行在什么操作系统(虚拟环境)上:
jobs:
my_job:
name: deploy to staging
runs-on: ubuntu-18.04
可选择的虚拟环境类型有:
ubuntu-latest
,ubuntu-18.04
, orubuntu-16.04
windows-latest
orwindows-2019
macos-latest
ormacos-10.15
注意:GitHub actions:Ubuntu 16.04 LTS 虚拟环境将于 2021 年 9 月 20 日移除 | GitHub 更新日志
更多信息详见:Virtual environments for GitHub Actions](https://docs.github.com/articles/virtual-environments-for-github-actions)
如何使用action
Actions是可重复使用的代码块,在github上的任何人都可以构建和分发actions。我们可以在GitHub Marketplace找到很多actions,当然github官方也提供了一些actions,参考:Actions repository。
- name: Setup Node
uses: actions/setup-node@v1
with:
node-version: '10.x'
更多详见:Workflow syntax for GitHub Actions
执行命令
我们可以在虚拟环境上执行命令,比如:
- name: Install Dependencies
run: npm install
更多详见:Workflow syntax for GitHub Actions
如何一次跨多平台执行同一个job
我们还可以一次性跨多平台执行同一个job,比如在3个虚拟环境执行3个不同版本的node:
jobs:
test:
name: Test on node ${{ matrix.node_version }} and ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
matrix:
node_version: ['8', '10', '12']
os: [ubuntu-latest, windows-latest, macOS-latest]
steps:
- uses: actions/checkout@v1
- name: Use Node.js ${{ matrix.node_version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node_version }}
- name: npm install, build and test
run: |
npm install
npm run build --if-present
npm test
更多详见:Workflow syntax for GitHub Actions
如何有条件的执行step或job
比如,我们只想要push的时候才执行step,pull request的将不会触发:
steps:
- run: npm publish
if: github.event\_name == 'push'
更多详见:Contexts and expression syntax for GitHub Actions