在本文中,我们将介绍如何使用 Github Actions 自动化开发部署工作流,使版本控制和 CI/CD 平台在同一个地方完成。
自2019年开始,github便提供了CI/CD工具,对于public类型的代码库是免费的,对于private类型的代码库每个月2000分钟免费。
我们可以使用GitHub Actions直接在我们的仓库中管理和自动化我们的开发工作流。其API支持多种操作系统(Linux、Windows、MacOS......)和不同语言。
在本文中,我将介绍一个使用Github Actions为Spring boot 2.x (java 8)web服务建立CI/CD管道的例子。
1
简介
这个想法是通过使用Github Actions构建一个CI/CD管道来自动化开发工作流。目的是在远程服务器上部署一个Spring Boot网络服务。我们将使用一系列的工作来构建、测试、生成代码覆盖率报告,并直接从GitHub部署我们的代码。生成的包将部署在远程服务器上。
有两种方法可以创建一个所需的工作流文件:
我们可以在我们的Github仓库中创建一个工作流。YAML文件必须存储在我们Github仓库根目录下的.github/workflows目录下。工作流必须有至少一个job,其中包含一组执行个别任务的步骤。步骤可以运行命令或使用一个动作。我们的工作流文件应该尊重YAML语法,并且必须有一个.yml或.yaml文件扩展名。
第二种,通过在GitHub仓库的Actions部分创建一个工作流文件,我们选择maven工作流。
当我们点击设置这个工作流时,就会看到下面预填的maven工作流。
这些作业是基于矩阵构建的。一个矩阵构建在每个工作流中最多可以生成256个作业。
我们将工作流配置为当GitHub事件发生时启动。在主分支上推送代码或提出拉取请求后,作业将被触发。本例中的主要作业是启动mvn包命令。由于在YAML文件中指定了,我们必须将修改提交到主分支上。
2
测试工作流
接下来,让我们测试一下上面的工作流。
启动工作流流程后,执行的配置会定义一些应该在Ubuntu容器内执行的操作。工作会对我在主分支上的git仓库进行检查,并设置JDK 1.8。然后,它启动mvn构建命令,并将所需的Maven包放入我的pom.xml中。最后,它运行测试并生成JAR文件。
3
增强工作流
我们在文件中增加几个job:
compile job
test job
build job
下面是完整的文件:
YAML
name: Java CI with Maven
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
compile:
runs-on: ubuntu-latest
name: Running Java ${{ matrix.java }} compile
steps:
- uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Compile code
run: mvn compile
test:
runs-on: ubuntu-latest
name: Running tests
needs: compile
steps:
- uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Run unit tests
run: mvn test
build:
runs-on: ubuntu-latest
name: Run mvn build and generate coverage report
needs: test
steps:
- uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Build with Maven
run: mvn -B package --file pom.xml -Dmaven.test.skip=true
- name: generate report codecov
run: mvn cobertura:cobertura
- name: Upload coverage
if: success()
run: |
curl -s https://codecov.io/bash | bash
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
shell: bash
我们使用加密的秘密来存储敏感信息。一个字段CODECOV_TOKEN,是一个从codecov.io中检索的令牌。它在Github环境中作为一个秘密被持久化。
一旦执行了动作,我们就可以在 "动作 "选项卡中看到结果。
在最后一步,我们需要添加一个作业来在远程服务器上部署jar文件。这个工作和前面的工作差不多。我们必须将可执行文件复制到远程服务器上,这个操作基于SFTP协议。
为了让这个工作顺利进行,我们将使用GitHub社区共享的action,我们将根据需要定制它们,garygrossgarten/github-action-scp@release和fifsky/ssh-action@master。然后,我们要在版本库的Github secrets部分添加秘密(ssh连接的环境变量)。
这些变量将在用 Github Actions 启动的容器中可用。
YAML
deploy:
runs-on: ubuntu-latest
name: Deploy the JAR file to the remote server
needs: build
steps:
- uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Generate the package
run: mvn -B package --file pom.xml -Dmaven.test.skip=true
- name: Deploy the package to the remote server
uses: garygrossgarten/github-action-scp@release
with:
local: target/workflow-github-actions-1.0-SNAPSHOT.jar
remote: hacene/demo/actions/workflow-github-actions.jar # My remote directory
host: ${{ secrets.HOST }}
username: ${{ secrets.SSH_USER }}
password: ${{ secrets.SSH_PASSWORD }}
- name: Run a script on remote server (start the application)
if: always()
uses: fifsky/ssh-action@master
with:
command: |
cd hacene/demo/actions/ && java -jar workflow-github-actions.jar &
host: ${{ secrets.HOST }}
user: ${{ secrets.SSH_USER }}
pass: ${{ secrets.SSH_PASSWORD }}
args: "-tt"
# The & in the command runs the process on background
一旦有代码提交,你便可以在 Actions下看到如下界面:
4
总结
希望你喜欢这篇文章,并学会如何使用Github动作来自动化你的CI/CD工作流。
就我个人而言,我曾经用Jenkins在一个CI平台上工作,需要很多先决条件来设置工作流程。所以,我非常惊讶于使用Github Actions的CI/CD管道的工作效果,完美无瑕,快速。我们可以利用这种灵活性来创建和维护定制化的开发工作流,从而实现软件开发生命周期流程的自动化。