首页
About Me
Search
1
linuxea:gitlab-ci之docker镜像质量品质报告
49,484 阅读
2
linuxea:如何复现查看docker run参数命令
23,649 阅读
3
Graylog收集文件日志实例
18,633 阅读
4
linuxea:jenkins+pipeline+gitlab+ansible快速安装配置(1)
18,423 阅读
5
git+jenkins发布和回滚示例
18,235 阅读
ops
Openppn
Sys Basics
rsync
Mail
NFS
Other
Network
HeartBeat
server 08
Code
Awk
Shell
Python
Golang
vue
virtualization
KVM
Docker
openstack
Xen
kubernetes
kubernetes-cni
Service Mesh
Data
Mariadb
PostgreSQL
MongoDB
Redis
MQ
Ceph
TimescaleDB
kafka
surveillance system
zabbix
ELK Stack/logs
Open-Falcon
Prometheus
victoriaMetrics
Web
apache
Tomcat
Nginx
自动化
Puppet
Ansible
saltstack
Proxy
HAproxy
Lvs
varnish
更多
互联咨询
最后的净土
软件交付
持续集成
gitops
devops
登录
Search
标签搜索
kubernetes
docker
zabbix
Golang
mariadb
持续集成工具
白话容器
elk
linux基础
nginx
dockerfile
Gitlab-ci/cd
最后的净土
基础命令
gitops
jenkins
docker-compose
Istio
haproxy
saltstack
marksugar
累计撰写
667
篇文章
累计收到
111
条评论
首页
栏目
ops
Openppn
Sys Basics
rsync
Mail
NFS
Other
Network
HeartBeat
server 08
Code
Awk
Shell
Python
Golang
vue
virtualization
KVM
Docker
openstack
Xen
kubernetes
kubernetes-cni
Service Mesh
Data
Mariadb
PostgreSQL
MongoDB
Redis
MQ
Ceph
TimescaleDB
kafka
surveillance system
zabbix
ELK Stack/logs
Open-Falcon
Prometheus
victoriaMetrics
Web
apache
Tomcat
Nginx
自动化
Puppet
Ansible
saltstack
Proxy
HAproxy
Lvs
varnish
更多
互联咨询
最后的净土
软件交付
持续集成
gitops
devops
页面
About Me
搜索到
19
篇与
的结果
2018-07-02
linuxea:gitlab-ci/cd Dependency依赖扫描两种方式 (五)
Dependency如果正在使用GitLab CI / CD,则可以使用依赖项扫描来分析已知漏洞的依赖关系,方法是将CI作业包含在现有.gitlab-ci.yml文件中,或使用Auto DevOps 提供的自动依赖项扫描 依赖扫描参考:https://docs.gitlab.com/ee/user/project/merge_requests/dependency_scanning.html https://docs.gitlab.com/ee/ci/examples/dependency_scanning.html使用dependency-scanning替代Dependency-Check,我顺便介绍下Dependency-Check,在后面https://github.com/jeremylong/DependencyCheck支持的语言和包管理器The following table shows which languages and package managers are supported and which tools are used.JavaScript (npm, yarn) --->> gemnasium, Retire.jsPython (pip)--->> gemnasium Ruby (gem)--->> gemnasium, bundler-auditJava (Maven) --->> gemnasiumPHP (Composer) --->> gemnasium集成GitLab# 依赖扫描 4/8 dependency-scanning: <<: *job_docker_group script: - export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/') - docker run --rm --env DEP_SCAN_DISABLE_REMOTE_CHECKS="${DEP_SCAN_DISABLE_REMOTE_CHECKS:-false}" --volume "$PWD:/code" --volume /etc/localtime:/etc/localtime:ro --volume /var/run/docker.sock:/var/run/docker.sock "registry.gitlab.com/gitlab-org/security-products/dependency-scanning:$SP_VERSION" /code - date artifacts: paths: [gl-dependency-scanning-report.json] # except: # variables: # - $CONTAINER_SCANNING_DISABLEso,在gitlab官网提供的镜像中,很明显的这个报:Source code language/dependency manager is not yet supported for analyze Dependency-Check假如你觉得上面的那个不好用,没关系,还可以用Dependency-CheckDependency-Check是一种软件组合分析(SCA)工具,它试图检测项目依赖项中包含的公开披露的漏洞。它通过确定给定依赖项是否存在公共平台枚举(CPE)标识符来完成此操作。如果找到,它将生成链接到相关CVE条目的报告。文档和生产二进制版本的链接可以在github页面上找到。此外,关于体系结构的更多信息和扩展依赖性检查的方法可以在wiki上找到。目前,支持Java和.NET; 针对Ruby,Node.js,Python以及对C / C ++构建系统(autoconf和cmake)的有限支持已添加额外的实验支持 参考:https://jeremylong.github.io/DependencyCheck/dependency-check-cli/index.html原本的docker脚本如下:#!/bin/sh OWASPDC_DIRECTORY=$HOME/OWASP-Dependency-Check DATA_DIRECTORY="$OWASPDC_DIRECTORY/data" REPORT_DIRECTORY="$OWASPDC_DIRECTORY/reports" if [ ! -d "$DATA_DIRECTORY" ]; then echo "Initially creating persistent directories" mkdir -p "$DATA_DIRECTORY" chmod -R 777 "$DATA_DIRECTORY" mkdir -p "$REPORT_DIRECTORY" chmod -R 777 "$REPORT_DIRECTORY" fi # Make sure we are using the latest version docker pull owasp/dependency-check docker run --rm \ --volume $(pwd):/src \ --volume "$DATA_DIRECTORY":/usr/share/dependency-check/data \ --volume "$REPORT_DIRECTORY":/report \ owasp/dependency-check \ --scan /src \ --format "ALL" \ --project "My OWASP Dependency Check Project" \ --out /report # Use suppression like this: (/src == $pwd) # --suppression "/src/security/dependency-check-suppression.xml"ok,我们修改下集成到gitlab里面(当然,提前pull镜像 docker pull owasp/dependency-check)集成GitLab注意:这里有个权限问题gitlab-runner ALL=(root)NOPASSWD:/bin/chown,/bin/mkdir,/bin/chmod 5/8 dependency-check: stage: code-check script: - export OWASPDC_DIRECTORY=$PWD/OWASP-Dependency-Check - export DATA_DIRECTORY=$OWASPDC_DIRECTORY/data - export REPORT_DIRECTORY=$OWASPDC_DIRECTORY/reports - '[[ ! -d "$DATA_DIRECTORY" ]] || echo "Initially creating persistent directories" && mkdir -p "$DATA_DIRECTORY" && sudo chmod -R 777 "$DATA_DIRECTORY" && mkdir -p "$REPORT_DIRECTORY" && sudo chmod -R 777 "$REPORT_DIRECTORY"' - docker run --rm --volume $(pwd):/src --volume "$DATA_DIRECTORY":/usr/share/dependency-check/data --volume "$REPORT_DIRECTORY":/report "owasp/dependency-check" --scan /src --format "ALL" --project "My OWASP Dependency Check Project" --out /report - cp OWASP-Dependency-Check/reports/dependency-check-report.json $PWD/dependency-check-report.json - sudo chown -R gitlab-runner.gitlab-runner ${PWD} - date artifacts: paths: - dependency-check-report.json - OWASP-Dependency-Check/reports/试着运行一次这里会产生几个文件[gitlab-runner@linuxea-VM-Node_10_10_240_145 linuxea]$ ll OWASP-Dependency-Check/reports/ 总用量 272 -rw-r--r-- 1 gitlab-runner gitlab-runner 223 7月 1 21:09 dependency-check-report.csv -rw-r--r-- 1 gitlab-runner gitlab-runner 139030 7月 1 21:09 dependency-check-report.html -rw-r--r-- 1 gitlab-runner gitlab-runner 12086 7月 1 21:09 dependency-check-report.json -rw-r--r-- 1 gitlab-runner gitlab-runner 8964 7月 1 21:09 dependency-check-report.xml -rw-r--r-- 1 gitlab-runner gitlab-runner 110002 7月 1 21:09 dependency-check-vulnerability.html [gitlab-runner@DS-VM-Node_10_10_240_145 linuxea]$ 下载下来即可查看打开dependency-check-report.html,如下图:点击:Display: Showing Vulnerable Dependencies (click to show all) 即可查看
2018年07月02日
6,361 阅读
0 评论
0 点赞
2018-07-01
linuxea:gitlab-ci/cd SAST静态应用安全测试集成 (四)
SASTSAST全拼Static Application Security Testing(静态应用安全测试)下表显示支持哪些语言,软件包管理器和框架以及使用哪些工具。C/C++ ---->> FlawfinderPython (pip) ---->> banditRuby on Rails ---->> brakeman Java (Maven and Gradle) ---->> find-sec-bugsScala (sbt) ---->> find-sec-bugsGo (experimental) ---->> Go AST Scanner PHP ---->> phpcs-security-audit.NET ---->> Security Code ScanNode.js ---->> NodeJsScan集成GitLab首先,需要GitLab Runner和docker-in-docker执行程序。然后你可以添加一个新的工作.gitlab-ci.yml,称为sast:sast: image: docker:stable variables: DOCKER_DRIVER: overlay2 allow_failure: true services: - docker:stable-dind script: - export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/') - docker run --env SAST_CONFIDENCE_LEVEL="${SAST_CONFIDENCE_LEVEL:-3}" --volume "$PWD:/code" --volume /var/run/docker.sock:/var/run/docker.sock "registry.gitlab.com/gitlab-org/security-products/sast:$SP_VERSION" /app/bin/run /code artifacts: paths: [gl-sast-report.json]我们把他写入到我的.gitlab-ci.yml中它会自动扫描并且匹配扫描工具,这意味着会去下载相应的镜像,请注意,如果镜像太大,可能失败,使用docker pull会更有用4/4 sast: <<: *job_Static_code script: - export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/') - docker run --rm --env SAST_CONFIDENCE_LEVEL="${SAST_CONFIDENCE_LEVEL:-3}" --volume "$PWD":/code --volume /etc/localtime:/etc/localtime:ro --volume /var/run/docker.sock:/var/run/docker.sock "registry.gitlab.com/gitlab-org/security-products/sast:${SP_VERSION}" /app/bin/run /code - date artifacts: paths: [gl-sast-report.json] 注意当运行的时候会检测代码并且去拉去相应的镜像服务,并且up,这个过程建议提前拉取镜像,如果检测是java则拉find-sec-bugs,php则会phpcs-security-audit,如下:registry.gitlab.com/gitlab-org/security-products/analyzers/phpcs-security-audit 10-8-stable deb0ae7639e1 6 weeks ago 402MB registry.gitlab.com/gitlab-org/security-products/analyzers/find-sec-bugs 10-8-stable 8e096a39d6d1 6 weeks ago 775MB当然,为了缩短运行的时间,也可以参考Scan tool中的名称提前拉取镜像一旦Up起来就会运行起容器[gitlab-runner@linuxea-vm-Node_10_10_240_145 ~/builds/8b5e86c3/0/root/linuxea]$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a6206abd0b3a registry.gitlab.com/gitlab-org/security-products/analyzers/bandit:10-8-stable "/analyzer run" 1 second ago Created dreamy_lichterman d0ecf28d2de5 registry.gitlab.com/gitlab-org/security-products/sast:10-8-stable "/app/bin/run /code" 4 seconds ago Up 3 seconds upbeat_blackwell [gitlab-runner@linuxea-vm-Node_10_10_240_145 ~/builds/8b5e86c3/0/root/linuxea]$ 测试提交代码后测试(php的代码)[gitlab-runner@linuxea-vm-Node_10_10_240_145 ~/builds/8b5e86c3/0/root/linuxea]$ ll -sh gl-sast-report.json 60K -rw-r--r-- 1 gitlab-runner gitlab-runner 58K 6月 26 10:48 gl-sast-report.json [gitlab-runner@linuxea-vm-Node_10_10_240_145 ~/builds/8b5e86c3/0/root/linuxea]$ gitlab官方文档参考:https://docs.gitlab.com/ee/ci/examples/sast.html仓库:https://gitlab.com/gitlab-org/security-products/sast在页面中下载json
2018年07月01日
4,079 阅读
0 评论
0 点赞
2018-06-25
linuxea:gitlab-ci/cd sonarqube和codequality初探 (三)
gitlab-ci使用code climate,借鉴一些案列做增量的方式,并且我们试着加入sonarcode climatecode climate是对GitHub和GitHub Enterprise做自动化代码审查 ,包括静态分析和测试覆盖率数据项,这些可以纳入整个开发流程中,如ci。通过有效的配置,在每次提交代码时候做出代码审查,减少错误,提高质量和测试覆盖率,他有辅助的浏览器插件支持,对Ruby,PHP,JavaScript和Python代码提供了高质量分析。并且它是可灵活配置的,并且也可以与jenkins CI build。长期支持:RubyPythonPHPJavaScriptJavaTypeScriptGoLangSwift并且提供了大量的插件:https://docs.codeclimate.com/docs/list-of-engines商业/开源开源:https://codeclimate.com/oss/gitlab and github :https://github.com/codeclimate/codeclimate官网:https://codeclimate.com/sonarqubesonarqube支持20多种编程语言,有长期维护的稳定版,可以对代码做质量检查,通过静态分析自动检查变成语言中的错误,异常以及安全漏洞,并且提供重复代码,编码标准,单元测试等报告。提供对Maven,ant,Gradle和持续集成工具的全自动分析提供支持sonarqube官网:https://www.sonarqube.org/相比较sonarqube和code climate,后者更适合小公司使用,前者在近年来的发展特别快,支持很多,受欢迎程度颇高,非常活跃(终于完成了开场白,纯翻译与收集的信息,个人偏向使用Sonarqube)gitlab-ci/cd devops QQ群:69378829210.0.1.61是sonar10.10.240.202 是pgsqlmysql配置数据库授权(假如有数据库):MariaDB [(none)]> CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci; Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> CREATE USER 'sonar' IDENTIFIED BY 'sonar'; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> GRANT ALL ON sonar.* TO 'sonar'@'10.0.1.61' IDENTIFIED BY 'sonar'; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec)下载sonarqubedownloads : https://www.sonarqube.org/downloads/[root@linuxea-VM-Node61 ~]# unzip sonarqube-7.1.zip [root@linuxea-VM-Node61 ~]# mv sonarqube-7.1 /usr/local/sonarqube sed -i 's/#sonar.web.host=0.0.0.0/sonar.web.host=0.0.0.0/g' /usr/local/sonarqube/conf/sonar.properties sed -i 's/#sonar.web.port=9000/sonar.web.port=9009/g' /usr/local/sonarqube/conf/sonar.properties sed -i 's/#sonar.jdbc.username=/sonar.jdbc.username=sonar/g' /usr/local/sonarqube/conf/sonar.properties sed -i 's/#sonar.jdbc.password=/sonar.jdbc.password=sonar/g' /usr/local/sonarqube/conf/sonar.properties echo 'sonar.jdbc.url=jdbc:mysql://10.10.240.203:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance' >> /usr/local/sonarqube/conf/sonar.properties sonar.jdbc.url=jdbc:mysql://10.10.240.203:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformancemysql需要5.6以上,我们使用postgresqlpostgresql安装在关系型数据库中SQLite and mysql and postgresql中后者相对是最新的,符合SQL的开源目标-RDBMS,但是mysql最受欢迎,普遍成都上使用较高,在mysql被收购后的mariadb更值得期待,但是在并发读写的问题上会有很多问题,但是在更新后相差不多postgresql对数据的可靠性非常高,底层技术决定了pgsql可以快速有效的处理。由于实现了多版本并发控制(MVCC),它还确保了ACID的兼容性,因此不需要读锁就能实现对并发的支持。mysql只在innodb支持MVCC,mysql支持json索引,只支持数据类型,pgsql支持nosql/json等,但是postgresql配置更复杂。ok,其实只是sonarqube官网推荐使用postgresql,我还是言归正传吧(编不下去了)!downloadyum安装下载页面:https://www.postgresql.org/download/linux/redhat/二进制安装页面:https://www.enterprisedb.com/download-postgresql-binaries[root@linuxea-VM-Node202 ~]# wget https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-2.noarch.rpm [root@linuxea-VM-Node202 ~]# yum localinstall pgdg-centos10-10-2.noarch.rpm -y [root@linuxea-VM-Node202 ~]# yum install postgresql10-server postgresql10 -y [root@linuxea-VM-Node202 ~]# /usr/pgsql-10/bin/postgresql-10-setup initdb Initializing database ... OK [root@linuxea-VM-Node202 ~]# systemctl enable postgresql-10 Created symlink from /etc/systemd/system/multi-user.target.wants/postgresql-10.service to /usr/lib/systemd/system/postgresql-10.service. [root@linuxea-VM-Node202 ~]# systemctl start postgresql-10useraddpgsql创建数据库:[root@linuxea-VM-Node202 ~]# su postgres bash-4.2$ createuser -P -s -e sonar Enter password for new role: Enter it again: SELECT pg_catalog.set_config('search_path', '', false) CREATE ROLE sonar PASSWORD 'md5b05e02d26b524e4287428984d14a6824' SUPERUSER CREATEDB CREATEROLE INHERIT LOGIN; bash-4.2$ psql psql (10.4) Type "help" for help. postgres=# create database sonar owner=sonar; CREATE DATABASEchange configurepgsql数据库配置修改修改listen_addresses和port,并且添加防火墙放行[root@linuxea-VM-Node202 /var/lib/pgsql/10/data]# sed -i "s/#listen_addresses =.*/listen_addresses = '*'/g" /var/lib/pgsql/10/data/postgresql.conf [root@linuxea-VM-Node202 /var/lib/pgsql/10/data]# sed -i 's/#port =.*/port = 5432/g' /var/lib/pgsql/10/data/postgresql.conf [root@linuxea-VM-Node202 /var/lib/pgsql/10/data]# systemctl restart postgresql-10.service [root@linuxea-VM-Node202 /var/lib/pgsql/10/data]# ss -tlnp|grep postmaster LISTEN 0 224 *:5432 *:* users:(("postmaster",pid=5805,fd=3)) [root@linuxea-VM-Node202 /var/lib/pgsql/10/data]# iptables -I INPUT 6 -s 10.0.1.61 -p tcp -m tcp -m state --state NEW -m multiport --dports 5432 -m comment --comment "psql" -j ACCEPTpgsql配置文件:pgsql配置文件中关注postgresql.conf和pg_hba.conf配置文件[root@linuxea-VM-Node202 /var/lib/pgsql/10/data]# ll /var/lib/pgsql/10/data/*.conf -rw------- 1 postgres postgres 4337 6月 15 14:39 /var/lib/pgsql/10/data/pg_hba.conf -rw------- 1 postgres postgres 1636 6月 15 13:54 /var/lib/pgsql/10/data/pg_ident.conf -rw------- 1 postgres postgres 88 6月 15 13:54 /var/lib/pgsql/10/data/postgresql.auto.conf -rw------- 1 postgres postgres 22678 6月 15 14:40 /var/lib/pgsql/10/data/postgresql.conf [root@linuxea-VM-Node202 /var/lib/pgsql/10/data]# sonarqube configure解压安装ps提示,docker的sonar位置:https://hub.docker.com/_/sonarqube/下载位置:https://www.sonarqube.org/downloads/这里下载的是7.1版本的,并不是长期支持的LTS版本[root@linuxea-VM-Node61 ~]# unzip sonarqube-7.1.zip [root@linuxea-VM-Node61 ~]# mv sonarqube-7.1 /usr/local/sonarqube [root@linuxea-VM-Node61 ~]# cd /usr/local/sonarqube [root@linuxea-VM-Node61 /usr/local/sonarqube]# ln -s bin/linux-x86-64/sonar.sh /etc/init.d/sonar 配置文件示例这里用的是pgsql,需要修改如下[sonar@linuxea-VM-Node61 logs]$ egrep -v "^$|^#" /usr/local/sonarqube/conf/sonar.properties sonar.jdbc.username=sonar sonar.jdbc.password=sonar sonar.jdbc.url=jdbc:postgresql://10.10.240.202/sonar sonar.web.host=0.0.0.0 sonar.web.port=9000 [sonar@linuxea-VM-Node61 logs]$ 创建用户在7.1中的es需要普通用户进行启动,我们进行创建[root@linuxea-VM-Node61 /usr/local/sonarqube]# useradd sonar [root@linuxea-VM-Node61 /usr/local/sonarqube]# chown -R sonar.sonar /usr/local/sonarqube切换到普通用户启动sonar[root@linuxea-VM-Node61 /usr/local/sonarqube]# su sonar [sonar@linuxea-VM-Node61 sonarqube]$ /etc/init.d/sonar start [sonar@linuxea-VM-Node61 sonarqube]$ ps aux|grep sonar root 5556 0.0 0.1 185600 4360 pts/0 S 14:52 0:00 su sonar sonar 5557 0.0 0.1 116580 4612 pts/0 S 14:52 0:00 bash sonar 5806 0.0 0.0 17816 1732 ? Sl 14:53 0:00 /usr/local/sonarqube/bin/linux-x86-64/./wrapper /usr/localE sonar 5808 6.7 2.9 2570324 115016 ? Sl 14:53 0:04 java -Dsonar.wrapped=true -Djava.awt.headless=true -Xms8m p sonar 5846 18.3 19.9 3183096 786808 ? Sl 14:53 0:10 /usr/java/jdk1.8.0_131/jre/bin/java -XX:+UseConcMarkSweepGs sonar 5968 36.4 10.3 3200584 409640 ? Sl 14:53 0:18 /usr/java/jdk1.8.0_131/jre/bin/java -Djava.awt.headless=trs sonar 6025 19.2 7.6 3152668 304016 ? Sl 14:53 0:07 /usr/java/jdk1.8.0_131/jre/bin/java -Djava.awt.headless=trs sonar 6158 0.0 0.0 151036 3712 pts/0 R+ 14:54 0:00 ps aux sonar 6159 0.0 0.0 112672 2144 pts/0 S+ 14:54 0:00 grep --color=auto sonar [sonar@linuxea-VM-Node61 sonarqube]$ 这里需要知道的是,你需要安装jdk的,否则肯定是不行的jdk下载页面:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html日志位置sonar配置文件:如果配置有问题,会体现在web.log中,sonar.log和es.log,请关注[sonar@linuxea-VM-Node61 sonarqube]$ ll /usr/local/sonarqube/logs/ 总用量 220 -rw-r--r-- 1 sonar sonar 0 6月 15 13:33 access.log -rw-r--r-- 1 sonar sonar 4501 6月 15 14:53 ce.log -rw-r--r-- 1 sonar sonar 43248 6月 15 14:53 es.log -rw-r--r-- 1 sonar sonar 88 4月 17 08:14 README.txt -rw-r--r-- 1 sonar sonar 20247 6月 15 14:53 sonar.log -rw-r--r-- 1 sonar sonar 144138 6月 15 14:53 web.log [sonar@linuxea-VM-Node61 sonarqube]$ 启动起来后防火墙也需要开放的开始配置sonar+gitlab打开IP:PORT 用户名admin密码amdin成功登录后安装插件如果中间提示重启,重启即可。开始配置gitlab插件我们需要一个令牌,事实上在第一次启动sonar时候就需要了。这里的个人令牌仍然可以在第一次启动sonar提示的那个配置中生效,如下图所示,点击Create personal access token即可:在打开gitlab中生成这个令牌是要放在sonar中的GvP7GaxopwkoWqy7MZBh在配置sonar回到sonar中,将信息填写到插件当中到此为止,gitlab和sonar已经关联完成集成到ci在gitlab的ci和cd中,官网是推荐用codeclimate,但是在使用过程中下载的速度奇慢,如果你使用的有问题,可参考sonar,后面则使用codeclimate(开源),任选其一即可codeclimate: https://github.com/codeclimate/codeclimate有些权限问题需要提前解决,分别是docker和chown的权限,如果你有其他的,也需要授权[root@linuxea-VM-Node_10_10_240_145 ~]$ usermod -G docker gitlab-runner [root@linuxea-VM-Node_10_10_240_145 ~]$ systemctl restart docker [root@linuxea-VM-Node_10_10_240_145 ~]$ echo "gitlab-runner ALL=(root)NOPASSWD:/bin/chown" >>/etc/sudoerssonar-scanne我们一如既往的使用docker来做,不过,不自己进行编写了build,直接使用现成的集成进去docs : https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scannerdocker:https://github.com/newtmitch/docker-sonar-scannergitlab-ci.yaml的部分说明写入到gitlab-ci.yaml中1,在stages中标记stages: - code-check2,全局变量的使用SONAR_URL: "https://10.0.1.61:9000" SONAR_KN: "sonar-linuxea" SONAR_CFG: "sonar-scanner -Dsonar.host.url=$SONAR_URL -Dsonar.projectKey=$SONAR_KN -Dsonar.projectName=$SONAR_KN -Dsonar.projectBaseDir=/root/src -Dsonar.sources=./ -Dsonar.java.binaries=./"变量标明sonar server地址和端口,projectKey名称,java程序需要加上Dsonar.java.binaries=./sonar-scanner在开始之前,在runner机器上,提前拉取镜像:docker pull newtmitch/sonar-scanner1/2 sonarqube: stage: code-check script: - docker run --rm --volume $(pwd):/root/src --volume /var/run/docker.sock:/var/run/docker.sock "newtmitch/sonar-scanner" $SONAR_CFG - sudo chown -R gitlab-runner.gitlab-runner ${PWD}1/2 sonarqube指的是有两部分,sonarqube为部分之一在script中,将当前目录下的所有都挂载到容器中的root/src下,$SONAR_CFG变量在全局变量中有写明,就是上面的那些参数这里需要注意,sonar-scanner的镜像一定要提前拉取,否则可能会失败测试添加一些错误Condition提交后运行就会发现这些问题在来到sonarqube端这个项目是从github克隆的一个项目测试使用codeclimate(全量)codeclimate的git地址:https://github.com/codeclimate/codeclimatecodeclimate有开源和商业版的,可以关联到github上(https://codeclimate.com/dashboard),并且gitlab官网的教程中是使用codeclimate的,参考:https://docs.gitlab.com/ee/ci/examples/code_climate.html在运行后它会产生一个文件:codeclimate.jsonscript@主要来看script部分,其他的部分参阅官网的手册:https://docs.gitlab.com/ee/ci/yaml/README.htmlexport SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/'):主要获取gitlab版本号在run的过程中传递一个变量SOURCE_CODE="$PWD",这个变量必须要传递到镜像内当run起codequality:$SP_VERSION镜像的时候,会run起codeclimate/codeclimate:0.72.0(run之前也需要拉取),codeclimate会去拉取镜像:codeclimate/codeclimate-structure codeclimate/codeclimate-duplication codeclimate/codeclimate-eslint 这几个镜像非常大,需要提前下载 好,不然可能会报超时的错误。如果下载失败可以考虑使用sonar@这个里面的版本号是自动的,在registry.gitlab.com/gitlab-org/security-products/codequality:10-8-stable(这里是10-8的版本,识别去pull的),容器中有个脚本会做处理,这也就是前面说的,在启动codequality后会run一个codeclimate容器,脚本如下:#!/bin/sh usage="$(basename "$0") [-h] <app_path> where: -h show this help text app_path The path to the source code of the project you want to analyze." while getopts 'h' option; do case "$option" in h) echo "$usage" exit ;; :) printf "missing argument for -%s\n" "$OPTARG" >&2 echo "$usage" >&2 exit 1 ;; \?) printf "illegal option: -%s\n" "$OPTARG" >&2 echo "$usage" >&2 exit 1 ;; esac done shift $((OPTIND - 1)) if [ $# -ne 1 ] ; then echo "$usage" exit fi APP_PATH=$1 DEFAULT_FILES_PATH=${DEFAULT_FILES_PATH:-/codeclimate_defaults} CODECLIMATE_VERSION=${CODECLIMATE_VERSION:-0.72.0} CONTAINER_TIMEOUT_SECONDS=${TIMEOUT_SECONDS:-900} # default to 15 min if [ -z "$SOURCE_CODE" ] ; then echo "SOURCE_CODE env variable not set" exit fi # Copy default config files unless already present for csslint, eslint (ignore), rubocop and coffeelint for config_file in .csslintrc .eslintignore .rubocop.yml coffeelint.json; do if [ ! -f $APP_PATH/$config_file ] ; then cp $DEFAULT_FILES_PATH/$config_file $APP_PATH/ fi done # Copy default config file unless already present for code climate # NB: check for all supported config files if ! [ -f $APP_PATH/.codeclimate.yml -o -f $APP_PATH/.codeclimate.json ] ; then cp $DEFAULT_FILES_PATH/.codeclimate.yml $APP_PATH/ fi # Copy default config file unless already present for eslint # NB: check for all supported config files if ! [ -f $APP_PATH/.eslintrc.js -o -f $APP_PATH/.eslintrc.yaml -o -f $APP_PATH/.eslintrc.yml -o -f $APP_PATH/.eslintrc.json -o -f $APP_PATH/.eslintrc ] ; then cp $DEFAULT_FILES_PATH/.eslintrc.yml $APP_PATH/ fi # Run the code climate container. # SOURCE_CODE env variable must be provided when launching this script. It allow # code climate engines to mount the source code dir into their own container. # TIMEOUT_SECONDS env variable is optional. It allows you to increase the timeout # window for the analyze command. docker run \ --env CODECLIMATE_CODE="$SOURCE_CODE" \ --env CONTAINER_TIMEOUT_SECONDS=$CONTAINER_TIMEOUT_SECONDS \ --volume "$SOURCE_CODE":/code \ --volume /tmp/cc:/tmp/cc \ --volume /var/run/docker.sock:/var/run/docker.sock \ "codeclimate/codeclimate:$CODECLIMATE_VERSION" analyze -f json > /tmp/raw_codeclimate.json if [ $? -ne 0 ]; then echo "Could not analyze code quality for the repository at $APP_PATH" exit 1 fi # Only keep "issue" type jq -c 'map(select(.type | test("issue"; "i")))' /tmp/raw_codeclimate.json > "$APP_PATH/codeclimate.json".gitlab-ci.yaml的codequality如下:直接复制粘贴即可使用stage: code-check image: docker:stable variables: DOCKER_DRIVER: overlay2 allow_failure: true services: - docker:stable-dind script: - export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/') - docker run --rm --env SOURCE_CODE="$PWD" --volume "$PWD":/code --volume /var/run/docker.sock:/var/run/docker.sock "registry.gitlab.com/gitlab-org/security-products/codequality:$SP_VERSION" /code artifacts: paths: [codeclimate.json]测试提交代码后会自动执行选择code_quality点击进去目录下会生成一个文件Codeclimate + git (增量)在CSDN上有位博主使用git做成增量:https://blog.csdn.net/aixiaoyang168/article/details/80014647#4codeclimate-%E5%9F%BA%E6%9C%AC%E5%91%BD%E4%BB%A4%E4%BD%BF%E7%94%A8 我修改了一下到了.gitlab-ci中使用git检出来做git archive -o ./version-$(git rev-parse HEAD)-latest.tar.gz $(git rev-parse HEAD) $(git diff --name-only HEAD HEAD~1)将本次提交与上次代码的差异做检测打包输出两个版本间的改变增量归档 具体来看下:不能创建在项目根目录下,因为每个步骤都会重新重新Fetch,那么在下一次执行Fetch之后创建的文件将被删除PATHD: /home/gitlab-runner/Increment/3/3 code_quality_Increment: <<: *job_Static_code script: - if [ `docker ps -a|egrep "codeclimate|gitlab"|wc -l` -gt 0 ];then docker ps -a|docker rm -f $(egrep "gitlab|codeclimate"|awk -F' ' 'END{print $NF}'); else echo "Nothing Codeclimate Runing"; fi - export VERSION_PATH=$(echo "$CI_REPOSITORY_URL"|awk -F'/' '{print $NF}') - export PATH_LAST=$PATHD$VERSION_PATH - if [ -d $PATH_LAST ];then echo "$PATH_LAST is runing"; else mkdir $PATH_LAST -p; fi - git archive -o $PWD/version-$(git rev-parse HEAD)-latest.tar.gz $(git rev-parse HEAD) $(git diff --name-only HEAD HEAD~1) - tar xf version-$(git rev-parse HEAD)-latest.tar.gz -C $PATH_LAST - export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/') - docker run --rm --env SOURCE_CODE="$PATH_LAST" --volume $PATH_LAST:/code --volume /var/run/docker.sock:/var/run/docker.sock "registry.gitlab.com/gitlab-org/security-products/codequality:$SP_VERSION" /code artifacts: paths: [codeclimate.json] 提交一次不能创建在项目根目录下,因为每个步骤都会重新重新Fetch这样一来可不当紧,那codeclimate.json文件就存放在/home/gitlab-runner/Increment/项目名.git下,如果有必要可以在最后的步骤移动到代码根目录下目录下已经有了上次提交的文件和处理过的json文件[gitlab-runner@linuxea-VM-Node_10_10_240_145 ~/builds/8b5e86c3/0/root/linuxea]$ ll ~/Increment/linuxea.git/ 总用量 12 -rw-r--r-- 1 root root 7091 6月 25 11:46 codeclimate.json -rw-r--r-- 1 root root 2320 6月 25 11:38 coffeelint.json drwxrwxr-x 5 gitlab-runner gitlab-runner 80 6月 25 11:46 linuxea [gitlab-runner@linuxea-VM-Node_10_10_240_145 ~/builds/8b5e86c3/0/root/linuxea]$ 其他参考:https://github.com/codeclimate/test-reporter/blob/master/examples/php_examples.md其他参考:https://docs.codeclimate.com/docs/advanced-configuration另外,合并代码也会进行检测.gitlab-ci.yaml文件yaml文件内容如下其中如果docker运行后会出现没有删除的情况,这样以来会产生大量的无用容器,加条判断,在一开始就执行- if [ `docker ps -a|egrep "codeclimate|gitlab"|wc -l` -gt 0 ];then docker ps -a|docker rm -f $(egrep "gitlab|codeclimate"|awk -F' ' 'END{print $NF}'); else echo "Nothing Codeclimate Runing"; fi如下:stages: - code-check - deploy # 变量 variables: WWWDIR: "/data/wwwroot" ANSIBLEGROUP: "linuxea" LANG: "en_US.UTF-8" VERSION: "1.11" SONAR_URL: "https://10.0.1.61:9000" SONAR_KN: "sonar-linuxea" SONAR_CFG: "sonar-scanner -Dsonar.host.url=$SONAR_URL -Dsonar.projectKey=$SONAR_KN -Dsonar.projectName=$SONAR_KN -Dsonar.projectBaseDir=/root/src -Dsonar.sources=./ -Dsonar.java.binaries=./" # 所有 stage 之前的操作 before_script: - cat /etc/redhat-release .code_check_Static: &job_Static_code stage: code-check image: docker:stable variables: DOCKER_DRIVER: overlay2 PATHD: /home/gitlab-runner/Increment/ allow_failure: true services: - docker:stable-dind # sonarqube代码检查 1/3 sonarqube: stage: code-check script: - docker run --rm --volume $(pwd):/root/src --volume /var/run/docker.sock:/var/run/docker.sock "newtmitch/sonar-scanner" $SONAR_CFG - sudo chown -R gitlab-runner.gitlab-runner ${PWD} 2/3 code_quality: <<: *job_Static_code script: - if [ `docker ps -a|egrep "codeclimate|gitlab"|wc -l` -gt 0 ];then docker ps -a|docker rm -f $(egrep "gitlab|codeclimate"|awk -F' ' 'END{print $NF}'); else echo "Nothing Codeclimate Runing"; fi - export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/') - docker run --rm --env SOURCE_CODE="$PWD" --volume "$PWD":/code --volume /var/run/docker.sock:/var/run/docker.sock "registry.gitlab.com/gitlab-org/security-products/codequality:$SP_VERSION" /code artifacts: paths: [codeclimate.json] 3/3 code_quality_Increment: <<: *job_Static_code script: - if [ `docker ps -a|egrep "codeclimate|gitlab"|wc -l` -gt 0 ];then docker ps -a|docker rm -f $(egrep "gitlab|codeclimate"|awk -F' ' 'END{print $NF}'); else echo "Nothing Codeclimate Runing"; fi - export VERSION_PATH=$(echo "$CI_REPOSITORY_URL"|awk -F'/' '{print $NF}') - export PATH_LAST=$PATHD$VERSION_PATH - if [ -d $PATH_LAST ];then echo "$PATH_LAST is runing"; else mkdir $PATH_LAST -p; fi - git archive -o $PWD/version-$(git rev-parse HEAD)-latest.tar.gz $(git rev-parse HEAD) $(git diff --name-only HEAD HEAD~1) - tar xf version-$(git rev-parse HEAD)-latest.tar.gz -C $PATH_LAST - export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/') - docker run --rm --env SOURCE_CODE="$PATH_LAST" --volume $PATH_LAST:/code --volume /var/run/docker.sock:/var/run/docker.sock "registry.gitlab.com/gitlab-org/security-products/codequality:$SP_VERSION" /code artifacts: paths: [codeclimate.json] # 部署到服务器 deploy: stage: deploy only: - master script: - ansible ${ANSIBLEGROUP} -m shell -a "[ -d ${WWWDIR} ]||mkdir ${WWWDIR} -p" - ansible ${ANSIBLEGROUP} -m synchronize -a 'src=./ dest=${WWWDIR}/ rsync_opts=--delete,--exclude=*.json,--exclude=*.yml,--exclude=*.git' #- ansible ${ANSIBLEGROUP} -m shell -a "chown -R 400.400 /data/wwwroot/" #when: manual在第一次使用全量的方式检测,后面都使用增量,本次的分享到此结束
2018年06月25日
4,027 阅读
0 评论
0 点赞
2018-06-21
linuxea:gitlab-ci/cd 自动更新测试(二)
gitlab+runner自动更新代码测试持续集成在整个持续集成的工作流程中是分有CI和CD,当代码提交后到线上运行。在以往这个过程中,需要测试环节,运维发布环节,灰度环节,转移线上,我们大致先分为三个过程,开发人员提交代码,测试人员测试代码,运维人员发布代码。在gitlab的持续集成中相对jenkins来讲区别并不大,尽管在之前的文章中极少提起jenkins和持续集成,交付的东西,但是也有少数的测试部分。来看gitlab的ci和cd,很简单:尽管这张图在官网有很多说明,但是既然读者已经看到这里,我还是有必要稍微解释一下这张图说表达的事情。CI(Continuous Integration)/CD(Continuous Delivery)当代码提交后,首先进入的CI环节,当然,这里大部分利用自动化软件,插件的形式进行测试,常规的测试使用jmeter,loadrunner 等等,测试的结果会通知测试人员,假如一切ok,则可能直接进入cd环节如果前面的自动化测试完成,就进入部署环节,可以分为自动部署,自动化部署好处,如:减少人为干预,如果我们有了合理的可靠的方式,反倒人为干预越少越不会出现误操作的问题。开发重复的提交直接经过前面的环节后,通过则部署。当然,也可以手动进行触发部署。总结一下:收到提交操作,开始构建环节,进行测试,部署到测试环境。合并到主分支后在部署到生产环境。这个过程不管在jenkins还是gitlab上都是透明的。在频繁的代码更新,代码测试,代码构建和部署,持续集成不可所缺更多的内容可参考:https://docs.gitlab.com/ce/ci/README.html#exploring-gitlab-ci-cdci/cd and runner角色在gitlab-ce的持续集成里面,只要push到gitlab就会执行,随着内容的扩展,包含测试,便宜,部署一系列的内容。我们先体验下自动部署,相比较webhook那肯定是高端很多了gitlab-ci/cd devops QQ群:693788292gitlab-ci/cd当安装完成gitlab-ce后,就可以直接用其中的.gitlab-ci.yml脚本解析是ci来做gitlab-Runner最终.gitlab-ci.yml的内容,脚本等(script部分),是由runner来负责的,在运行完成后的结果返回给gitlab,可以多任务同时运行。支持bash,windows batch和windows powershell,支持docker一般情况下,至少需要一个gitlab和一个gitlab runnergitlab runner 安装:https://www.linuxea.com/1800.html自动更新简单的测试一下,大致是这样的可以在每台上面装runner,也可以用ansible来做有push操作就会更新,且通过runner一台机器(也可以gitlab-ce本身),使用ansible推送到其他机器准备Ansible推送安装ansible[root@DS-VM-Node_10_10_240_145 ~]$ yum install ansible -y配置hosts文件[root@DS-VM-Node_10_10_240_145 ~]$ cat /etc/ansible/hosts [linuxea] 10.10.240.202 ansible_ssh_user=root ansible_ssh_pass=123 10.10.240.203 ansible_ssh_user=root ansible_ssh_pass=123这里的ansible也可以在gitlab-runner用户下ssh-kengen -t rsa生成密钥对,使用ssh-copy-id传递到www机器上ssh-copy-id root@10.10.240.202修改下ansible的目录,权限问题可参考:https://www.linuxea.com/1793.html假设有个项目叫"linuxea"我们开始一次提交代码配置yaml文件在项目中点击-->CI/CD configurationyaml如下:用过jenkins pipline的就比较熟悉这个了,在前面几项都是自动测试的先略过,看最后部署,加上when: manual则需要手动触发stages: - sonarqube - Junit-test - ZAP-test - deploy # 变量 variables: WWWDIR: "/data/wwwroot/" ANSIBLEGROUP: "linuxea" # 所有 stage 之前的操作 before_script: - cat /etc/redhat-release # 代码检查 lint: stage: sonarqube script: echo "代码检查" # 单元测试 unit: stage: Junit-test script: echo "Junit-test" # 安全测试 ZAP: stage: ZAP-test script: echo "ZAP-test" # 部署到服务器 deploy: stage: deploy only: - master script: - ansible $ANSIBLEGROUP -m shell -a "[ -d $WWWDIR ]||mkdir $WWWDIR -p" - ansible $ANSIBLEGROUP -m synchronize -a 'src=./ dest=$WWWDIR rsync_opts=--delete' #when: manual开始提交更新提交一次代码在打开gitlab中的pipeline,已经开始构建PS:由于前面几步的内容都是echo,所以比较快的构建,后面直接运行了推送代码点击Passed可以看到构建的详细步骤其中Pipeline中的每个步骤都可以点进去查看,也可以点击jobs的查看,点击旋转retry则重新执行一次第一次自动更新完成。重新提交在.gitlab-ci.yaml中打开 when: manual手动触发,如下图连续提交两次提交第一次提交第二次在web界面重新回到上个版本(在某种层面),回滚的在后面会提到在查看文件中的时间
2018年06月21日
4,118 阅读
0 评论
0 点赞
2018-06-20
linuxea:gitlab-ci/cd runner配置和安装(一)
假设已经安装好gitlab10.8.4,如果没有安装即可,操作系统centos7.5gitlab ee安装:https://about.gitlab.com/installation/#centos-7gitlab ce安装:wget --content-disposition https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-10.8.4-ce.0.el7.x86_64.rpm/download.rpmgitlab-ci/cd devops QQ群:693788292GitLab Runner是用于运行作业并将结果发回给GitLab,它与GitLab CI一起使用,而GitLab CI是GitLab中包含的开源持续集成服务,用于协调作业。gitlab runner可以在不同场景运行构建,如:docker,shell,virtualbox,k8s等,具体参考官网说明官网参考:https://docs.gitlab.com/runner/安装参考:https://docs.gitlab.com/runner/install/runner安装https://docs.gitlab.com/runner/install/linux-manually.html[root@linuxea-VM-Node_10_10_240_145 ~]$ wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64创建用户[root@linuxea-VM-Node_10_10_240_145 ~]$ useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash [root@linuxea-VM-Node_10_10_240_145 ~]$ cd /usr/local/bin开始安装[root@linuxea-VM-Node_10_10_240_145 /usr/local/bin]$ ./gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner [root@linuxea-VM-Node_10_10_240_145 /usr/local/bin]$ gitlab-runner start开始配置runners1,在gitlab项目中左侧设置settings-->CI/CD-->Runners settings我们使用的是指定的runner2,开始在客户端配置(拉代码端)开始注册[root@linuxea-VM-Node_10_10_240_145 /usr/local/bin]$ gitlab-runner register Running in system-mode. Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/): 请输入gitlab-ci的网址 https://10.10.240.146 Please enter the gitlab-ci token for this runner: 请输入gitlab-ci runner的标记 rwscgp4UritWx8r-go_4 Please enter the gitlab-ci description for this runner: 请输入gitlab-ci runner说明 [DS-VM-Node_10_10_240_145.dwhd.org]: linuxea-test Please enter the gitlab-ci tags for this runner (comma separated): 请输入gitlab-ci runner标签 linuxea-test Whether to run untagged builds [true/false]: 是否运行未标记的版本: [false]: true Whether to lock the Runner to current project [true/false]: 是否将runner锁定到当前项目: [true]: true Registering runner... succeeded 注册成功 runner=rwscgp4U Please enter the executor: virtualbox, docker+machine, docker-ssh+machine, kubernetes, shell, ssh, parallels, docker, docker-ssh: 请输入执行程序:virtualbox, docker+machine, docker-ssh+machine, kubernetes, shell, ssh, parallels, docker, docker-ssh: shell Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded! 注册成功 [root@linuxea-VM-Node_10_10_240_145 /usr/local/bin]$ 在返回gitlab已经激活成功
2018年06月20日
3,845 阅读
0 评论
0 点赞
1
2
3