1. 程式人生 > >Jenkins持續整合git、gitlab、sonarqube(7.0)、nexus,自動化部署實戰,附安裝包,嚴禁轉載!!!

Jenkins持續整合git、gitlab、sonarqube(7.0)、nexus,自動化部署實戰,附安裝包,嚴禁轉載!!!

導讀

  之前用的都是SVN,由於工作需要用到Git,求人不如求己,技多不壓身,多學一項技能,未來就少求別人一次,系統的學一遍,自己搭建一整套環境,自動化部署(自動發版),程式碼質量檢測等等(為啥不用docker搭建環境呢,個人平時比較忙,暫未學習docker,過段時間會學docker相關,也會寫相應博文)。為啥要打水印,Wechar上有人告訴我,之前很多博文,被某些網站白嫖,然後掛到自己網站(未來部落格上都會打水印),~@¥#%¥@%#@%¥再次宣告,創作不易,嚴禁轉載!!!

踩坑

  從10月12、13(週末)天天搞到夜裡2、3點,週一至週五,由於個人原因,剛換份工作,平時也忙,個人精力有限,只能晚上花2、3小時,學習-搭建-踩坑-度娘-搭建-成功,一直到今天,才完整的搭建出來,部落格才發出來。安裝過程中,並不是一帆風順的,在此為了避免學習的小朋友踩相同的坑,最好版本和我一致,下面都會有提供我使用的安裝包。那些坑,我已經巧妙的繞開啦,按照我的步驟來,幹就完事兒啦,歐力給~

演示環境

  1. mac系統
  2. 虛擬機器:Centos 6.5(我分配了4G,2核,配置低了會卡!裡面用到ES伺服器配置低,服務起不來,ES腦補連結:點我直達,磁碟至少分50G,當初我給了20G,最後服務配置太多以後,導致服務跑步起來你了)

Git

Git是什麼

  Git 是一個開源的分散式版本控制系統,用於敏捷高效地處理任何或小或大的專案。

  Git 是 Linus Torvalds 為了幫助管理 Linux 核心開發而開發的一個開放原始碼的版本控制軟體。

  Git 與常用的版本控制工具 CVS, Subversion 等不同,它採用了分散式版本庫的方式,不必伺服器端軟體支援。

Git的安裝

  官網地址:https://git-scm.com/downloads

  不要慌,最下面我會提供我使用的所有安裝包

linux:yum install -y git
mac:自帶的有git
windows:需要自動手動下載,一直下一步即可

安裝git完成

  yum自動下載的git不是最新的,如果想安裝最新的git版本,自行百度查,方法很多滴~由於時間關係,就不帶領小夥伴實操啦,功能都大差不差的。

常用命令

幫助

1、git                       檢視git的幫助文件
2、git --help              檢視git的幫助文件
3、git add --help        檢視某個命令的幫助文件

版本號

生產空的本地倉庫

將檔案新增暫存區

提交

初次commit之前,需要配置使用者郵箱及使用者名稱

git config --global user.email "[email protected]"
git config --global user.name "Your Name"

git commit:將暫存區的檔案提交到本地倉庫

遠端倉庫

echo "# git-test" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M master
git remote add origin https://github.com/543210188/git-test.git
git push -u origin master

推送

git push -u origin master:往名字為origin的倉庫的master分支上提交變更

拉取

1、git fetch       拉取遠端倉庫的變更到本地倉庫
2、git merge origin/master    將遠端的變更,合併到本地倉庫的master分支

3、上面2個命令等價於 git pull

取消新增

git rm --cache 1.txt
注意:如果只是:git rm --cache,僅刪除暫存區裡的檔案
如果不加--cache,會刪除工作區裡的檔案,並提交到暫存區

恢復檔案

1、git checkout master 檔名

注:直接加檔名,從暫存區將檔案恢復到工作區,如果工作區已經有該檔案,則會覆蓋

加了[分支名]+檔名,表示從分支名為所寫的分支名中拉取檔案,並覆蓋工作區裡的檔案

git檔案狀態

git status  檢視git的狀態

git圖形化客戶端

官網:https://www.sourcetreeapp.com/ 

 

 

拉取程式碼

分支

  軟體專案中啟動一套單獨的開發路線的方法,可以避免版本相容開發問題,避免不同版本之間的影響,封裝一個開發階段,解決bug的時候新建分支,用於對該bug的研究。

建立分支&檢視分支

建立分支:git branch 分支名
檢視分支:git branch
注:列出所有的分支,分支前面有*號,代表當前所在那個分支

刪除分支

刪除:git branch -d 分支名
注:不能刪除當前所在的分支

修改分支名

修改分支名:git branch -m 舊分支名 新分支名

開發v2.0版本分支(切換分支並推送到github)

切換分支:git checkout 分支名
注:如果在分支上面對檔案進行修改之後,沒有commit就切換到另外一個分支,是不允許的,必須commit之後,才能切換分支

強制切換分支:git checkout -f 分支名
注:強制切換分支,如果有未提交的變更,直接丟棄

檢視歷史

檢視提交歷史:git log
檢視最近2次的提交:git log -2
檢視最近2次提交差異:git log -p -2
檢視某個人提交的程式碼:git log --author 作者
顯示簡要的資訊:git log --oneline
整個提交歷史:git log --graph

程式碼對比

作用

  1. 解決衝突
  2. 製作補丁
比較工作區跟暫存區的差異:git diff
比較暫存區與分支差異:git diff --cached 或者 --staged
跟當前分支比較:git diff HEAD
比較當前分支與另外一個分支差異:git diff 分支名
檢視兩個分支的差異(針對已提交):git diff 分支名1 分支名2
檢視單純的一個檔案差異:git diff 檔名
檢視兩次不同提交差異:git diff commitid_1 commitid_2
檢視有變更的檔案:git diff --stat

git更改提交 

用途

  1. 將暫存區中不必要的檔案移除
  2. 版本回滾
  3. 只修改提交的摘要資訊
把暫存區中的檔案移除出來_1:git reset HEAD 檔名 
把暫存區中的檔案移除出來_2:git reset HEAD^
修改暫存區中的摘要資訊(需要重新提交git commit -m "test"):git reset --soft HEAD^
丟失修改過的程式碼(重置程式碼):git reset --hard HEAD^

分支合併衝突

分支合併(拿指定的分支名與當前分支進行合併):git merge 分支名

 

 

衝突解決

合併分支:git merge 分支名
檢視衝突檔案(重要):git diff --name-only --diff-filter=U

  注:視情況,是隻要master的程式碼還是v2.0(分支)程式碼,我這裡處理是要2邊的程式碼。 

標籤

打上標籤(給最近的打上標籤):git tag 標籤名
給指定的提交打上標籤(git log獲取commitid值,也就是獲取提交的版本):git tag 標籤名 commitid
顯示標籤(以字母序,非時間):git tag
顯示該標籤提交的那次相關資訊:git show 標籤名
刪除標籤(不會刪除那次提交):git tag -d 標籤名
將標籤推送到遠端伺服器上(標籤必須存在):git push origin 分支名 標籤名
刪除遠端伺服器上的標籤:
1、刪除本地的標籤:git tag -d 標籤名
2、刪除遠端的:git push origin :refs/tags/標籤名

 

gitignore檔案 

用途

  1. 忽略不必要的檔案 

1、建立gitignore檔案:touch .gitignore
2、在.gitignore新增忽略的目錄:
target
.idea


.log:表示忽略專案中所有以.log結尾的檔案
123?.log:表示忽略專案中所有以123加任意字元的檔案 
/error.log:表示忽略專案中根目錄中的error.log 這個檔案 
src/main/test/:表示忽略/src/main/test/目錄下的所有檔案
*.class **/java/:匹配所有java目錄下的所有檔案
!/error.log:表示在之前的匹配規則下,被命中的檔案,可以使用!對前面的規則進行否定
如果專案已經推送到遠端伺服器中,可通過這種方式刪除
1、先刪除本地暫存區檔案(git rm -rf --cache target/):git rm -rf --cache 目錄名
2、提交:git commit -m "刪除本地暫存區"
3、推送:git push

Gitlab

簡介

  GitLab 是一個用於倉庫管理系統的開源專案,使用Git作為程式碼管理工具,並在此基礎上搭建起來的web服務。安裝方法是參考GitLab在GitHub上的Wiki頁面。

為什麼要使用gitlab? 

  1. 基礎功能開源,可自行搭建
  2. 可以進行許可權控制,使程式碼對部分人可見

安裝gitlab(Centos6.5)

目錄結構及說明

/etc/gitlab/gitlab.rb          #gitlab配置檔案
/opt/gitlab                    #gitlab的程式安裝目錄
/var/opt/gitlab                #gitlab目錄資料目錄
/var/opt/gitlab/git-data       #存放倉庫資料
gitlab-ctl reconfigure         #重新載入配置
gitlab-ctl status              #檢視當前gitlab所有服務執行狀態
gitlab-ctl stop                #停止gitlab服務
gitlab-ctl stop nginx          #單獨停止某個服務
gitlab-ctl tail                #檢視所有服務的日誌

Gitlab的服務構成:
nginx:                 靜態web伺服器
gitlab-workhorse        輕量級反向代理伺服器
logrotate              日誌檔案管理工具
postgresql             資料庫
redis                  快取資料庫
sidekiq                用於在後臺執行佇列任務(非同步執行)

官網

官網:https://about.gitlab.com/

國內映象:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/

線上下載及安裝

yum install -y curl policycoreutils-python openssh-server        #安裝依賴
wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el6/gitlab-ce-13.1.11-ce.0.el6.x86_64.rpm --no-check-certificate  #centos6.5
rpm -ivh gitlab-ce-13.1.11-ce.0.el6.x86_64.rpm # 安裝包gitlab
sudo service postfix start
sudo chkconfig postfix on

linux其他版本安裝方式

  centos其他版本下載包方式,當然啦,也可以先把包下載到本地,然後在丟到linux,執行安裝效果是一樣的。

修改對外開放域名或ip

vim /etc/gitlab/gitlab.rb

開啟後有一行 external_url 的設定改成要對外開放 web 的 url ,
例如我可以指定 git.chenyanbin.com
只想內部使用也可以改成 http://192.168.199.199:8888 這樣的內部IP地址.

配置生效:gitlab-ctl reconfigure
重啟:gitlab-ctl restart
設定防火牆埠(防火牆已全部關閉的話,可忽略):vim /etc/sysconfig/iptables

啟動gitlab

sudo gitlab-ctl reconfigure
sudo lokkit -s http -s ssh
停止gitlab:gitlab-ctl stop
重啟gitlab:gitlab-ctl start

登入

  注:第一次登入時,需要設定初始密碼,然後用root+密碼登入即可

建立專案並推送到gitlab

  本地新建一個專案並用git,將資料夾推送到gitlab上。

郵件服務

作用

  1. 有合併請求時,郵件通知
  2. 賬號註冊時,郵件驗證
  3. 修改密碼時,通過郵件修改

步驟

  1. 開啟QQ郵箱的smtp服務
  2. 修改gitlab配置
  3. 測試郵件服務是否正常

gitlab_rails['smtp_enable'] = true 
gitlab_rails['smtp_address'] = "smtp.qq.com" 
gitlab_rails['smtp_port'] = 465 
gitlab_rails['smtp_user_name'] = "[email protected]" 
gitlab_rails['smtp_password'] = "郵箱隨機字串" 
gitlab_rails['smtp_domain'] = "qq.com" 
gitlab_rails['smtp_authentication'] = "login" 
gitlab_rails['smtp_enable_starttls_auto'] = true 
gitlab_rails['smtp_tls'] = true 
user['git_user_email'] = "[email protected]" 
gitlab_rails['gitlab_email_from'] = '[email protected]'
重啟配置檔案:gitlab-ctl reconfigure
重啟服務:gitlab-ctl restart

 測試郵件

gitlab-rails console
Notify.test_email('[email protected]','郵件測試','部落格地址:https://www.cnblogs.com/chenyanbin/').deliver_now

賬號註冊和分組

使用者註冊(未開啟郵箱檢驗)

  缺點:隨便新增賬戶,亂註冊,不符合企業管理標準

使用者註冊(郵箱校驗)

  開啟校驗並真實郵箱註冊

建立組並邀請成員(配置過郵件服務,會郵件提醒)

訪問許可權

  1. private:只有組成員才能看到
  2. Internal:只要登入的使用者就能看到
  3. Public:所有人都能看到

組許可權

  1. Guest:可以建立issue、發表評論,不能讀寫版本庫
  2. Reporter:可以克隆程式碼,不能提交
  3. Developer(推薦):可以克隆程式碼、開發、提交、push
  4. Master:可以建立專案、新增tag、保護分支、新增專案成員、編輯專案
  5. Owner:可以設定專案訪問許可權 - Visibility Level、刪除專案、遷移專案、管理組成員

生成隨機金鑰

ssh-keygen -t rsa

分支及標籤保護

為什麼要保護分支?

  保護特定的分支不被隨便合併,以免影響相應的分支

  自己部署好gitlab,然後賦予賬戶許可權,體驗下就好

注:能push就能merge,相應的許可權自我控制(master分支設定只能master可以合併)。 

第二種方式合併請求

敏捷持續整合

簡介

  持續整合是一種軟體開發實踐,即團隊開發成員經常整合他們的工作,通過每個成員每天至少整合一次,也就意味著每天可能會發生多次整合。每次整合都通過自動化的構建(包括編譯,釋出,自動化測試)來驗證,從而儘早地發現整合錯誤。

好處

  1. 節省人力成本
  2. 加快軟體開發進度
  3. 實時交付

重要元件

  1. git
  2. gitlab
  3. Jenkins:持續整合引擎
  4. maven:構建
  5. sonarqube:程式碼質量管理
  6. JDK
  7. Tomcat

jdk和maven安裝

jdk安裝:點我直達

maven安裝:點我直達

nexus私服安裝

官網:點我直達

  下面百度雲盤也會提供喲~

解壓

tar -zxvf nexus-3.27.0-03-unix.tar.gz -C /usr/local

修改啟動埠號

vim /usr/local/nexus-3.27.0-03/etc/nexus-default.properties

 

開啟防火牆埠

  注:因為我本地沒有使用8081埠,所以預設埠可以使用。但是防火牆埠記得開放喲~ 

vim /etc/sysconfig/iptables

 

重啟防火牆

service iptables restart

啟動nexus

  注意:jdk版本必須得1.8!!!nexus版本不同,可能需要的jdk版本不同

nexus不推薦使用root使用者啟動(可忽略)

也可以自己手動建立個使用者,然後加入到組,賦予許可權,步驟如下
1、useradd nexus
2、chown -R nexus:nexus xxxx/xxxx/nexus-3.27xxx/
3、chown -R nexus:nexus xxxx/xxxx/sonatype-work/ 4、su nexus 5、./nexus start

踩了個坑

 

小技巧

  注:./nexus start,啟動完成之後,檢視nexus是否啟動:ps aux|grep nexus,若沒有啟動的話,可以使用:./nexus run;此時啟動專案就會提示哪裡出錯啦~

訪問

  注:點選右上角登入,預設賬號密碼:admin/admin123;從nexus3.17以後,預設密碼改為隨機的了,檔案路徑在:/usr/local/sonatype-work/nexus3/admin.password裡!!!

 

修改最大檔案數(預設1024)

 

 

  注:記得重啟!!!

設定nexus開機自啟動

 vim /etc/rc.d/rc.local 

nexus安裝及使用

專案maven大概過程分析

設定maven的setting.xml

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
    <pluginGroups/>
    <proxies/>
    <servers>
        <server>
            <id>ybchen-releases</id>
            <username>admin</username>
            <password>admin</password>
        </server>
        <server>
            <id>ybchen-snapshots</id>
            <username>admin</username>
            <password>admin</password>
        </server>
    </servers>
    <mirrors/>
    <profiles>
        <profile>
            <id>ybchen</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation> <!-- 私有庫地址-->
            <repositories>
                <repository>
                    <id>ybchen</id>
                    <url>http://192.168.199.199:8088/repository/maven-public/</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </repository>
            </repositories> <!--外掛庫地址-->
            <pluginRepositories>
                <pluginRepository>
                    <id>ybchen</id>
                    <url>http://192.168.199.199:8088/repository/maven-public/</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </pluginRepository>
            </pluginRepositories>
        </profile>
    </profiles>
    <activeProfiles>
        <activeProfile>ybchen</activeProfile>
    </activeProfiles>
</settings>

設定nexus的代理地址,並新增到組中

  阿里雲地址:http://maven.aliyun.com/nexus/content/groups/public/ 

測試

  本地庫,我已經清空,所有下載的都會先去nexus看看,沒有的話,才會走阿里雲代理上下載,然後還會下載到nexus。  

將本地jar上傳至nexus

 

<distributionManagement>
    <repository>
        <id>ybchen-releases</id>
        <name>Nexus Release Repository</name>
        <url>http://xxx.xxx.xxx.xxx:port/repository/maven-releases/</url>
    </repository>
    <snapshotRepository>
        <id>ybchen-releases</id>
        <name>Nexus Release Repository</name>
        <url>http://xxxx.xxxx.xxx.xxx:port/repository/maven-snapshots/</url>
    </snapshotRepository>
</distributionManagement>

安裝mysql

點我直達

程式碼質量管理平臺sonarQube安裝及使用

前置條件

  • mysql 5.6 | 5.7
  • jdk1.8

 我使用的是7.0,版本要求:點我直達

下載地址:點我直達

官網

點我直達

安裝

1、依賴:yum install unzip -y
2、解壓:unzip sonarqube-7.0.zip 
3、移動:mv sonarqube-7.0 /usr/local/
4、切換: cd /usr/local/
5、登入mysql:mysql -u root -p
6、建立庫:CREATE DATABASE sonar DEFAULT CHARACTER SET utf8;
7、退出mysql:exit
8、進入sonarqube:cd sonarqube-7.0/conf/

修改配置

vim sonar.properties
主要配置以下內容
sonar.jdbc.username=root
sonar.jdbc.password=root
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
sonar.web.host=0.0.0.0
sonar.web.context=/sonar
sonar.web.port=9000

 

啟動

useradd sonar
chown -R sonar:sonar /usr/local/sonarqube-7.0
su sonar
cd /usr/local/sonarqube-7.0/bin/linux-x86-64/
./sonar.sh start

訪問

  記得開放防火牆埠:9000,賬號/密碼:admin/admin

漢化

  安裝完,重啟服務再次開啟網頁即可

sonar7.0的中文包,網頁線上安裝不上,我是去github上下載,手動安裝的,按照以下幾步即可,下面我也會提供,我直接下載的是jar包,原始碼包還得編碼(因為我懶)
1. 在https://github.com/SonarCommunity/sonar-l10n-zh,下載漢化包原始碼;
2. 本地打包,cmd裡面,在解壓包裡面執行: mvn install 
3. 將打好的jar包,放到: sonarqube/extensions/plugins  目錄先;
4. 重啟sonar,即可

  具體操作如下,github地址:點我直達

使用

settings.xml
============================
<?xml version="1.0" encoding="UTF-8"?>
<settings
    xmlns="http://maven.apache.org/SETTINGS/1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
    <pluginGroups></pluginGroups>
    <proxies></proxies>
    <servers></servers>
    <mirrors>
        <!--maven代理開始-->
        <mirror>
            <id>huaweicloud</id>
            <mirrorOf>*,!HuaweiCloudSDK</mirrorOf>
            <url>https://mirrors.huaweicloud.com/repository/maven/</url>
        </mirror>
        <mirror>
            <id>aliyun</id>
            <name>aliyun Maven</name>
            <mirrorOf>*,!HuaweiCloudSDK</mirrorOf>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        </mirror>
        <!--maven代理結束-->
    </mirrors>
    <profiles>
        <!--sonar配置開始-->
        <profile>
            <id>sonar</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <sonar.jdbc.url>jdbc:mysql://192.168.199.199:3306/sonar?useUnicode=true&amp;characterEncoding=utf8</sonar.jdbc.url>
                <sonar.jdbc.username>root</sonar.jdbc.username>
                <sonar.jdbc.password>root</sonar.jdbc.password>
                <sonar.host.url>http://192.168.199.199:9000/sonar</sonar.host.url>
            </properties>
        </profile>
        <!--sonar配置結束-->
    </profiles>
</settings>
git init
mvn clean install
mvn sonar:sonar

Jenkins

安裝

前置條件

  1. JDK(jdk8);安裝:點我直達
  2. tomcat(tomcat9);安裝:點我直達

jenkins下載:點我直達

 

將jenkins放到tomcat中

 

問題排查(重要)

  1. 檢視tomcat是否啟動
  2. 檢視埠8080是否開啟:netstat -tlun
  3. 檢視防火牆埠是否開啟,記得重啟防火牆
  4. 檢視tomcat日誌:/var/soft/apache-tomcat-9.0.38/logs/catalina.out

 

  注:可以看到,地址被佔用了!

修改tomcat的埠號,我這裡修改為:9999,記得防火牆!!!

 

訪問

 

 

安裝推薦元件

 

建立使用者名稱密碼

 

例項配置

 

登入

外掛安裝及配置

系統配置

  1. jdk
  2. maven
  3. sonarqube
  4. 郵件
  5. gitlab授權
  6. 免密登入
配置jdk和maven

配置郵件

配置sonarqube

繼續到全域性配置裡設定sonarqube

授權登入

生成金鑰
yum -y install openssh-clients
ssh-keygen -t rsa

 

生成的key放到gitlab

more ~/.ssh/id_rsa.pub

建立專案

  注:git方式拉程式碼,直接不報紅,代表搭建成功

jenkins手動發版測試

linux建立目錄
1、cd /
2、mkdir springboot_demo

jenkins配置

clean install

mv target/*.jar /springboot_demo/
cd /springboot_demo
BUILD_ID= java -jar spring-boot-demo-0.0.1-SNAPSHOT.jar >log 2>&1 &
clean install

mv target/*.jar /springboot_demo/
cd /springboot_demo
BUILD_ID= java -jar spring-boot-demo-0.0.1-SNAPSHOT.jar >log 2>&1 &

整合sonar然後釋出

  剛開始的時候sonarqube裡面沒有專案隨著程式碼的重新發布,會將專案也提交到sonarqube中

#projectKey專案的唯一標識,不能重複
sonar.projectKey=yb
sonar.projectName=springboot-test
sonar.projectVersion=1.0
sonar.sourceEncoding=UTF-8
sonar.modules=java-module
# Java module 
java-module.sonar.projectName=test 
java-module.sonar.language=java 
# .表示projectBaseDir指定的目錄 
java-module.sonar.sources=src 
java-module.sonar.projectBaseDir=. 
java-module.sonar.java.binaries=target/

提交後自動釋出

功能描述

  原生代碼修改完成之後,往gitlab上推程式碼,然後Jenkins自動打包發版程式,不用人工手動發版。

安裝外掛(gitlab)

  裝完外掛後,虛擬機器上的磁碟滿了,導致服務起不來,今天先到這吧,不搞這玩意了(明天要搞其他東西,搭建這一整套東西,噁心我幾百回了,處處坑~),自行去找度娘吧,只需要簡單配置2步就好,前面服務都全部搭建出來了,這個因為linux磁碟滿了,懶得搞了,有點小遺憾,拜~

 

安裝包

 

連結: https://pan.baidu.com/s/1OixJ3oHvjEjKLtvuvplclA  密碼: fbqs