如何使用github进行CICD 自动部署到阿里云服务器

2,105 阅读3分钟

在服务器部署自己项目的时候,最麻烦的就是每次更新完代码需要把代码复制到服务器上,编译,然后再部署。

最近发现github提供了CICD的能力,可以在我push代码后自动复制到阿里云并完成编译。

下面简单介绍一下使用方式

github action

Github Actions是由Github创建的 CI/CD服务。 它的目的是使所有软件开发工作流程的自动化变得容易。 直接从GitHub构建,测试和部署代码。CI(持续集成)由很多操作组成,比如代码合并、运行测试、登录远程服务器,发布到第三方服务等等。GitHub 把这些操作就称为 actions。

很多操作在不同项目里面是类似的,完全可以共享。GitHub 允许开发者把每个操作写成独立的脚本文件,存放到代码仓库,使得其他开发者可以引用。

GitHub 做了一个GitHub Marketplace ,可以搜索到他人提交的 actions。

也可以自己写一个简单的CICD的ation,步骤也很简单

1、在项目下创建./github/workflow/release.yml文件

# This workflow will build a golang project
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-go

name: release

on:
  push:
    branches: [ "main" ] # master 分支提交时触发
  pull_request:
    branches: [ "main" ]

jobs:

  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3

    - name: Set up Go #配置GO 环境
      uses: actions/setup-go@v3
      with:
        go-version: 1.18

    - name: Build # 编译项目
      run: go build -v ./...

    - name: 发布到阿里云
      uses: easingthemes/ssh-deploy@v2.1.5
      env:
          #私钥
          SSH_PRIVATE_KEY: ${{ secrets.ALIYUN_SERVER_PRIVATE_KEY }}
          #SCp参数
          ARGS: "-rltgoDzvO --delete"
          #源目录
          SOURCE: "./"
          #服务器Ip:换成你的服务器iP
          REMOTE_HOST:  ${{ secrets.ALIYUN_SERVER_HOST }}
          #用户
          REMOTE_USER: "root"
          #目标地址
          TARGET: "/root/university-selection_Backend"

Github Action 有下面这些概念

  • workflow(工作流程):指整个持续集成的流程,包含执行脚本任务、执行触发事件等

  • Events (事件):触发流程的钩子,例如提交代码触发,新建 Issues 触发等等。

  • Jobs (任务):每一个工作流程包含一个或多个任务,任务按顺序执行,每一个任务都会执行 shell 脚本。

  • Steps (步骤):每一个 Job 包含一个或多个 Step, Step 按顺序执行。

  • Actions(动作): 每一个 Step 包含一个或多个 Action, 按顺序执行。

  • Runners(执行环境): workflow 运行时的服务器,每一个 Runner 可以运行一个 Job.

release.yml 就指定了一个workflow,其中 :

name 是workflow的名字,

on 指定了触发事件,在拉取和推代码到main分支的时候会触发workflow

jobs 下面我们自定义了我们个工作任务,任务指定了运行环境是 ubuntu, 同时,任务的执行步骤,第一个 任务uses 表示使用公共 actions/checkout@v2 签出代码,这一步就相当于把 github 仓库的代码拉到当前环境磁盘中,第二个任务是配置Go环境,第三个任务是编译我们的项目代码,最后使用easingthemes/ssh-deploy@v2.1.5(别人提供的action) 复制代码到阿里云服务器上。

如果要执行脚本,可以再加下面这段配置注意这里的PWD是密码不是密钥

    - name: Deploy
      uses: appleboy/ssh-action@master
      with:
        host:  ${{ secrets.ALIYUN_SERVER_HOST }}
        username: "root"
          #私钥
        password: ${{ secrets.ALIYUN_SERVER_PWD }}
        script: |
          cd /root/university-selection_Backend
          ./admin_project
          exit

其中最后一个模块中host和key的配置是从setting中取的,可以参考下一节

ssh 密钥配置

进入你的云服务器,执行以下命令生成密钥

cd /root/.ssh
ssh-keygen -m PEM -t rsa -b 4096 -C "你的git邮箱地址"

不断点空格完成密钥生成,会生成私钥id_rsa,公钥id_rsa.pub

复制公钥到以下文件

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

然后在github->setting->ssh 里创建你的公钥,title无所谓

image.png

然后进入你的项目setting,配置域名和私钥,私钥记得全部复制过来,包括(-----BEGIN RSA PRIVATE KEY-----)

image.png

然后就可以看到你的action开始执行了

image.png 如果有报错,permission denied,到服务器上执行

chmod 700 /root/.ssh/authorized_keys

如果报可执行文件无法执行,可以把go build操作放到后面ssh过去的脚本中操作。