一、gitlab实现自动部署的原理
1、部署机上,需要安装插件 gitlab-runner
2、部署机安装 gitlab-runner之后,向gitlab服务器注册
3、gitlab服务器收到commit事件之后,通知部署机拉取代码,执行部署。
4、部署机执行什么操作,由项目目录下的.gitlab-ci.yml文件进行定义。
二、部署机需要的环境
1、安装jdk
2、安装配置maven
3、安装 gitlab-runner
三、部署机的环境安装的具体说明
1、安装jdk 的注意事项:需要给java创建指向/usr/bin/的链接
查看java命令的安装路径: type -p java
创建链接,示例: ln -s /usr/local/jdk1.8.0_102/bin/java /usr/bin/java
2、安装maven
检查是否安装: mvn -version
创建目录:mkdir /opt/maven mkdir /opt/maven/repository
解压示例:tar zxvf apache-maven-3.6.2-bin.tar.gz -C /opt/maven
把maven配置进系统环境变量示例:vim /etc/profile
/etc/profile增加:
export M2_HOME=/opt/maven/apache-maven-3.6.2
export CLASSPATH=$CLASSPATH:$M2_HOME/lib
export PATH=$PATH:$M2_HOME/bin
配置maven的库指向alibaba的库、及配置库的路径的conf/settings.xml示例:
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
<localRepository>/opt/maven/repository</localRepository>
3、安装 gitlab-runner,参考文档:https://docs.gitlab.com/runner/install/
ubuntu系统:https://docs.gitlab.com/runner/install/linux-repository.html
命令示例:
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
sudo apt-get install gitlab-runner
安装成功的检查示例:gitlab-runner --help
安装成功之后,在/home目录会创建一gitlab-runner的用户,拉取的代码、临时编译文件在目录:/home/gitlab-runner/builds。
4、授权目录权限给gitlab-runner用户。
示例:
chmod 777 /opt/maven/repository
【注:对应的部署项目的路径,优先放在 /home/gitlab-runner/目录,这样减少授权目录权限给gitlab-runner用户的操作。
操作/home/gitlab-runner/目录时,应该使用gitlab-runner用户进行操作。执行命令: su gitlab-runner】
四、注册gitlab-runner
参考文档:https://docs.gitlab.com/runner/register/
1、查看项目的注册码
gitlab的项目路径-->Settings-->CI/CD-->Runnber-->Specific Runners-->registration token。如下图。
2、在部署机gitlab-runner使用注册码向gitlab服务器登记
命令示例:sudo gitlab-runner register
其中tags的名字,是将来告诉部署命令,要不要这台机器跑的标识。参考文档:https://docs.gitlab.com/ee/ci/runners/README.html#using-tags
示例:
Please enter the gitlab-ci coordinator URL (e.g.https://gitlab.com/):http://IP
Please enter the gitlab-ci token for this runner: 注册码,registration token
Please enter the gitlab-ci description for this runner: 运行器描述,如electrumCommon_Formal
Please enter the gitlab-ci tags for this runner (comma separated):运行器标签名称 projectElectrumCommon-formal-20191029
Please enter the executor: docker, parallels, ssh, virtualbox, docker+machine, kubernetes, custom, docker-ssh, shell, docker-ssh+machine: shell
【执行器选择shell。将来优先考虑使用docker,使用docker比较方便】
3、注册完成之后,可以在 gitlab的项目路径-->Settings-->CI/CD-->Runnber-->Specific Runners看到。
【删除注册:
第一步,在服务器上使用命令取消: sudo gitlab-runner unregister --all-runners
或 sudo gitlab-runner list
sudo gitlab-runner unregister -n 名称
第二步,在gitLab管理页面-setting/CICD/找到runner,检查对应的注册是否存在】
五、编写部署命令。【gitlab的pipeline的流水线任务文件.gitlab-ci.yml】
参考文档:
yml文档:https://docs.gitlab.com/ee/ci/yaml/README.html
SpringBoot示例:https://docs.gitlab.com/ee/ci/examples/deploy_spring_boot_to_cloud_foundry/
java Maven示例:https://docs.gitlab.com/ee/ci/examples/artifactory_and_gitlab/
1、流水线任务文件的原理:
甲、分为一个一个stage(阶段)进行执行。 一个阶段执行成功之后,才会执行下一个阶段。
乙、一个阶段,由一组命令组成。
2、添加.gitlab-ci.yml文件示例:
在项目目录下创建文件.gitlab-ci.yml
git add .gitlab-ci.yml
git commit -m "add .gitlab-ci.yml"
git push origin master
3、单个项目,只打包的操作,区分多个部署环境,
说明:
stage: 阶段名称
tags:
- 向gitlab注册runner时的tag标签
before_script:
- 执行script前执行的script
script:
- mvn $MAVEN_CLI_OPTS clean package -Dmaven.test.skip=true 【mvn清除】
- mvn $MAVEN_CLI_OPTS compile 【mvn编译】
- mvn $MAVEN_CLI_OPTS install -DskipTests -Djar -e -Dmaven.test.skip=true 【mvn安装打包】
after_script:
- 执行script后执行的script
only:
refs:
- formal 【表示仅在formal分支有提交代码的操作之后执行】
网络请求触发示例:https://gitlab.example.com/api/v4/projects/9/ref/master/trigger/pipeline?token=TOKEN
预定义的环境变量:Predefined environment variables reference
$CI_COMMIT_REF_NAME 提交时的分支名
$CI_PROJECT_DIR 源代码所在目录
$CI_COMMIT_BEFORE_SHA 前一个提交编号
$CI_COMMIT_REF_NAME 分支或标签名称
解决:
The job is stuck because your runners have tags but your jobs don't.。
set tags to your jobs.
https://docs.gitlab.com/ee/ci/yaml/#tags
job内定义作业流程的参数列表
Keyword | Required | Description |
yes | 定义在runner中执行的命令 | |
no | Defines a configuration entry that this job is going to inherit from | |
no | Defines a configuration entry that allows this job to include external YAML files | |
no | Use docker image, covered inUsing Docker Images | |
no | Use docker services, covered inUsing Docker Images | |
no | 定义job属于哪个阶段,默认test阶段 | |
type | no | stage别名 |
no | 定义job层次的变量 | |
no | 定义哪些分支或tag的修改触发该流程 | |
no | 定义哪些分支或tag的修改不触发该流程 | |
no | 定义哪个标签的runner来执行,该标签指runner配置时的名称,不是Git的tag分支 | |
no | Allow job to fail. Failed job doesn’t contribute to commit status | |
no | Define when to run job. Can be on_success, on_failure, always or manual | |
no | 定义该job依赖于哪项job的结果,用于把之前job的附件传进来 | |
no | 定义job产生的附件,可用于下载和保存以及传递,没有该项设置产生的过程文件都会被删除 | |
no | 定义缓存的文件或文件夹,如果是在job外定义则为全局变量 | |
no | 定义job执行前的操作 | |
no | 定义job执行后的操作 | |
no | Defines a name of environment to which deployment is done by this job | |
no | Define code coverage settings for a given job | |
no | 定义任务失败后的重复执行次数或时间 | |
no | 定义并行的任务数量,限于2~50 | |
no | Defines a downstream pipeline trigger |
坑:
坑一:tags 不能填两个。 坑址:https://gitlab.com/gitlab-org/gitlab-runner/issues/4056
解决途径:https://stackoverflow.com/questions/49198663/answer/submit