前面几篇文章介绍了关于Docker.Gitlab.Harbor等常用软件的安装,安装只是为了了解各个组件,现如今各大云厂商已经将这些工具封装,购买对应云服务后只需要点点点对应复制粘贴即可发布项目到对应服务器.但是使用之前还是需要学习工具的使用以便更好的了解编译发布的过程.
1.配置Jenkins
1.1登录并配置Jenkins.
#查看并输入密码以登录进行后续配置
cat /var/lib/jenkins/secrets/initialAdminPassword
1.2插件安装
这里由于插件很多是拉取国外镜像,所以会出现安装失败的情况,所以我们点击选择插件安装,后续安装需要的插件,并且只勾选languages中的简体中文语言包(部分汉化),然后等待安装完成.
1.3创建管理员用户
1.4配置URL(根据需要配置即可,用作学习可直接保存)
1.5开始界面
1.6 安装常用的插件(也可安装时直接安装推荐插件,可能会因为国外源的问题失败)
#选择Dashboard-Manage Jenkins-插件管理
Locale plugin
Git
Pipeline
Credentials Binding
Localization: Chinese(Simplified)
Publish Over SSH
1.7配置Java,Maven,Nodejs等环境
#jdk配置(测试项目jdk需要17,可安装多个版本,创建项目时指定jdk版本)
#maven
#nodejs配置
1.8gitlab/harbor证书配置
1.8.1gitlab证书配置
#gitlab机器上生成公钥和密钥(一直回车即可)
# jenkins创建credentials证书,类型选择SSH Username with private key
1.8.2harbor仓库配置
#类型选择password登录
2.实现流水线发布
这里我们开始发布项目,使用的工具有Jenkins、Harbor、Docker、Ansible
2.1发布Nodejs项目(这辣鸡人生一秒也不想待了:人生重开器)
2.1.1gitlab创建项目
2.1.2项目拉取到本地并创建流水线文件
#将项目克隆到本地,下载人生重开demo并解压到ty-nodejs中clear
git clone git@192.168.216.223:ty-devops/ty-nodejs.git
unzip master.zip -C ty-nodejs/
cd ty-nodejs/
mkdir /roles/projectname/tasks/
touch /roles/projectname/tasks/main.yml
touch Jenkins hosts site.yml
2.1.3编辑Jenkinsfile.hosts.site.yml.main.yml
#Jenkinsfile(脚本式)
pipeline {
agent any
environment {
serviceName = "lifeRestart"
imageName = "harbor.tonystark.com/library/${env.JOB_NAME}:v${env.BUILD_NUMBER}"
port = "8078"
}
tools {
nodejs "nodejs"
}
stages {
stage('Cleanup Workspace') {
steps {
sh "rm -rf * "
}
}
stage('Preparation codes') {
steps {
git branch: 'main', credentialsId: 'f7034f86-8197-4787-a3d6-c12146e04908', url: 'git@192.168.216.223:ty-devops/ty-nodejs.git'
}
}
stage('Build dockerimage') {
steps {
sh """
sed -i 's#serviceName#${serviceName}#g' ${WORKSPACE}/Dockerfile
echo `pwd`
echo `env.JOB_NAME`
ls
"""
script {
def image = docker.build("${imageName}","--no-cache --rm -f ${WORKSPACE}/Dockerfile ${WORKSPACE}")
docker.withRegistry('http://harbor.tonystark.com', '0391b630-336d-489c-a077-db2813e19b20') {
image.push()
}
}
}
}
stage('Build ansible-playbook') {
steps {
script {
sh """
rm -rf roles/${serviceName} # 清理release
mv roles/projectname roles/${serviceName}
sed -i 's/\\(projectname: \\).*/\\1${serviceName}/' site.yml
sed -i 's/\\(container: \\).*/\\1${env.JOB_NAME}/' site.yml
sed -i 's#\\(image: \\).*#\\1${imageName}#' site.yml
sed -i 's#\\(exposeport: \\).*#\\1${port}#' site.yml
echo 'Cleanup history docker image' && docker rmi ${imageName}
"""
}
}
}
stage('Deploy To Remote Host') {
steps {
script {
sh "ansible-playbook -i hosts site.yml"
}
}
}
}
}
#hosts
vim hosts
[lifeRestart]
192.168.216.224
#site.yml
---
- name: Deploy {{ projectname }} to remote hosts
hosts: all
vars:
user: jenkins
image: image
exposeport: port
container: container
projectname: projectname
remote_user: '{{ user }}'
gather_facts: false
roles:
- '{{ projectname }}'
#main.yml
---
- name: pull an image
docker_image:
name: '{{ image }}'
- name: run a container
docker_container:
name: '{{ container }}'
image: '{{ image }}'
ports:
- '{{ exposeport }}:8080'
state: started
restart: yes
restart_policy: always
2.1.4推送到gitlab
git add -A
git commit -m 'xxx'
git push -u origin main
2.1.5创建pipeline流水线
2.1.6配置流水线
2.1.7测试发布
2.1.8测试nodejs项目是否发布成功
http://192.168.216.224:8078/public/index.html
2.2发布Java项目
2.2.1gitlab创建项目(参考2.1.1)并拉取到本地添加配置文件
https://codeload.github.com/spring-projects/spring-petclinic/zip/refs/heads/main
git clone git@192.168.216.223:ty-devops/ty-nodejs.git
unzip spring-petclinic-main.zip -C ty-java/
cd ty-java/
mkdir /roles/projectname/tasks/
touch /roles/projectname/tasks/main.yml
touch Jenkins hosts site.yml
2.2.2编辑Jenkinsfile.hosts.site.yml.main.yml
#Jenkinsfile(声明式)
node {
def serviceName = "spring-petclinic"
def port = "8077"
def mvnHome
stage('Tools') {
mvnHome = tool 'M3'
}
stage('Cleanup Workspace') {
sh "rm -rf * "
}
stage('Preparation codes') {
git branch: 'main', credentialsId: 'f7034f86-8197-4787-a3d6-c12146e04908', url: 'git@192.168.216.223:ty-devops/ty-java.git'
}
stage('Maven Build') {
sh "'${mvnHome}/bin/mvn' -Dmaven.test.failure.ignore -B -f complete/pom.xml clean package"
}
script {
imageName = "harbor.tonystark.com/library/${env.JOB_NAME}:v${env.BUILD_NUMBER}"
def image = docker.build("${imageName}","--no-cache --rm -f ${WORKSPACE}/Dockerfile ${WORKSPACE}")
docker.withRegistry('https://harbor.tonystark.com', '0391b630-336d-489c-a077-db2813e19b20') {
image.push()
}
}
stage('Build Ansible job') {
sh """
rm -rf roles/${serviceName} # 清理release
mv roles/projectname roles/${serviceName}
sed -i 's/\\(projectname: \\).*/\\1${serviceName}/' site.yml
sed -i 's/\\(container: \\).*/\\1${env.JOB_NAME}/' site.yml
sed -i 's#\\(image: \\).*#\\1${imageName}#' site.yml
sed -i 's#\\(exposeport: \\).*#\\1${port}#' site.yml
echo 'Cleanup history docker image' && docker rmi ${imageName}
"""
}
stage('Deploy') {
sh "ansible-playbook -i hosts site.yml"
}
}
#hosts
同上配置文件就不再重复了
#site.yml
---
- name: Deploy {{ projectname }} to remote hosts
hosts: all
vars:
user: jenkins
image: image
exposeport: port
container: container
projectname: projectname
remote_user: '{{ user }}'
gather_facts: false
roles:
- '{{ projectname }}'
#main.yml
---
- name: pull an image
docker_image:
name: '{{ image }}'
- name: run a container
docker_container:
name: '{{ container }}'
image: '{{ image }}'
ports:
- '{{ exposeport }}:8080'
state: started
restart: yes
restart_policy: always
2.2.3创建pipeline并配置流水线
#参考nodejs项目就不再赘述
2.2.4测试发布(第一次编译时间可能较长需要拉取较多jar包)
#后续将继续更新k8s相关内容