乐趣区

关于github-actions:GitHub-Actions-入门实践

前言

GitHub Actions 是 GitHub 推出的性能,能够为咱们的我的项目构建自动化工作流。例如代码查看,自动化打包,测试,公布版本等等。入口在我的项目 Pull Requests 旁边。

本篇文章次要是趟一遍其中的小坑,让大家在第一次应用的时候能比较顺利的跑通。其中次要用到了 GitHub,Docker,SpringBoot,Nginx 等技术。对这些技术还不是很理解的搭档,能够先自行查阅一下材料哈。????

实际步骤

创立 SpringBoot 工程

应用 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!";}
}

编写 Dockerfile 文件

在 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

这一步小伙伴们能够自由选择阿里云或者腾讯云等云服务商开明相应服务,之后咱们打包好的镜像要上传到咱们本人公有的 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。

配置 GitHub Actions

咱们点击 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 文件的格局,不要呈现格局谬误。

触发 GitHub Actions

实现配置文件的编写之后,咱们点击 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-agent@v0.4.1
      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;
    }
}

测试 GitHub Actions

实现了下面这些步骤,咱们到 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 实际仅供大家参考,如果遇到什么坑,也欢送在评论区与我探讨。文章写的不好,请大家多多体谅 ????。

退出移动版