GitHub Actions 是 GitHub 推出的功能,可以为我们的项目构建自动化工作流。例如代码检查,自动化打包,测试,发布版本等等。入口在项目 Pull Requests 旁边。
本篇文章主要是趟一遍其中的小坑,让大家在第一次使用的时候能比较顺利的跑通。其中主要用到了 GitHub,Docker,SpringBoot,Nginx 等技术。对这些技术还不是很了解的伙伴,可以先自行查阅一下资料哈。
使用 IDEA 创建一个 SpringBoot 工程,SpringBoot 从 2.3.0.M1 版本开始用 Gradle 构建。所以我们这里也选 Gradle 作为构建工具 。
We made a fairly significant change to Spring Boot in 2.3.0.M1. It was the first release of the project to be built with Gradle rather than Maven.
详情可参考 Migrating Spring Boot’s Build to Gradle
在 SpringBoot 工程中,我们编写一个简单的控制器用于测试,代码十分简单,这里也给出示例。
@RestController
public class DemoController {
@GetMapping("/")
public String sayHello() {
return "Hello GitHub Actions!";
}
}
在 SpringBoot 工程中创建 Dockerfile 文件,用于镜像打包 。
# FROM 指定基础镜像
FROM openjdk:8-jdk-alpine
# ARG 构建参数
ARG JAR_FILE=build/libs/*.jar
# COPY 复制文件
COPY ${JAR_FILE} app.jar
# 暴露端口
EXPOSE 8080
# CMD 容器启动命令
CMD java -jar /app.jar
还不了解 Dockerfile 的小伙伴可前往 使用 Dockerfile 定制镜像 了解一下基础知识。
这一步小伙伴们可以自由选择阿里云或者腾讯云等云服务商开通相应服务,之后我们打包好的镜像要上传到我们自己私有的 Docker Registry 中。这一步很重要大家一定要开通好再进行下面的步骤哈。
开通好服务之后,可稍微阅读一下服务商的文档,对该服务有个大概的基本认识即可。
本篇文章中使用的云服务商是阿里云,大家可点击这里进行开通与配置。
将我们的 SpringBoot 工程上传到 GitHub Repository 中,关于怎么创建 GitHub Repository,相信各位小伙伴都产生肌肉记忆了吧 !
git init
git add .
git commit -m "first commit"
git remote add origin {{ your origin url }}
git push -u origin master
进入 SpringBoot 工程目录,输入上面这几条命令,就可以轻松将代码上传至你的 GitHub Repository。
我们点击 Actions 选项卡,选择 Java with Gradle 模版作为基础模版进行配置。
# GitHub Actions 的名称
name: GitHub Actions SpringBoot Demo
# 当 master 分支发生 push 或者 pull request 事件时触发 action
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
# 指定 jobs
jobs:
# build job
build:
# 指定运行在 ubuntu 上
runs-on: ubuntu-latest
steps:
# 把仓库代码拉到 ubuntu 镜像上
- uses: actions/checkout@v2
# 指定 java 版本
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
# 给 gradle 赋予可运行权限
- name: Grant execute permission for gradlew
run: chmod +x gradlew
# 通过 gradle 打包我们的项目
- name: Build with gradle
run: ./gradlew build
# 通过 Dockerfile 构建镜像
- name: Build docker image
run: docker build . -t {{ image_name:image_version }}
# 登陆到我们自己的 docker registry
- name: Login to aliyun docker image registry
run: echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login --username=xxxxxx registry.cn-shenzhen.aliyuncs.com --password-stdin
# 上传 docker 镜像
- name: Push image to aliyun docker image registry
run: docker push {{ image_name:image_version }}
配置文件中的 ${{ secrets.XXX }}
变量,是 GitHub 为了保护我们的密钥所提供的功能。可以在仓库的 Settings 下的 Secrets 中定义变量,然后按照 ${{ secrets.XXX }}
的格式,就可以拿到变量值。
到这儿,我们就完成了 GitHub Actions 的配置文件编写。小伙伴们需要注意一下 yaml 文件的格式,不要出现格式错误。
完成配置文件的编写之后,我们点击 start commit 进行提交,提交成功后会自动触发 Actions 功能进行构建。
点击 Actions 选项卡,找到被触发的 Actions,等待片刻即可看见构建结果。如果构建中途出现了错误,也可直接在这里看见原因并前往配置文件排查。
构建完成之后,我们可以进入相应的云服务商后台查看一下我们上传的 Docker 镜像,再次确认是否构建成功!
小伙伴们确认一下自己的服务器是否已经安装 Nginx,Docker。如果还没有安装,可以先查阅相关资料进行安装。安装成功之后,再进行下列步骤。
这里我们要准备一份简单的服务器部署 bash 脚本,完成对旧容器的关闭删除,对新镜像的拉取并且构建新容器操作。这里有一份简单的例子可以参考。
# 拉取新镜像
docker pull {{ your image_name:image_version }}
# 停止旧容器
docker stop {{ your container name }}
# 删除停止的容器
docker container prune -f
# 构建新容器
docker run \
-p 8080:8080 \
-v /data:/data \
--name {{ your container name }} \
-d {{ your image_name:image_version }}
我们需要对上面编写好的 GitHub Actions 配置文件增加一些内容,主要作用是推送完 Docker 镜像之后,触发远程服务器拉取镜像重新构建,并用新的镜像启动容器。完整的 GitHub Actions 配置文件如下所示。
# GitHub Actions 的名称
name: GitHub Actions SpringBoot Demo
# 当 master 分支发生 push 或者 pull request 事件时触发 action
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
# 指定 jobs
jobs:
# build job
build:
# 指定运行在 ubuntu 上
runs-on: ubuntu-latest
steps:
# 把仓库代码拉到 ubuntu 镜像上
- uses: actions/checkout@v2
# 指定 java 版本
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
# 给 gradle 赋予可运行权限
- name: Grant execute permission for gradlew
run: chmod +x gradlew
# 通过 gradle 打包我们的项目
- name: Build with gradle
run: ./gradlew build
# 通过 Dockerfile 构建镜像
- name: Build docker image
run: docker build . -t {{ image_name:image_version }}
# 登陆到我们自己的 docker registry
- name: Login to aliyun docker image registry
run: echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login --username=xxxxxx registry.cn-shenzhen.aliyuncs.com --password-stdin
# 上传 docker 镜像
- name: Push image to aliyun docker image registry
run: docker push {{ image_name:image_version }}
# 连接到远程服务器
- name: Connect to server
uses: webfactory/ssh-[email protected]
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
# 初始化 knownhosts
- name: Setup knownhosts
run: ssh-keyscan {{ your host }} >> ~/.ssh/known_hosts
# 触发服务器部署脚本
- name: Trigger server deployment script
run: ssh root@{{ your host }} "sh {{ your deployment bash script }}"
关于 Nginx 方面,相信各位小伙伴应该是十分熟悉了,这里就不过多赘述。直接贴上一份简单的配置文件。
server {
listen 80;
server_name {{ your domain }};
location / {
proxy_pass http://localhost:8080/;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
}
}
完成了上面这些步骤,我们到 SpringBoot 工程里修改一下代码并提交到 GitHub Repository。稍等一会儿再访问项目,查看一下效果!
@RestController
public class DemoController {
@GetMapping("/")
public String sayHello() {
return "Hello GitHub Actions!Hello World!";
}
}
到这里我们就成功完成了一个基础的 GitHub Actions 实践,以后小伙伴们修改完代码,Push 或者 PR 到 master 分支,GitHub Actions 就会自动完成我们设置好的构建步骤。非常的方便快捷!
这份基础的 GitHub Actions SpringBoot 实践仅供大家参考,如果遇到什么坑,也欢迎在评论区与我讨论。文章写的不好,请大家多多谅解 。