创建devops项目
创建项目-创建流水线
创建流水线,
- 如果自己工程有可以Jenkinsfile,可以直接根据Jenkinsfile创建流水线
- 新建流水线的各个stage
我们这里先演示无Jenkinsfile的情况
参数设置--可以不修改,默认就好
点击创建,可以看到我们新建的流水线
点击流水线-编辑流水线-选择一个模板,我们这里选择第二个模板(不选也可以)
编辑流水线第一阶段
- 编辑名称-拉取代码
- 代理,我们这里不需要,选择none
- 条件-不需要条件
- 指定容器-maven
- 添加第一个嵌套命令-git-拉取代码-如果是私有仓库,需要新建凭证,使用凭证
- 添加第二个嵌套名称-shell- ls-alh 查看代码是否拉下来
- 运行流水线,查看第一个阶段,是否正确执行
通过查看日志,我们可以看到git仓库里的代码已经正常拉取下来了 编辑流水线第二阶段
- 第二个阶段命名为代码编译打包
- 不需要代理,代理类型选择none
- 不需要条件
- 指定容器为maven
- 添加第一条嵌套命令shell命令 ls -alh 查看第二阶段是否能正常拿到代码
- 添加第二条shell命令 mvn clean package -Dmaven.test.skip=true 将项目编译打包
- 添加第三条shell命令 ls -alh ./target 查看是否正常打成jar包
- 保存-运行流水线
可以看到第二阶段也执行正常,打出了相应的jar包
编辑流水线第三阶段
Dockerfile
FROM openjdk:8-jdk
LABEL maintainer=cc
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
COPY target/*.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
- 提前准备好Dockerfile文件,用于构建docker镜像(不知道怎么写docker镜像的,可以直接复制我的,或者到网上搜一个自己改改)
- 名称-构建镜像
- 代理选择none
- 不需要添加条件
- 指定容器-maven
- 添加第一条嵌套命令-shell命令-构建镜像 docker build -t test:1.0 -f Dockerfile .(注意末尾的这个.)
- 添加第二条嵌套命令-shell命令- docker images查看镜像是否构成
- 保存-运行流水线
- 运行流水线如果需要输什么参数,随便输一个字符串就行
这里可以看到,test的docker镜像已经构成,版本号为1.0
编辑流水线第四阶段
这一步的主要功能是将镜像推送到远程镜像仓库,方便集群部署拉取镜像,我们这里选择阿里云的镜像仓库
阿里云-产品与服务-容器镜像服务-开通镜像服务个人版(免费)-创建一个命名空间(我创建的cc-abc)
这时候我们可以看一下Jenkinsfile长啥样了
pipeline {
agent {
node {
label 'maven'
}
}
stages {
stage('拉取代码') {
agent none
steps {
container('maven') {
git(url: 'https://gitee.com/cc847417630/devops_test.git', credentialsId: 'gitee-id', branch: 'master', changelog: true, poll: false)
sh 'ls -alh'
}
}
}
stage('代码编译打包') {
agent none
steps {
container('maven') {
sh 'ls -alh'
sh 'mvn clean package -Dmaven.test.skip=true'
sh 'ls -alh ./target'
}
}
}
stage('构建镜像') {
agent none
steps {
container('maven') {
sh 'docker build -t test:1.0 -f Dockerfile .'
sh 'docker images'
}
}
}
stage('推送镜像') {
agent none
steps {
container('maven') {
withCredentials([usernamePassword(credentialsId : 'aliyun-docker1' ,passwordVariable : 'DOCKER_PASSWORD_VAR' ,usernameVariable : 'DOCKER_USER_VAR' ,)]) {
sh 'echo "$DOCKER_PASSWORD_VAR"|docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'
sh 'docker tag test:1.0 $REGISTRY/$DOCKERHUB_NAMESPACE/test:$BUILD_NUMBER'
sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/test:$BUILD_NUMBER'
}
}
}
}
stage('deploy to dev') {
steps {
input(id: 'deploy-to-dev', message: 'deploy to dev?')
kubernetesDeploy(configs: 'deploy/dev-ol/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")
}
}
stage('deploy to production') {
steps {
input(id: 'deploy-to-production', message: 'deploy to production?')
kubernetesDeploy(configs: 'deploy/prod-ol/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")
}
}
}
environment {
DOCKER_CREDENTIAL_ID = 'dockerhub-id'
GITHUB_CREDENTIAL_ID = 'github-id'
KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'
REGISTRY = 'registry.cn-heyuan.aliyuncs.com'
DOCKERHUB_NAMESPACE = 'cc-abc'
GITHUB_ACCOUNT = 'kubesphere'
APP_NAME = 'devops-java-sample'
}
parameters {
string(name: 'TAG_NAME', defaultValue: '', description: '')
}
}
可以看到Jenkinsfile中就是我建立流水线中的相关流程
- 每一个流水线步骤就是一个stage
- environment中包含全局可以访问的变量
查看阿里云镜像仓库的访问凭证,将environment中的值进行替换(替换推送地址和命名空间)
由于阿里云镜像仓库是私有地址,需要用户名密码进行访问,才能正确推,并将用户名和密码存储到相应的变量中,方便书写Jenkinsfile文件
第四阶段的Jenkinsfile
stage('推送镜像') {
agent none
when {
branch 'master'
}
steps {
container('maven') {
withCredentials([usernamePassword(credentialsId : 'aliyun-docker1' ,passwordVariable : 'DOCKER_PASSWORD_VAR' ,usernameVariable : 'DOCKER_USER_VAR' ,)]) {
sh 'echo "$DOCKER_PASSWORD_VAR"|docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'
sh 'docker tag test:1.0 $REGISTRY/$DOCKERHUB_NAMESPACE/test:$BUILD_NUMBER'
sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/test:$BUILD_NUMBER'
}
}
}
}
- 主要包含三个步骤,但是都是在密码认证中完成的
- 第一个嵌套命令是进行阿里云登录
- 第二个嵌套命令是将我们的本地镜像重新命令为阿里云要求的镜像格式 $BUILD_NUMBER可以取出当前是第几次构建流水线,作为版本号
- 第三个命令为将镜像推送到阿里云远程仓库
- 保存并运行流水线
可以看到镜像已经成功推上阿里云仓库 编辑流水线第五步
这一步的主要作用是将服务进行部署
首先,先在企业空间下创建一个工程,我们这里叫pro-cc-abc吧
在代码中,编写一个*.yaml文件,用于部署服务(没有的可以使用我这个,可以试着阅读一下,需要替换app名称和命名空间)
使用过k8s的人应该知道,在k8s集群中创建服务可以使用 kubectl apply -f *.yaml
deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: dtest
name: test
namespace: pro-cc-abc #一定要写名称空间,我们这里叫pro-cc-abc
spec:
progressDeadlineSeconds: 600
replicas: 1
selector:
matchLabels:
app: test
strategy:
rollingUpdate:
maxSurge: 50%
maxUnavailable: 50%
type: RollingUpdate
template:
metadata:
labels:
app: test
spec:
imagePullSecrets:
- name: aliyun-docker-hub #提前在项目下配置访问阿里云的账号密码
containers:
- image: $REGISTRY/$DOCKERHUB_NAMESPACE/test:$BUILD_NUMBER
imagePullPolicy: Always
name: app
ports:
- containerPort: 8080
protocol: TCP
resources:
limits:
cpu: 300m
memory: 600Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
terminationGracePeriodSeconds: 30
---
apiVersion: v1
kind: Service
metadata:
labels:
app: test
name: test
namespace: pro1
spec:
ports:
- name: http
port: 8080
protocol: TCP
targetPort: 8080
nodePort: 32000 #这里可以指定一个你的服务想对外暴露的端口,原则上使用30000-32670之间
selector:
app: test
sessionAffinity: None
type: NodePort
先要提前在项目中创建一个凭证
工程管理-凭证-创建凭证
- 凭证ID demo-kubeconfig
- 类型 kubeconfig
- content 默认就好
保存运行
可以看到项目以及部署完成
在浏览器中访问相应服务可以正常访问
实现代码提交到流水线自动运行的最后一步
配置webhooks
码云-仓库-管理-webhooks-添加
http://139.198.9.89:30880/devops_webhook/git/?url=https://gitee.com/cc847417630/devops_test.git
修改代码-提交到git仓库-自动部署
恭喜你,已经学会使用devops部署一个简单的应用了!!!