Github actions + Docker实现持续部署

发表于: 2020-08-26 15:43:39更新于: 2020-12-18 20:42:34 类别:运维
字数总计: 5.76 k建议阅读时长: 6 分钟 阅读量: 611

准备工作

使用Github action自动部署,需要准备以下东西:

  • 一台能上外网的Linux服务器,并且安装了docker

  • 将已有项目推送到Github仓库

  • 注册阿里云容器镜像服务(免费)

    点我跳转过去

创建镜像仓库

  • 在阿里云容器镜像服务上添加命名空间
    image-20200826142919969

  • 创建存储镜像的仓库

    image-20200826143113505

  • 创建好以后,选择刚才创建的仓库,点击左侧基本信息,复制一下这个公网地址备用

    image-20200826143610680

创建Secrets

登录你的github进入项目仓库,依次点击settings>Secrets>New secret

image-20200826143924760

点击New secret以后出来的页面有2个选项,Name和Value,Name对应上图红框所示,Value填入Name对应的值,简单解释一下:

DOCKER_REPOSITORY: 镜像仓库地址,也就是上一个步骤复制到的公网地址

DOCKER_USERNAME:登录阿里云的账号

DOCKER_PASSWORD: 登录阿里云的密码

HOST:部署项目的服务器ip

HOST_PORT:服务器ssh端口号(默认是22)

HOST_USERNAME:服务器登录用户名(ps:非root权限账号请子u该账号所属组为docker)

HOST_PASSWORD: 登录服务器的密码

ps:这里的Secrets不会被pull,别人也看不到,所以还是比较安全

创建Dockerfile

在github的项目仓库面板,依次点击code>Add file>create new file,Name your file填入Dockerfile,文件内容如下:

FROM node:12.18.0-buster-slim
RUN mkdir -p /usr/src
COPY . /usr/src
WORKDIR /usr/src
RUN npm i
EXPOSE 4000
CMD ["node","app.js"]

ps:EXPOSE根据你的实际情况修改

填好之后点击下方的绿色commit new file按钮

简单解释一下:

image-20200826145109389

顺便说一下RUN和CMD 的区别,相同点,都是执行命令,不同点在于,RUN 是在打包镜像的时候执行,CMD是在运行容器的执行

创建工作流

在github仓库面板点击Actions按钮,找到Node.js,选择Set up this workflow

image-20200826145318723

在内容区域ctrl+a全选然后删除,粘贴进以下内容:

name: Docker Image CI/CD
on:
  push:
    branches: [ master ]
jobs:
  build:
    runs-on: ubuntu-latest      
    steps:
      - uses: actions/checkout@v2
      - name: Build Image
        run: docker build -t ${{ secrets.DOCKER_REPOSITORY }}:latest ./
      - name: Login to registry
        run: docker login --username=${{ secrets.DOCKER_USERNAME }} --password ${{ secrets.DOCKER_PASSWORD }} registry.cn-hangzhou.aliyuncs.com
      - name: Push Image
        run: docker push ${{ secrets.DOCKER_REPOSITORY }}:latest
  pull-docker:
    needs: [build]
    name: Pull Docker
    runs-on: ubuntu-latest
    steps:
      - name: Deploy
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.HOST_USERNAME }}
          password: ${{ secrets.HOST_PASSWORD }}
          port: ${{ secrets.HOST_PORT }}
          script: |
            docker stop $(docker ps --filter ancestor=${{ secrets.DOCKER_REPOSITORY }} -q)
            docker rm -f $(docker ps -a --filter ancestor=${{ secrets.DOCKER_REPOSITORY }}:latest -q)
            docker rmi -f $(docker images ${{ secrets.DOCKER_REPOSITORY }}:latest -q)
            docker login --username=${{ secrets.DOCKER_USERNAME }} --password ${{ secrets.DOCKER_PASSWORD }} registry.cn-hangzhou.aliyuncs.com
            docker pull ${{ secrets.DOCKER_REPOSITORY }}:latest
            docker run -d -p 8000:4000 ${{ secrets.DOCKER_REPOSITORY }}:latest

然后点击右侧Start commit>Commit changes

image-20200826152829979

有点懵逼?来一份注释吧

name: Docker Image CI/CD # workflow名称,可以随意改
on: # workflow的事件钩子,告知程序说明时候出发自动部署
  push:
    branches: [ master ] # 在master分支有push操作的时候自动部署
jobs:
  build: # 打包并上传docker镜像
    runs-on: ubuntu-latest # 依赖的环境      
    steps:
      - uses: actions/checkout@v2
      - name: Build Image
      # ${{ secrets.DOCKER_REPOSITORY }}是读取之前在Secret创建的名为DOCKER_REPOSITORY的值
        run: docker build -t ${{ secrets.DOCKER_REPOSITORY }}:latest ./ # 打包并docker镜像,版本为latest
      - name: Login to Registry # 登录阿里云镜像服务器
        run: docker login --username=${{ secrets.DOCKER_USERNAME }} --password ${{ secrets.DOCKER_PASSWORD }} registry.cn-hangzhou.aliyuncs.com
      - name: Push Image # 推送镜像,设置版本为latest
        run: docker push ${{ secrets.DOCKER_REPOSITORY }}:latest
  pull-docker: # docker部署
    needs: [build]
    name: Pull Docker
    runs-on: ubuntu-latest
    steps:
      - name: Deploy
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.HOST }} # 服务器ip
          username: ${{ secrets.HOST_USERNAME }} # 服务器登录用户名
          password: ${{ secrets.HOST_PASSWORD }} # 服务器登录密码
          port: ${{ secrets.HOST_PORT }} # 服务器ssh端口
          script: |
              # 停止旧版容器
            docker stop $(docker ps --filter ancestor=${{ secrets.DOCKER_REPOSITORY }} -q)
            # 删除旧版容器
            docker rm -f $(docker ps -a --filter ancestor=${{ secrets.DOCKER_REPOSITORY }}:latest -q)
            # 删除旧版镜像
            docker rmi -f $(docker images ${{ secrets.DOCKER_REPOSITORY }}:latest -q)
            # 登录阿里云镜像服务器
            docker login --username=${{ secrets.DOCKER_USERNAME }} --password ${{ secrets.DOCKER_PASSWORD }} registry.cn-hangzhou.aliyuncs.com
            # 拉取最新latest版本镜像
            docker pull ${{ secrets.DOCKER_REPOSITORY }}:latest
            # 运行最新latest版本镜像
            docker run -d -p 8000:4000 ${{ secrets.DOCKER_REPOSITORY }}:latest

这里使用的是yml的语法,该语法对缩进要求极高

在事件钩子on里面也可以指定tag,比如: tags: [release-v*] 意思是tag为 release-v*版本时候就出发自动部署

镜像版本这里写死了latest,当然也可以根据上下文context指定,指定好了替换所有的latest即可

上面的8000:4000的端口映射改成实际需要即可,这里对应上Dockerfile的端口,以及项目实际运行的端口,几个地方保持一致

后续

以后每次push到master分支以后会自动触发actions,想要查看持续部署的过程可以点击项目面板的actions

image-20200826152322511

如图所示,绿色钩的就是成功的,红叉的就是失败了,可以选择对应项查看部署日志

image-20200826152511751

如果出错了,在日志里面可以查看到错误信息,对应修改就好了

关于Github Actions的详细说明可以参考官方文档

相关推荐

example
Github+ pm2实现自动化部署
2019-07-13 17:40:20
example
python实现前端项目自动化打包部署
2019-01-14 20:39:42
example
Github actions + Docker实现持续部署
2020-08-26 15:43:39

评论

1 评论

打工人 Chrome 86.0.4240.75 Windows 10

2020-10-24 19:20:36

感谢分享^~^