Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CI/CDのススメ(サイバーエージェント新卒研修2024)

 CI/CDのススメ(サイバーエージェント新卒研修2024)

CyberAgent

June 05, 2024
Tweet

More Decks by CyberAgent

Other Decks in Technology

Transcript

  1. 齋藤 健太 (Saito Kenta) 
 
 • 入社年度
 ◦ 2022

    年 新卒入社
 • 所属
 ◦ CIU > Development Div
 • 最近の業務
 ◦ プライベートクラウド運用
 ◦ マネージドサービスの開発・運用
 • 趣味
 ◦ ゲーム・漫画
 2

  2. CI / CD?
 CI: Continuous Integration CD: Continuous Delivery  

    Continuous Deployment
 6
 継続的な
  3. CI / CD?
 CI: Continuous Integration CD: Continuous Delivery  

    Continuous Deployment
 7
 継続的な デプロイ デリバリー
  4. CI / CD?
 CI: Continuous Integration CD: Continuous Delivery  

    Continuous Deployment
 8
 継続的な ???
  5. CI / CD?
 CI: Continuous Integration CD: Continuous Delivery  

    Continuous Deployment
 9
 継続的な なにかをやる
  6. Q このコードの悪い点は?
 17
 package main import "fmt" func main() {

    i := 0 fmt.Println("Hello, 世界") } $ go build .
 ./prog.go:8:2: i declared and not used

  7. Q このコードの悪い点は?
 18
 func main() { i := 0 for

    j := 0; j < 10; j++ { resp, err := http.Get("https://www.cyberagent.co.jp") if err != nil { panic(err) } defer resp.Body.Close() byteArray, err := io.ReadAll(resp.Body) if err != nil { panic(err) } fmt.Println(string(byteArray)) } }
  8. Q このコードの悪い点は?
 19
 func main() { i := 0 for

    j := 0; j < 10; j++ { resp, err := http.Get("https://www.cyberagent.co.jp") if err != nil { panic(err) } defer resp.Body.Close() byteArray, err := io.ReadAll(resp.Body) if err != nil { panic(err) } fmt.Println(string(byteArray)) } }
  9. Q このコードの悪い点は?
 20
 func main() { i := 0 for

    j := 0; j < 10; j++ { resp, err := http.Get("https://www.cyberagent.co.jp") if err != nil { panic(err) } defer resp.Body.Close() byteArray, err := io.ReadAll(resp.Body) if err != nil { panic(err) } fmt.Println(string(byteArray)) } }
  10. Q このコードの悪い点は?
 24
 func main() { i := 0 for

    j := 0; j < 10; j++ { resp, err := http.Get("https://www.cyberagent.co.jp") if err != nil { panic(err) } defer resp.Body.Close() byteArray, err := io.ReadAll(resp.Body) if err != nil { panic(err) } fmt.Println(string(byteArray)) } } コンパイルエラーで発見可能 Lintツールで発見可能
  11. CI を行う大きな利点 (再掲)
 • 「このコードってコンパイル通るの?」
 ◦ 継続的にビルドしてチェック
 • 「このコードって書き方合ってるの?」
 ◦

    継続的にLinterにかけてチェック
 • 「このコードってどこにデプロイされているの?」
 ◦ 継続的にデプロイされることで確認不要
 27

  12. CI を行う大きな利点 (再掲)
 • 「このコードってコンパイル通るの?」
 ◦ 継続的にビルドしてチェック
 • 「このコードって書き方合ってるの?」
 ◦

    継続的にLinterにかけてチェック
 • 「このコードってどこにデプロイされているの?」
 ◦ 継続的にデプロイされることで確認不要
 28
 コードの品質を担保
 +チーム内で可視化

  13. CI を行う大きな利点 (再掲)
 • 「このコードってコンパイル通るの?」
 ◦ 継続的にビルドしてチェック
 • 「このコードって書き方合ってるの?」
 ◦

    継続的にLinterにかけてチェック
 • 「このコードってどこにデプロイされているの?」
 ◦ 継続的にデプロイされることで確認不要
 29
 チームの合意を
 ソフトウェアで担保

  14. CI を行う大きな利点 (再掲)
 • 「このコードってコンパイル通るの?」
 ◦ 継続的にビルドしてチェック
 • 「このコードって書き方合ってるの?」
 ◦

    継続的にLinterにかけてチェック
 • 「このコードってどこにデプロイされているの?」
 ◦ 継続的にデプロイされることで確認不要
 30
 チームの合意を
 ソフトウェアで担保

  15. CI / CD?
 CI: Continuous Integration CD: Continuous Delivery  

    Continuous Deployment
 32
 継続的な
  16. CI / CD?
 CI: Continuous Integration CD: Continuous Delivery  

    Continuous Deployment
 33
 継続的な デプロイ デリバリー
  17. Delivery VS Deployment 35
 コード変更 ビルド Staging環境 にデプロイ Production環境 にデプロイ

    CI(Continuous Integration) CD(Continuous Delivery) CD(Continuous Deployment) Production環境にデプロイ準備完了まで =CD(elivery) Production環境に自動デプロイ =CD(eployment)
  18. Push VS Pull • Push型
 ◦ CI上の一つのタスクとしてdev/stg/prd環境を操作
 ◦ e.g. Ansible,

    Terraform
 • Pull型
 ◦ k8sやマネージドサービスからコードの更新を監視
 → 変更があった際にコードをpullしてデプロイ
 ◦ e.g. ArgoCD
 37

  19. 代表的なCIサービス
 • SaaS 専業企業
 ◦ CircleCI / Travis CI /

    Bitrise / Xcode Cloud
 • パブリッククラウド付属サービス
 ◦ AWS CodeBuild / Google Cloud Cloud Build
 • その他
 ◦ GitHub Actions
 • OSS(自前のマシンが必要)
 ◦ Jenkins
 41