Skip to content

Commit 2fba30d

Browse files
authored
Merge pull request #91 from PLUS-POSTECH/windows-ci-support-1803
Support Windows CI
2 parents d5a6efb + 7c7adc9 commit 2fba30d

File tree

9 files changed

+104
-81
lines changed

9 files changed

+104
-81
lines changed

azure-pipelines.yml

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,21 @@ jobs:
2626
pool:
2727
vmImage: 'ubuntu-16.04'
2828
steps:
29-
- template: ci/rust-install.yml
29+
- template: ci/install-prerequisites.yml
30+
parameters:
31+
os: Linux
32+
- template: ci/build.yml
3033
parameters:
3134
os: Linux
32-
- template: ci/rust-build.yml
3335

3436
- job: windows_build
3537
displayName: Windows Build
3638
pool:
37-
vmImage: 'vs2017-win2016'
38-
variables:
39-
windowsCI: true
39+
vmImage: 'win1803'
4040
steps:
41-
- template: ci/rust-install.yml
41+
- template: ci/install-prerequisites.yml
42+
parameters:
43+
os: Windows
44+
- template: ci/build.yml
4245
parameters:
4346
os: Windows
44-
- template: ci/rust-build.yml

ci/build.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
steps:
2+
- script: cargo build
3+
displayName: 'Build'
4+
5+
- ${{ if eq(parameters.os, 'Windows') }}:
6+
- script: |
7+
START /B .ci\dockerd.exe --experimental
8+
cargo test
9+
displayName: 'Test'
10+
11+
- ${{ if ne(parameters.os, 'Windows') }}:
12+
- script: cargo test
13+
displayName: 'Test'

ci/install-lcow.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
steps:
2+
- powershell: |
3+
mkdir .ci
4+
$lcow = ".ci\lcow.zip"
5+
$dockerd = ".ci\dockerd.exe"
6+
7+
wget.exe -nv https://master.dockerproject.org/windows/x86_64/dockerd.exe -O "$dockerd"
8+
wget.exe -nv https://github.com/linuxkit/lcow/releases/download/v4.14.35-v0.3.9/release.zip -O "$lcow"
9+
10+
Stop-Service "Docker"
11+
Expand-Archive "$lcow" -DestinationPath "$Env:ProgramFiles\Linux Containers\."
12+
rm "$lcow"
13+
displayName: 'Install LCOW'
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11
steps:
22
- ${{ if eq(parameters.os, 'Windows') }}:
3+
- script: |
4+
choco install wget visualstudio2017-workload-vctools -y --no-progress
5+
displayName: Install VC 2017 Build Tools
36
- script: |
47
curl -sSf -o rustup-init.exe https://win.rustup.rs
58
rustup-init.exe -y --default-toolchain stable
69
set PATH=%PATH%;%USERPROFILE%\.cargo\bin
710
echo "##vso[task.setvariable variable=PATH]%PATH%"
8-
displayName: Install Rust
11+
displayName: Install Rust Toolchain
12+
- template: install-lcow.yml
913

1014
- ${{ if ne(parameters.os, 'Windows') }}:
1115
- script: |
1216
curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain stable
1317
export PATH=$PATH:$HOME/.cargo/bin
1418
echo "##vso[task.setvariable variable=PATH]$PATH"
15-
displayName: Install Rust
19+
displayName: Install Rust Toolchain

ci/rust-build.yml

Lines changed: 0 additions & 5 deletions
This file was deleted.

src/docker.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,17 @@ use crate::{Environment, Printer, VERSION};
1919
pub const LABEL_KEY_VERSION: &'static str = "soma.version";
2020
pub const LABEL_KEY_USERNAME: &'static str = "soma.username";
2121
pub const LABEL_KEY_REPOSITORY: &'static str = "soma.repository";
22+
pub const DEFAULT_SOCKET: &'static str = "unix:///var/run/docker.sock";
23+
pub const DEFAULT_NAMED_PIPE: &'static str = "npipe:////./pipe/docker_engine";
2224

2325
#[cfg(windows)]
2426
pub fn connect_default() -> SomaResult<Docker<impl Connect>> {
25-
Docker::connect_with_named_pipe_defaults()
27+
Docker::connect_with_named_pipe(DEFAULT_NAMED_PIPE, 600)
2628
}
2729

2830
#[cfg(unix)]
2931
pub fn connect_default() -> SomaResult<Docker<impl Connect>> {
30-
Docker::connect_with_unix_defaults()
32+
Docker::connect_with_unix(DEFAULT_SOCKET, 600)
3133
}
3234

3335
#[derive(Clone, Copy, Debug)]
@@ -289,7 +291,7 @@ pub fn create<'a>(
289291
port_bindings.insert(
290292
"1337/tcp",
291293
vec![PortBinding {
292-
host_ip: "0.0.0.0",
294+
host_ip: "",
293295
host_port: port_str,
294296
}],
295297
);

templates/binary/Dockerfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ RUN useradd -m $PROB
1313

1414
{{ #each executable }}
1515
COPY "{{ path }}" "{{ target_path }}"
16-
RUN chmod +x "{{ target_path }}"
16+
RUN chmod 550 "{{ target_path }}"
1717
{{ /each }}
1818

1919
{{ #each readonly }}
2020
COPY "{{ path }}" "{{ target_path }}"
21-
RUN chmod -w "{{ target_path }}"
21+
RUN chmod 440 "{{ target_path }}"
2222
{{ /each }}
2323

2424
RUN chown -R root:$PROB /home/$PROB

tests/build_clean.rs

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,30 +8,27 @@ mod common;
88

99
#[test]
1010
fn test_build_clean() {
11-
// disabled for Windows CI
12-
if option_env!("WINDOWSCI").is_none() {
13-
let (_, mut data_dir) = temp_data_dir();
14-
let mut env = test_env(&mut data_dir);
11+
let (_, mut data_dir) = temp_data_dir();
12+
let mut env = test_env(&mut data_dir);
1513

16-
let repo_name = "test-simple-bof";
17-
let image_name = docker::image_name(repo_name);
18-
let mut runtime = default_runtime();
14+
let repo_name = "test-simple-bof";
15+
let image_name = docker::image_name(repo_name);
16+
let mut runtime = default_runtime();
1917

20-
assert!(add(
21-
&mut env,
22-
"https://github.com/PLUS-POSTECH/simple-bof.git",
23-
Some(repo_name),
24-
)
25-
.is_ok());
18+
assert!(add(
19+
&mut env,
20+
"https://github.com/PLUS-POSTECH/simple-bof.git",
21+
Some(repo_name),
22+
)
23+
.is_ok());
2624

27-
assert!(build(&env, repo_name, &mut runtime).is_ok());
28-
let images = runtime.block_on(docker::list_images(&env)).unwrap();
29-
assert!(image_exists(&images, &image_name));
30-
assert!(image_from_repo_exists(&images, repo_name));
25+
assert!(build(&env, repo_name, &mut runtime).is_ok());
26+
let images = runtime.block_on(docker::list_images(&env)).unwrap();
27+
assert!(image_exists(&images, &image_name));
28+
assert!(image_from_repo_exists(&images, repo_name));
3129

32-
assert!(clean(&env, repo_name, &mut runtime).is_ok());
33-
let images = runtime.block_on(docker::list_images(&env)).unwrap();
34-
assert!(!image_exists(&images, &image_name));
35-
assert!(!image_from_repo_exists(&images, repo_name));
36-
}
30+
assert!(clean(&env, repo_name, &mut runtime).is_ok());
31+
let images = runtime.block_on(docker::list_images(&env)).unwrap();
32+
assert!(!image_exists(&images, &image_name));
33+
assert!(!image_from_repo_exists(&images, repo_name));
3734
}

tests/run_stop.rs

Lines changed: 37 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -10,44 +10,41 @@ mod common;
1010

1111
#[test]
1212
fn test_run_stop() {
13-
// disabled for Windows CI
14-
if option_env!("WINDOWSCI").is_none() {
15-
let (_, mut data_dir) = temp_data_dir();
16-
let mut env = test_env(&mut data_dir);
17-
18-
let repo_name = "test-simple-bof";
19-
let image_name = docker::image_name(repo_name);
20-
let mut runtime = default_runtime();
21-
22-
assert!(add(
23-
&mut env,
24-
"https://github.com/PLUS-POSTECH/simple-bof.git",
25-
Some(repo_name),
26-
)
27-
.is_ok());
28-
29-
assert!(build(&env, repo_name, &mut runtime).is_ok());
30-
let images = runtime.block_on(docker::list_images(&env)).unwrap();
31-
assert!(image_exists(&images, &image_name));
32-
assert!(image_from_repo_exists(&images, repo_name));
33-
34-
let container_id = run(&env, repo_name, 31337, &mut runtime).unwrap();
35-
let containers = runtime.block_on(docker::list_containers(&env)).unwrap();
36-
assert!(container_exists(&containers, &container_id));
37-
assert!(container_from_repo_exists(&containers, repo_name));
38-
39-
// Problem container should be running exclusively
40-
assert!(run(&env, repo_name, 31337, &mut runtime).is_err());
41-
42-
// Cleanup
43-
assert!(stop(&env, repo_name, &mut runtime).is_ok());
44-
let containers = runtime.block_on(docker::list_containers(&env)).unwrap();
45-
assert!(!container_exists(&containers, &container_id));
46-
assert!(!container_from_repo_exists(&containers, repo_name));
47-
48-
assert!(clean(&env, repo_name, &mut runtime).is_ok());
49-
let images = runtime.block_on(docker::list_images(&env)).unwrap();
50-
assert!(!image_exists(&images, &image_name));
51-
assert!(!image_from_repo_exists(&images, repo_name));
52-
}
13+
let (_, mut data_dir) = temp_data_dir();
14+
let mut env = test_env(&mut data_dir);
15+
16+
let repo_name = "test-simple-bof";
17+
let image_name = docker::image_name(repo_name);
18+
let mut runtime = default_runtime();
19+
20+
assert!(add(
21+
&mut env,
22+
"https://github.com/PLUS-POSTECH/simple-bof.git",
23+
Some(repo_name),
24+
)
25+
.is_ok());
26+
27+
assert!(build(&env, repo_name, &mut runtime).is_ok());
28+
let images = runtime.block_on(docker::list_images(&env)).unwrap();
29+
assert!(image_exists(&images, &image_name));
30+
assert!(image_from_repo_exists(&images, repo_name));
31+
32+
let container_id = run(&env, repo_name, 31337, &mut runtime).unwrap();
33+
let containers = runtime.block_on(docker::list_containers(&env)).unwrap();
34+
assert!(container_exists(&containers, &container_id));
35+
assert!(container_from_repo_exists(&containers, repo_name));
36+
37+
// Problem container should be running exclusively
38+
assert!(run(&env, repo_name, 31337, &mut runtime).is_err());
39+
40+
// Cleanup
41+
assert!(stop(&env, repo_name, &mut runtime).is_ok());
42+
let containers = runtime.block_on(docker::list_containers(&env)).unwrap();
43+
assert!(!container_exists(&containers, &container_id));
44+
assert!(!container_from_repo_exists(&containers, repo_name));
45+
46+
assert!(clean(&env, repo_name, &mut runtime).is_ok());
47+
let images = runtime.block_on(docker::list_images(&env)).unwrap();
48+
assert!(!image_exists(&images, &image_name));
49+
assert!(!image_from_repo_exists(&images, repo_name));
5350
}

0 commit comments

Comments
 (0)