使用Docker进行容器化的项目部署已经是非常方便了 , 但是如果线上环境出现了一些小的问题 ,往往需要我们去手动的去修改 , 重新部署, 重复的无意义劳动显然非常令人讨厌。

对于懒人来说自动化的配置显然是最舒服的

谁能理解数据库密码因为数字开头导致线上数据库连接不上 ,

*docker build docker run docker rm docker rmi 敲了一下午晚上闭上眼全是Docker **的痛苦啊???

那么接下来就让我们一起动手去实现 使用GithubAction与阿里云镜像仓库自动化实现Docker镜像构建与推送

创建阿里云镜像仓库

这里使用阿里云的容器镜像服务

然后我们进入控制台, 找到代码源, 选择绑定github(如果使用别的平台那么就选择别的代码源即可)

image-20230831115110998

接着我们创建镜像仓库

创建好了之后页面如下

image-20230831115142138

配置Github Action

准备秘钥

在前面我们在阿里云中配置镜像仓库的时候设置了账户以及密码 , 这里首先需要在Github中设置以供使用

找到 Settings -> Secrets and variables -> Actions -> New repository secret

手动进行添加即可 , 设置成功后可以看到如下内容 (请忽略ID_RSA以及ID_RSA_PUB)

创建工作流

我们的目的是

  1. 构建Docker镜像
  2. 推送到阿里云仓库

那么可以简单总结工作流的主要工作流程

  1. 安装JDK (这里自带了Maven的环境)
  2. 通过Maven构建Jar包(如果是gradle项目请注意更改这一步的内容)
  3. 登录到阿里云镜像仓库(这里需要使用到前面我们配置的 REGISTRY PASSWORDREGISTRY USERNAME)
  4. 构建Docker镜像(通过我们事先准备好的Dockerfile)
  5. 推送镜像到阿里云镜像仓库

注意前两个步骤非常重要 , GithubAction的运行环境就是一个非常干净的操作系统(所以环境都需要我们自己手动去配置)

这里使用Dockerfile实际上还有一个大坑

原因也很简单 , 原本的Dockerfile是用来手动进行镜像构建以及项目部署的 , 使用的路径都是自定义的路径 , 但是这里我们使用Github Action , 就需要去通过调试来更改我们的配置(workflow文件以及Dockerfile都需要更改)

原本我的Dockerfile是这样的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
FROM openjdk:8-jdk-alpine
LABEL maintainer="adorabled4 <dhx2648466390@163.com>"

# 设置时区
RUN apk add --no-cache tzdata && \
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone && \
apk del tzdata

# 创建工作目录
RUN mkdir -p /app/hxBI

# 将所有jar文件添加到对应模块的目录中 => 需要注意的是 , TODO 构建的时候是以dockerfile所在的目录开始的
COPY jar/hxBI.jar /app/hxBI

# 暴露端口号
EXPOSE 6848

# 运行所有jar文件
CMD ["sh", "-c", "java -jar /app/hxBI/hxBI.jar --spring.profiles.active=prod"]

而我在部署的时候执行的Shell命令是这样的

1
2
3
4
5
6
7
#!/bin/bash
# 切换到工作目录
cd /app
# 构建 Docker 镜像
docker build -t hxbi:v1 .
# 运行容器
docker run -d -p 6848:6848 --name hxbi hxbi:v1

这里全程的工作目录都是/app , 因此毫无例外的 , 前几次的workflows全部都失败了

好在通过查询错误信息:

不难理解应该是workflow在运行的时候没有找到某某文件

那么我们简单的在workflow的配置中添加这样的一条配置

1
2
3
4
- name: Show Directory and Files
run: |
pwd
ls -la

pwd: 打印当前的工作目录

ls -la : 打印当前工作目录下的文件

通过这样简单的调试 , 答案也很明显了

可以看到这里的工作目录是 /home/runner/work/hxBI/hxBI , 并不跟我们所期望的/app 相同

接着选择修改Dockerfile文件的配置

注意maven package 的结果在target目录中

1
2
3
4
5
6
7
8
# 把 jar 复制到当前的目录
COPY target/hxBI.jar .

# 暴露端口号
EXPOSE 6848

# 运行所有jar文件
CMD ["sh", "-c", "java -jar hxBI.jar --spring.profiles.active=prod"]

这里不建议使用绝对路径 , 因为我们只要保证文件的相对路径是确定的 , 那么运行就不会出现问题

接着运行workflow

访问阿里云镜像服务

到这里 , 我们的Github Action已经是配置完成了。

这里给出我的完整yml文件的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
name: hxbi-backend-DockerImageCI
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
jobs:
bt-product-release:
if: ${{ github.ref == 'refs/heads/master' }} # 检测master分支是否有更新
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3 # pull代码到运行服务器上
# set up JDK
- name: Set up JDK 8.0.382
uses: actions/setup-java@v3
with:
java-version: '8.0.382'
distribution: 'temurin'
cache: maven
# log
- name: Show Directory and Files
run: |
pwd
ls -la
# build jar
- name: Build with Maven # build jar
run: mvn -B package -DskipTests --file pom.xml

# login to ACR
- name: Login to Aliyun Container Registry (ACR)
uses: aliyun/acr-login@v1 # 使用阿里云镜像服务action
with:
login-server: registry.cn-wulanchabu.aliyuncs.com # 务必正确填写镜像容器服务的登录地址
region-id: cn-wulanchabu # 务必正确填写镜像容器服务的登录地址
username: "${{ secrets.REGISTRY_USERNAME }}" # 引用GitHub repo设置的镜像容器服务用户名
password: "${{ secrets.REGISTRY_PASSWORD }}" # 引用GitHub repo设置的镜像容器服务密码

# build image and push to ACR
- name: Build and Push Docker Image
env:
IMAGE_TAG: ${{ github.sha }} # 用于标记容器版本号
run: |
docker build -t registry.cn-wulanchabu.aliyuncs.com/hxbi/hxbi-backend:$IMAGE_TAG .
docker push registry.cn-wulanchabu.aliyuncs.com/hxbi/hxbi-backend:$IMAGE_TAG

通过镜像仓库进行项目部署

首先 , 由于我们创建的仓库一般是私有的仓库 , 因此如果远程拉取还是需要登录的

docker login --username=*** --password=**** registry.cn-*****.aliyuncs.com

如果登录成功可以看到

接着通过docker pull拉取我们的镜像 ( 注意需要提前选择好镜像版本)

docker pull registry.cn-***.aliyuncs.com/hxbi/hxbi-backend:**********

接着通过docker images查看

有了镜像之后的操作就非常简单了 , 在此不再赘述