そういうのがいいブログ

SIerで働く30代サラリーマンSEがインフラエンジニアに憧れてLinux・クラウド・AWSの勉強をするブログ

Jenkinsバージョンアップ手順(新しいwarファイルに置換え)2.319.1 LTS

※[PR]当ブログの記事の中にはプロモーションが含まれています。

・Jenkinsの管理画面に「新しいバージョンをダウンロードできます」とメッセージが表示されています。
・Jenkinsのバージョンアップ(2.319)の手順を教えてほしい。

こういった疑問に答えます。

本記事の内容

  1. Jenkinsの新バージョン2.319.1 LTS (2021-12-01) の変更内容
  2. Jenkinsのバージョンアップの手順(新しいwarファイルに置き換えるだけ)

サトナカ (@souiunogaii)

この記事を書いている私は、某SIerに勤務しながら、
WEB系エンジニア・インフラエンジニアに憧れて、プログラミングおよびインフラ技術の勉強をしています。

こういった私が、解説していきます。

私が実機で試したコマンドや画像を載せて書いています。
記事の信頼性担保に繋がると思います。

Jenkinsの新バージョン2.319.1 LTS (2021-12-01) の変更内容

Jenkinsには、2つのリリースがあります。

  • Stable (LTS)
  • Regular releases (Weekly)

2021/23/02に、LTS(Long-Term Support)の新バージョン2.319.1がリリースされました。

www.jenkins.io

What's new in 2.319.1 (2021-12-01)
Changes since 2.319:
Do not attempt to canonicalize tar entries when untaring, as the result may be unexpected for symlinks. (issue 67063)
Fix form submission for file access rules of agent to controller security subsystem (regression in 2.111). (pull 5881, issue 67061, Upgrade guide - Agent to controller path filter security fixes)
Fix missing hyperlink in build history (regression in 2.314). (issue 67028)
An exception thrown by a RestartListener no longer leaves Jenkins in a zombie-like state. (issue 67002)
Prevent LinkageError during class loading (regression in 2.309). (issue 66993)
Show ongoing first build in build history (regression in 2.314). (issue 66969)
Jenkins startup could hang due to a deadlock in class loading. (issue 67188)
Display the "Configure System" icon in the drop down menu. (issue 67033)
引用元:Jenkins LTS Changeloghttps://www.jenkins.io/changelog-stable/

Google日本語翻訳すると以下でした。

2.319.1(2021-12-01)の新機能
2.319以降の変更点:
風袋引きを解除するときにtarエントリを正規化しようとしないでください。これは、シンボリックリンクでは予期しない結果になる可能性があるためです。(発行67063)
エージェントのファイルアクセスルールのコントローラーセキュリティサブシステムへのフォーム送信を修正しました(2.111でのリグレッション)。(プル5881、 発行67061、 アップグレードガイド-エージェントからコントローラへのパスフィルタのセキュリティ修正)
ビルド履歴で欠落しているハイパーリンクを修正しました(2.314でのリグレッション)。(発行67028)
によってスローされた例外により、RestartListenerJenkinsはゾンビのような状態になりません。(発行67002)
LinkageErrorクラスの読み込み中に 防止します(2.309でのリグレッション)。(66993号)
ビルド履歴で進行中の最初のビルドを表示します(2.314でのリグレッション)。(66969号)
クラスの読み込みのデッドロックが原因で、Jenkinsのスタートアップがハングする可能性があります。(67188号)
ドロップダウンメニューに[システムの構成]アイコンを表示します。(発行67033)

Jenkinsのバージョンアップの手順(新しいwarファイルに置き換えるだけ)

手順①:Jenkinsの管理画面のメッセージを確認

Jenkinsの新しいバージョン(2.319.1)をダウンロードできます (変更履歴)

ダウンロードのURLを確認してメモしておきます。

https://updates.jenkins.io/download/war/2.319.1/jenkins.war

ちなみに現在のバージョンは以下。

手順②:Jenkinsを一旦、停止

systemctl stop jenkins
systemctl status jenkins
[root@SV-SATURN ~]# systemctl stop jenkins
[root@SV-SATURN ~]# systemctl status jenkins
● jenkins.service - LSB: Jenkins Automation Server
   Loaded: loaded (/etc/rc.d/init.d/jenkins; bad; vendor preset: disabled)
   Active: inactive (dead) since 日 2021-12-19 08:08:54 JST; 4s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 3269 ExecStop=/etc/rc.d/init.d/jenkins stop (code=exited, status=0/SUCCESS)
  Process: 1272 ExecStart=/etc/rc.d/init.d/jenkins start (code=exited, status=0/SUCCESS)

1219 07:51:12 SV-SATURN systemd[1]: Starting LSB: Jenkins Automation Server...
1219 07:51:12 SV-SATURN runuser[1290]: pam_unix(runuser:session): session opened for user ...=0)
1219 07:51:14 SV-SATURN jenkins[1272]: Starting Jenkins [  OK  ]
1219 07:51:14 SV-SATURN systemd[1]: Started LSB: Jenkins Automation Server.
1219 08:08:53 SV-SATURN systemd[1]: Stopping LSB: Jenkins Automation Server...
1219 08:08:54 SV-SATURN jenkins[3269]: Shutting down Jenkins [  OK  ]
1219 08:08:54 SV-SATURN systemd[1]: Stopped LSB: Jenkins Automation Server.
Hint: Some lines were ellipsized, use -l to show in full.

手順③:Jenkinsの現在のwarファイルをリネーム

cd /usr/lib/jenkins
mv jenkins.war jenkins.war_bk_2.283.3
[root@SV-SATURN ~]# cd /usr/lib/jenkins
[root@SV-SATURN jenkins]# ls -la
合計 207600
drwxr-xr-x   2 root root       85  84 16:29 .
dr-xr-xr-x. 41 root root     4096 1220  2020 ..
-rw-r--r--   1 root root 74258876  728 23:50 jenkins.war
-rw-r--r--   1 root root 67399569 108  2020 jenkins.war_bk_2.249.2
-rw-r--r--   1 root root 70918017  55  2021 jenkins.war_bk_2.277.4
[root@SV-SATURN jenkins]# mv jenkins.war jenkins.war_bk_2.283.3
[root@SV-SATURN jenkins]# ls -la
合計 207600
drwxr-xr-x   2 root root       96 1219 08:10 .
dr-xr-xr-x. 41 root root     4096 1220  2020 ..
-rw-r--r--   1 root root 67399569 108  2020 jenkins.war_bk_2.249.2
-rw-r--r--   1 root root 70918017  55  2021 jenkins.war_bk_2.277.4
-rw-r--r--   1 root root 74258876  728 23:50 jenkins.war_bk_2.283.3

手順④:新しいwarファイルをダウンロード

wget https://updates.jenkins.io/download/war/2.319.1/jenkins.war
[root@SV-SATURN jenkins]# wget https://updates.jenkins.io/download/war/2.319.1/jenkins.war
--2021-12-19 08:11:49--  https://updates.jenkins.io/download/war/2.319.1/jenkins.war
updates.jenkins.io (updates.jenkins.io) をDNSに問いあわせています... 52.202.51.185
updates.jenkins.io (updates.jenkins.io)|52.202.51.185|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 302 Found
場所: https://get.jenkins.io/war-stable/2.319.1/jenkins.war [続く]
--2021-12-19 08:11:50--  https://get.jenkins.io/war-stable/2.319.1/jenkins.war
get.jenkins.io (get.jenkins.io) をDNSに問いあわせています... 52.167.253.43
get.jenkins.io (get.jenkins.io)|52.167.253.43|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 302 Found
場所: https://ftp.yz.yamagata-u.ac.jp/pub/misc/jenkins/war-stable/2.319.1/jenkins.war [続く]
--2021-12-19 08:11:51--  https://ftp.yz.yamagata-u.ac.jp/pub/misc/jenkins/war-stable/2.319.1/jenkins.war
ftp.yz.yamagata-u.ac.jp (ftp.yz.yamagata-u.ac.jp) をDNSに問いあわせています... 2001:df0:25e:e100::3, 2001:df0:25e:e100::2, 133.24.248.19, ...
ftp.yz.yamagata-u.ac.jp (ftp.yz.yamagata-u.ac.jp)|2001:df0:25e:e100::3|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 72247484 (69M)
`jenkins.war' に保存中

100%[==========================================================>] 72,247,484  9.40MB/s 時間 7.5s

2021-12-19 08:11:58 (9.17 MB/s) - `jenkins.war' へ保存完了 [72247484/72247484]

[root@SV-SATURN jenkins]# ls -la
合計 278156
drwxr-xr-x   2 root root      115 1219 08:11 .
dr-xr-xr-x. 41 root root     4096 1220  2020 ..
-rw-r--r--   1 root root 72247484 122 02:18 jenkins.war
-rw-r--r--   1 root root 67399569 108  2020 jenkins.war_bk_2.249.2
-rw-r--r--   1 root root 70918017  55  2021 jenkins.war_bk_2.277.4
-rw-r--r--   1 root root 74258876  728 23:50 jenkins.war_bk_2.283.3

手順⑤:Jenkinsを再起動

systemctl start jenkins
systemctl status jenkins
[root@SV-SATURN jenkins]# systemctl start jenkins
Job for jenkins.service failed because a timeout was exceeded. See "systemctl status jenkins.service" and "journalctl -xe" for details.
[root@SV-SATURN jenkins]# systemctl status jenkins
● jenkins.service - LSB: Jenkins Automation Server
   Loaded: loaded (/etc/rc.d/init.d/jenkins; bad; vendor preset: disabled)
   Active: failed (Result: timeout) since 日 2021-12-19 08:17:46 JST; 1min 48s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 3269 ExecStop=/etc/rc.d/init.d/jenkins stop (code=exited, status=0/SUCCESS)
  Process: 3555 ExecStart=/etc/rc.d/init.d/jenkins start (code=killed, signal=TERM)
   CGroup: /system.slice/jenkins.service
           tq3560 runuser -s /bin/bash jenkins -c ulimit -S -c 0 >/dev/null 2>&1 ; /etc/alternati...
           tq3561 bash -c ulimit -S -c 0 >/dev/null 2>&1 ; /etc/alternatives/java -Djava.awt.head...
           mq3562 /etc/alternatives/java -Djava.awt.headless=true -DJENKINS_HOME=/var/lib/jenkins...

1219 08:12:46 SV-SATURN systemd[1]: Starting LSB: Jenkins Automation Server...
1219 08:12:46 SV-SATURN runuser[3560]: pam_unix(runuser:session): session opened for user ...=0)
1219 08:17:46 SV-SATURN systemd[1]: jenkins.service start operation timed out. Terminating.
1219 08:17:46 SV-SATURN systemd[1]: Failed to start LSB: Jenkins Automation Server.
1219 08:17:46 SV-SATURN systemd[1]: Unit jenkins.service entered failed state.
1219 08:17:46 SV-SATURN systemd[1]: jenkins.service failed.
Hint: Some lines were ellipsized, use -l to show in full.

Jenkinsの起動時にエラーFailed to start LSB: Jenkins Automation Server.が出ています。

journalctl -xe
-- Unit jenkins.service has begun starting up.
12月 19 08:12:46 SV-SATURN runuser[3560]: pam_unix(runuser:session): session opened for user jenkins
12月 19 08:17:46 SV-SATURN systemd[1]: jenkins.service start operation timed out. Terminating.
12月 19 08:17:46 SV-SATURN systemd[1]: Failed to start LSB: Jenkins Automation Server.
-- Subject: Unit jenkins.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit jenkins.service has failed.
--
-- The result is failed.
12月 19 08:17:46 SV-SATURN systemd[1]: Unit jenkins.service entered failed state.
12月 19 08:17:46 SV-SATURN systemd[1]: jenkins.service failed.
12月 19 08:17:46 SV-SATURN polkitd[774]: Unregistered Authentication Agent for unix-process:3549:130
12月 19 08:19:55 SV-SATURN polkitd[774]: Registered Authentication Agent for unix-process:4279:17345
12月 19 08:19:55 SV-SATURN systemd[1]: Starting LSB: Jenkins Automation Server...
-- Subject: Unit jenkins.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--

epelパッケージをインストールしてからyum update

$ sudo yum update
読み込んだプラグイン:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
base                                                                         | 3.6 kB  00:00:00
extras                                                                       | 2.9 kB  00:00:00
jenkins                                                                      | 2.9 kB  00:00:00
updates                                                                      | 2.9 kB  00:00:00
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ jenkins.noarch 0:2.289.3-1.1 を 更新
---> パッケージ jenkins.noarch 0:2.319.1-1.1 を アップデート
--> 依存性の処理をしています: daemonize のパッケージ: jenkins-2.319.1-1.1.noarch
--> 依存性解決を終了しました。
エラー: パッケージ: jenkins-2.319.1-1.1.noarch (jenkins)
             要求: daemonize
 問題を回避するために --skip-broken を用いることができます。
 これらを試行できます: rpm -Va --nofiles --nodigest
$ sudo yum update --skip-broken
読み込んだプラグイン:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ jenkins.noarch 0:2.289.3-1.1 を 更新
---> パッケージ jenkins.noarch 0:2.319.1-1.1 を アップデート
--> 依存性の処理をしています: daemonize のパッケージ: jenkins-2.319.1-1.1.noarch

パッケージは依存関係に問題があるため、飛ばします:
    jenkins-2.319.1-1.1.noarch (jenkins から)
$ sudo yum install jenkins-2.319.1-1.1.noarch
読み込んだプラグイン:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ jenkins.noarch 0:2.289.3-1.1 を 更新
---> パッケージ jenkins.noarch 0:2.319.1-1.1 を アップデート
--> 依存性の処理をしています: daemonize のパッケージ: jenkins-2.319.1-1.1.noarch
--> 依存性解決を終了しました。
エラー: パッケージ: jenkins-2.319.1-1.1.noarch (jenkins)
             要求: daemonize
 問題を回避するために --skip-broken を用いることができます。
 これらを試行できます: rpm -Va --nofiles --nodigest
yum install epel-release
$ sudo yum install epel-release
読み込んだプラグイン:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ epel-release.noarch 0:7-11 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

====================================================================================================
 Package                     アーキテクチャー      バージョン           リポジトリー           容量
====================================================================================================
インストール中:
 epel-release                noarch                7-11                 extras                 15 k

トランザクションの要約
====================================================================================================
インストール  1 パッケージ

総ダウンロード容量: 15 k
インストール容量: 24 k
Is this ok [y/d/N]: y
Downloading packages:
epel-release-7-11.noarch.rpm                                                 |  15 kB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  インストール中          : epel-release-7-11.noarch                                            1/1
  検証中                  : epel-release-7-11.noarch                                            1/1

インストール:
  epel-release.noarch 0:7-11

完了しました!
$ sudo yum update
読み込んだプラグイン:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: mirrors.nipa.cloud
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ epel-release.noarch 0:7-11 を 更新
---> パッケージ epel-release.noarch 0:7-14 を アップデート
---> パッケージ jenkins.noarch 0:2.289.3-1.1 を 更新
---> パッケージ jenkins.noarch 0:2.319.1-1.1 を アップデート
--> 依存性の処理をしています: daemonize のパッケージ: jenkins-2.319.1-1.1.noarch
--> トランザクションの確認を実行しています。
---> パッケージ daemonize.x86_64 0:1.7.7-1.el7 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

====================================================================================================
 Package                   アーキテクチャー    バージョン                リポジトリー          容量
====================================================================================================
更新します:
 epel-release              noarch              7-14                      epel                  15 k
 jenkins                   noarch              2.319.1-1.1               jenkins               69 M
依存性関連でのインストールをします:
 daemonize                 x86_64              1.7.7-1.el7               epel                  21 k

トランザクションの要約
====================================================================================================
インストール               ( 1 個の依存関係のパッケージ)
更新          2 パッケージ

総ダウンロード容量: 69 M
Is this ok [y/d/N]: y
Downloading packages:
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
警告: /var/cache/yum/x86_64/7/epel/packages/daemonize-1.7.7-1.el7.x86_64.rpm: ヘッダー V3 RSA/SHA256 Signature、鍵 ID 352c64e5: NOKEY
daemonize-1.7.7-1.el7.x86_64.rpm の公開鍵がインストールされていません
(1/3): daemonize-1.7.7-1.el7.x86_64.rpm                                      |  21 kB  00:00:00
(2/3): epel-release-7-14.noarch.rpm                                          |  15 kB  00:00:00
(3/3): jenkins-2.319.1-1.1.noarch.rpm                                        |  69 MB  00:00:08
----------------------------------------------------------------------------------------------------
合計                                                                7.8 MB/s |  69 MB  00:00:08
file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 から鍵を取得中です。
Importing GPG key 0x352C64E5:
 Userid     : "Fedora EPEL (7) <epel@fedoraproject.org>"
 Fingerprint: 91e9 7d7c 4a5e 96f1 7f3e 888f 6a2f aea2 352c 64e5
 Package    : epel-release-7-11.noarch (@extras)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
上記の処理を行います。よろしいでしょうか? [y/N]y
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  インストール中          : daemonize-1.7.7-1.el7.x86_64                                        1/5
  更新します              : jenkins-2.319.1-1.1.noarch                                          2/5
  更新します              : epel-release-7-14.noarch                                            3/5
  整理中                  : jenkins-2.289.3-1.1.noarch                                          4/5
  整理中                  : epel-release-7-11.noarch                                            5/5
  検証中                  : epel-release-7-14.noarch                                            1/5
  検証中                  : daemonize-1.7.7-1.el7.x86_64                                        2/5
  検証中                  : jenkins-2.319.1-1.1.noarch                                          3/5
  検証中                  : jenkins-2.289.3-1.1.noarch                                          4/5
  検証中                  : epel-release-7-11.noarch                                            5/5

依存性関連をインストールしました:
  daemonize.x86_64 0:1.7.7-1.el7

更新:
  epel-release.noarch 0:7-14                      jenkins.noarch 0:2.319.1-1.1

完了しました!
systemctl restart jenkins
systemctl status jenkins
$ sudo systemctl restart jenkins
$ sudo systemctl status jenkins
● jenkins.service - LSB: Jenkins Automation Server
   Loaded: loaded (/etc/rc.d/init.d/jenkins; bad; vendor preset: disabled)
   Active: active (running) since 月 2021-12-20 20:27:50 JST; 7s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 13388 ExecStop=/etc/rc.d/init.d/jenkins stop (code=exited, status=0/SUCCESS)
  Process: 13400 ExecStart=/etc/rc.d/init.d/jenkins start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/jenkins.service
           tq3560 runuser -s /bin/bash jenkins -c ulimit -S -c 0 >/dev/null 2>&1 ; /etc/alternati...
           tq3561 bash -c ulimit -S -c 0 >/dev/null 2>&1 ; /etc/alternatives/java -Djava.awt.head...
           mq3562 /etc/alternatives/java -Djava.awt.headless=true -DJENKINS_HOME=/var/lib/jenkins...

1220 20:27:49 SV-SATURN systemd[1]: Stopped LSB: Jenkins Automation Server.
1220 20:27:49 SV-SATURN systemd[1]: Starting LSB: Jenkins Automation Server...
1220 20:27:50 SV-SATURN jenkins[13400]: Starting Jenkins [  OK  ]
1220 20:27:50 SV-SATURN systemd[1]: Started LSB: Jenkins Automation Server.

手順⑥:Jenkinsの管理画面でバージョンを確認

手順⑦:警告メッセージの確認

以下の警告メッセージが表示されていました。

The word "master" is being retired as the term for the main Jenkins process and the built-in node. The main process is now called "controller" and the built-in node is called just "built-in node". The UI has been updated with these changes. The following features are also affected:
The implicit label of the built-in node changes from master to built-in.
The built-in node's NODE_NAME environment variable also changes from master to built-in.
These changes could affect build behavior, so are not applied automatically. Before you apply these changes, you should do the following:
Review label assignments in job configurations and tool installers for uses of master label. Any such label assignments will not match the built-in node after migration. Besides updating these assignments, you could also explicitly add the master label to the built-in node.
Review use of the NODE_NAME environment variable in build scripts.

 

「マスター」という言葉は、メインのJenkinsプロセスと組み込みノードの用語として廃止されています。現在、メインプロセスは「コントローラー」と呼ばれ、組み込みノードは単に「組み込みノード」と呼ばれています。UIは、これらの変更で更新されました。次の機能も影響を受けます。
組み込みノードの暗黙的なラベルがからmasterに変わりますbuilt-in。
組み込みノードのNODE_NAME環境変数もからmasterに変更されbuilt-inます。
これらの変更はビルドの動作に影響を与える可能性があるため、自動的には適用されません。これらの変更を適用する前に、次のことを行う必要があります。
ラベルの使用については、ジョブ構成およびツールインストーラーでのラベル割り当てを確認してくださいmaster。このようなラベルの割り当ては、移行後に組み込みノードと一致しません。これらの割り当てを更新するだけでなくmaster、組み込みノードにラベルを明示的に追加することもできます。
NODE_NAMEビルドスクリプトでの環境変数の使用を確認します。

  

Java 11 is the recommended version to run Jenkins on; please consider upgrading.

  

Java 11は、Jenkinsを実行するための推奨バージョンです。アップグレードを検討してください。

 

Warnings have been published for the following currently installed components: Git plugin 4.7.2 Stored XSS vulnerability

 

現在インストールされている次のコンポーネントについて、警告が公開されています。 Gitプラグイン4.7.2 保存されたXSS脆弱性

まとめ

Jenkinsのバージョンアップの手順を紹介しました。新しいwarファイルをダウンロードして置き換えるだけなので、簡単でした。

[改訂第3版]Jenkins実践入門
ビルド・テスト・デプロイを自動化する技術
WEB+DB PRESS plus

インフラエンジニアの勉強ができるオンライン学習サイト

Udemy (オンライン動画学習サイト)

Udemy(ユーデミー)は、オンラインで動画で学習できるサービスです。
ITエンジニア系の講座もたくさん公開されています。

≫Udemy 世界最大級のオンライン学習サイト

Udemyの特徴
  • ユーザー登録すれば、第1回の講座は無料で視聴できる
  • 無料のコンテンツもある
  • 過去に受講した人の人数や、受講した人の評価も表示されるので選びやすい

≫Udemy 世界最大級のオンライン学習サイト

開発の人気オンラインコース